CentOS7 RHEL7 的设置
此示例假设有两个服务器:
- dbserver(我们的数据库所在的位置)
- appclient(我们的应用程序所在的位置)
FWIW,两台服务器都是 SELinux 强制执行的。
首先,登录到 dbserver
创建用于创建证书的临时目录。
mkdir /root/certs/mysql/ && cd /root/certs/mysql/
创建服务器证书
openssl genrsa 2048 > ca-key.pem
openssl req -sha1 -new -x509 -nodes -days 3650 -key ca-key.pem > ca-cert.pem
openssl req -sha1 -newkey rsa:2048 -days 730 -nodes -keyout server-key.pem > server-req.pem
openssl rsa -in server-key.pem -out server-key.pem
openssl x509 -sha1 -req -in server-req.pem -days 730 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > server-cert.pem
将服务器证书移动到/ etc / pki / tls / certs / mysql /
目录路径采用 CentOS 或 RHEL(根据其他发行版的需要进行调整):
mkdir /etc/pki/tls/certs/mysql/
务必设置文件夹和文件的权限。mysql 需要完全所有权和访问权限。
chown -R mysql:mysql /etc/pki/tls/certs/mysql
现在配置 MySQL / MariaDB
# vi /etc/my.cnf
# i
[mysqld]
bind-address=*
ssl-ca=/etc/pki/tls/certs/ca-cert.pem
ssl-cert=/etc/pki/tls/certs/server-cert.pem
ssl-key=/etc/pki/tls/certs/server-key.pem
# :wq
然后
systemctl restart mariadb
不要忘记打开防火墙以允许来自 appclient 的连接(使用 IP 1.2.3.4)
firewall-cmd --zone=drop --permanent --add-rich-rule 'rule family="ipv4" source address="1.2.3.4" service name="mysql" accept'
# I force everything to the drop zone. Season the above command to taste.
现在重启 firewalld
service firewalld restart
接下来,登录到 dbserver 的 mysql 服务器:
mysql -uroot -p
发出以下命令为客户端创建用户。请注意 GRANT 语句中的 REQUIRE SSL。
GRANT ALL PRIVILEGES ON *.* TO ‘iamsecure’@’appclient’ IDENTIFIED BY ‘dingdingding’ REQUIRE SSL;
FLUSH PRIVILEGES;
# quit mysql
从第一步开始,你仍然应该在/ root / certs / mysql 中。如果没有,请回到它以获取以下命令之一。
创建客户端证书
openssl req -sha1 -newkey rsa:2048 -days 730 -nodes -keyout client-key.pem > client-req.pem
openssl rsa -in client-key.pem -out client-key.pem
openssl x509 -sha1 -req -in client-req.pem -days 730 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > client-cert.pem
注意 :我对服务器和客户端证书使用了相同的通用名称。因人而异。
确保你仍然是/ root / certs / mysql /用于下一个命令
将服务器和客户端 CA 证书合并到一个文件中:
cat server-cert.pem client-cert.pem > ca.pem
确保你看到两个证书:
cat ca.pem
现在结束服务器端工作
打开另一个终端和
ssh appclient
和以前一样,为客户端证书创建一个永久的主页
mkdir /etc/pki/tls/certs/mysql/
现在,将客户端证书(在 dbserver 上创建)放在 appclient 上。你可以将它们 scp,或者只是逐个复制和粘贴文件。
scp dbserver
# copy files from dbserver to appclient
# exit scp
同样,请务必设置文件夹和文件的权限。mysql 需要完全所有权和访问权限。
chown -R mysql:mysql /etc/pki/tls/certs/mysql
你应该有三个文件,每个文件都由用户 mysql 拥有:
/etc/pki/tls/certs/mysql/ca.pem
/etc/pki/tls/certs/mysql/client-cert.pem
/etc/pki/tls/certs/mysql/client-key.pem
现在在 [client]
部分编辑 appclient 的 MariaDB / MySQL 配置。
vi /etc/my.cnf
# i
[client]
ssl-ca=/etc/pki/tls/certs/mysql/ca.pem
ssl-cert=/etc/pki/tls/certs/mysql/client-cert.pem
ssl-key=/etc/pki/tls/certs/mysql/client-key.pem
# :wq
重启 appclient 的 mariadb 服务:
systemctl restart mariadb
仍在客户端
这应该返回:ssl TRUE
mysql --ssl --help
现在,登录 appclient 的 mysql 实例
mysql -uroot -p
应该在下面的两个变量中都看到 YES
show variables LIKE '%ssl';
have_openssl YES
have_ssl YES
最初我看到了
have_openssl NO
快速浏览 mariadb.log 后发现:
SSL 错误:无法从’/etc/pki/tls/certs/mysql/client-cert.pem’获取证书
问题是 root 拥有的 client-cert.pem 和包含文件夹。解决方案是将/ etc / pki / tls / certs / mysql /的所有权设置为 mysql。
chown -R mysql:mysql /etc/pki/tls/certs/mysql
如果需要,从上面的步骤重新启动 mariadb
现在我们准备测试安全连接
我们仍然在这里 appclient
尝试使用上面创建的帐户连接到 dbserver 的 mysql 实例。
mysql -h dbserver -u iamsecure -p
# enter password dingdingding (hopefully you changed that to something else)
运气不错,你应该没有错误地登录。
要确认你已启用 SSL,请从 MariaDB / MySQL 提示符处发出以下命令:
\s
这是一个反斜杠,又名状态
这将显示你的连接状态,它应如下所示:
Connection id: 4
Current database:
Current user: iamsecure@appclient
SSL: Cipher in use is DHE-RSA-AES256-GCM-SHA384
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server: MariaDB
Server version: 5.X.X-MariaDB MariaDB Server
Protocol version: 10
Connection: dbserver via TCP/IP
Server characterset: latin1
Db characterset: latin1
Client characterset: utf8
Conn. characterset: utf8
TCP port: 3306
Uptime: 42 min 13 sec
如果你在连接尝试中获得权限被拒绝错误,请检查上面的 GRANT 语句,以确保没有任何流浪字符或’标记。
如果你有 SSL 错误,请返回本指南以确保步骤有序。
这适用于 RHEL7,也可能适用于 CentOS7。无法确认这些确切步骤是否适用于其他地方。
希望这可以节省其他人一点时间和恶化。