MySQL是一个开源关系数据库系统,适用于许多操作系统,包括Windows,Linux,MacOS和FreeBSD。 它可能是最流行的OpenSource RDBMS和LAMP和LEMP的中心组件。 有许多应用程序依赖于MySQL,如Wordpress,Joomla,TYPO3,phpBB等等。
在本教程中,我将逐步介绍为安全的远程连接配置MySQL。 当您需要远程访问MySQL时,需要使用VPN,因为MySQL不会对传输的数据进行加密,也可以配置MySQL使用SSL,我将在本教程中向您展示。 在此配置中,只有具有正确SSL证书文件的用户才能连接到MySQL服务器,并且流量被加密。 我们将安装最新版本的MySQL,然后为远程连接配置SSL。 对于基本系统,我将使用CentOS 7服务器。
我们将要做什么:
- 安装MySQL
- 配置MySQL根密码
- 生成新的自签名SSL证书文件。
- 为MySQL启用SSL。
- 启用远程连接。
- 测试。
条件
- CentOS 7服务器
- 根权限
第1步 - 安装MySQL
在本教程中,我们将使用MySQL 5.7,最新版本。 它是从MySQL存储库安装的,所以我们必须先为系统添加一个新的CentOS存储库。
使用下面的yum命令添加新的MySQL存储库。
yum localinstall https://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm
系统会要求您安装新的软件包,键入“ y ”,然后按“ Enter ”确认。
现在你可以这样安装MySQL最新版本5.7到服务器:
yum -y install mysql-community-server
安装完成后,启动MySQL服务,并使用systemctl命令在启动时自动运行。
systemctl start mysqld
systemctl enable mysqld
通过检查MySQL使用的端口(3306)确保MySQL正在运行。 使用下面的netstat命令检查它。
netstat -plntu
MySQL已经从MySQL存储库安装在CentOS 7上。
第2步 - 配置MySQL根密码
默认情况下,MySQL 5.7在第一次启动服务时会为您生成默认的根密码。 密码存储在MySQL日志文件“/var/log/mysqld.log”中。
要查看默认的MySQL root密码,可以使用下面的grep命令。
grep 'temporary' /var/log/mysqld.log
您会看到类似于下面的结果,我的默认密码是' wxtX8Te&Uh1K '。
A temporary password is generated for root@localhost: wxtX8Te&Uh1K
使用默认密码连接到MySQL shell,并用您自己的密码替换密码。
mysql -u root -p
TYPE IN DEFAULT PASSWORD
现在用您自己的密码替换默认密码。 在本教程中,我将使用“ Hakase-labs123 @ ”作为新的MySQL根密码。 在下面运行MySQL查询
ALTER USER 'root'@'localhost' IDENTIFIED BY 'Hakase-labs123@';
flush privileges;
exit;
现在您可以使用新密码“Hakase-labs123 @”重新连接。
mysql -u root -p
TYPE NEW PASSWORD 'Hakase-labs123@'
第3步 - 生成新的自签名证书文件
默认情况下,MySQL 5.7在/ var / lib / mysql目录中有自己的SSL证书文件。 但在本教程中,我将向您展示如何使用OpenSSL生成自己的SSL证书文件,然后使用MySQL配置它们。
在此步骤中,我们将生成新的自签名证书文件。 我们需要3个证书, CA证书,服务器证书和密钥,客户端证书和密钥 。 我们将使用OpenSSL创建它们。
为SSL证书文件'/ etc / certs /'创建一个新目录,并转到该目录。
mkdir -p /etc/certs
cd /etc/certs
生成新的CA证书ca.pem文件。
openssl genrsa 2048 > ca-key.pem
openssl req -new -x509 -nodes -days 3600 -key ca-key.pem -out ca.pem
接下来,我们必须创建服务器端证书。 创建新的服务器证书server-cert.pem和server-key.pem文件。 生成新的证书文件,删除密码并用CA证书签名。
openssl req -newkey rsa:2048 -days 3600 -nodes -keyout server-key.pem -out server-req.pem
openssl rsa -in server-key.pem -out server-key.pem
openssl x509 -req -in server-req.pem -days 3600 -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem
现在为客户端生成证书文件。 MySQL服务器只接受具有这些证书文件的客户端的远程连接。 生成新的客户端证书文件,删除密码,并使用CA证书进行签名。
openssl req -newkey rsa:2048 -days 3600 -nodes -keyout client-key.pem -out client-req.pem
openssl rsa -in client-key.pem -out client-key.pem
openssl x509 -req -in client-req.pem -days 3600 -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out client-cert.pem
注意:
CA证书信息必须与客户端和服务器信息不同。
已经生成了我们为此设置所需的所有证书。 现在我们可以使用下面的命令验证证书文件。
openssl verify -CAfile ca.pem server-cert.pem client-cert.pem
确保没有错误,结果如下。
所有证书文件已经过验证。 将certs目录的所有者更改为“mysql”用户,并更改所有密钥文件的权限。
chown -R mysql:mysql /etc/certs/
chmod 600 client-key.pem server-key.pem ca-key.pem
第4步 - 为MySQL启用SSL
在此步骤中,我们将为MySQL启用SSL。 在我们开始在MySQL上配置和启用SSL之前,我们需要将默认证书文件备份到新的备份目录。
为所有证书创建新的备份目录“ mysql-certs ”。
mkdir -p ~/mysql-certs/
转到'/ var / lib / mysql'目录并将所有默认证书移动到备份目录。
cd /var/lib/mysql/
mv ca.pem ca-key.pem ~/mysql-certs/
mv server-key.pem server-cert.pem ~/mysql-certs/
mv client-key.pem client-cert.pem ~/mysql-certs/
mv private_key.pem public_key.pem ~/mysql-certs/
现在重新启动MySQL服务。
systemctl restart mysqld
接下来,从MySQL shell中检查SSL。 使用新密码登录到mysql:
mysql -u root -p
TYPE NEW PASSWORD 'Hakase-labs123@'
运行下面的查询,以便我们可以看到MySQL的SSL状态。
SHOW GLOBAL VARIABLES LIKE '%ssl%';
STATUS;
您将看到SSL状态为“ DISABLED ”,并且root用户已连接没有SSL 。
接下来,我们将为MySQL启用SSL连接。 我们必须使用vim编辑MySQL配置文件' my.cnf '文件。
vim /etc/my.cnf
在' [mysqld] '部分,粘贴下面的配置。
# Type your own certificates directory
ssl-ca=/etc/certs/ca.pem
ssl-cert=/etc/certs/server-cert.pem
ssl-key=/etc/certs/server-key.pem
保存文件并退出vim,重启MySQL服务。
systemctl restart mysqld
再次登录到MySQL并检查SSL。
mysql -u root -p
TYPE NEW PASSWORD 'Hakase-labs123@'
运行下面的查询以确保SSL段值为“ YES ”。
SHOW VARIABLES LIKE '%ssl%';
STATUS;
您将看到启用了SSL for SSL,但是root用户仍然没有使用SSL连接进行连接。
要强制所有本地用户与SSL连接,请再次编辑mysql配置文件“ my.cnf ”。
vim /etc/my.cnf
将下面的配置粘贴到行尾。
[client]
ssl-ca=/etc/certs/ca.pem
ssl-cert=/etc/certs/client-cert.pem
ssl-key=/etc/certs/client-key.pem
保存并退出,然后重新启动MySQL。
systemctl restart mysqld
再次连接到MySQL并检查连接并启用SSL。
mysql -u root -p
TYPE NEW PASSWORD 'Hakase-labs123@'
SHOW VARIABLES LIKE '%ssl%';
STATUS;
已启用SSL,本地连接也使用SSL。
第5步 - 启用远程连接
在上述步骤中,我们已经为MySQL服务器启用了SSL,本地连接被强制使用SSL。 在这一步中,我们将启用MySQL的远程连接,但是我们允许只有客户端具有由我们的CA签署的证书文件才能连接到MySQL服务器。
使用vim编辑MySQL配置文件。
vim /etc/my.cnf
将下面的配置粘贴到' [mysqld] '部分的末尾。
bind-address = *
require_secure_transport = ON
保存文件退出编辑器,重启MySQL。
systemctl restart mysqld
接下来,为远程连接创建一个新用户。 我将使用密码“ Hakase-labs123 @ ”创建一个名为“ hakase ”的新用户,并将所有权限授予“ hakase ”用户。 ' hakase '用户只能连接证书密钥。
mysql -u root -p
TYPE NEW PASSWORD 'Hakase-labs123@'
create user 'hakase'@'%' identified by 'Hakase-labs123@' REQUIRE X509;
grant all privileges on *.* to 'hakase'@'%' identified by 'Hakase-labs123@' REQUIRE X509;
flush privileges;
已创建用于远程连接的新用户。
注意:
您可能会在mysql查询结果中看到' 1警告 '。 这只是关于使用ALTER USER查询而不是GRANT的警告,因为在下一个版本中将不推荐使用“GRANT”查询。
第6步 - 测试
在本教程的最后一节中,我们将测试名为“hakase”的新用户是否能够使用证书文件远程连接到MySQL服务器。 必须下载客户端的三张证书。
- CA证书 - ca.pem
- 客户端证书 - client-cert.pem
- 客户端密钥 - client-key.pem
我已经登录到另一个Linux系统,并在那里安装了mysql-client包。 然后我下载了所有的客户端证书文件与SCP。 现在我将使用证书文件连接到MySQL服务器。
mysql -h 10.0.15.11 -u hakase \
--ssl-ca=ca.pem \
--ssl-cert=client-cert.pem \
--ssl-key=client-key.pem -p
10.0.15.11 = MySQL服务器的IP地址。
您可以在下面查看此查询的连接状态。
STATUS;
IP地址为10.0.15.10的用户hakase连接到IP地址为 10.0.15.11的MySQL服务器,通过端口3306上的TCP / IP连接并使用SSL 。
当您尝试连接没有证书文件时,您将看到如下错误。
接下来,我将使用我的主机的MySQLWorkbench GUI进行测试。
以下是我的配置 - 设置参数。
SSL配置 - 设置SSL。
并在SSL客户端证书文件的连接结果之下。
一个新的用户使用SSL连接远程成功连接到MySQL数据库服务器。 当用户尝试连接没有证书文件时,结果将被“ 拒绝 ”。 使用SSL连接安装和配置MySQL已经成功。