如何为CentOS 7上的MySQL启用SSL和远程连接

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服务器。

我们将要做什么:

  1. 安装MySQL
  2. 配置MySQL根密码
  3. 生成新的自签名SSL证书文件。
  4. 为MySQL启用SSL。
  5. 启用远程连接。
  6. 测试。

条件

  • 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服务器。 必须下载客户端的三张证书。

  1. CA证书 - ca.pem
  2. 客户端证书 - client-cert.pem
  3. 客户端密钥 - 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已经成功。

参考

赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏