CentOS7 RHEL7 的设置

此示例假设有两个服务器:

  1. dbserver(我们的数据库所在的位置)
  2. 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。无法确认这些确切步骤是否适用于其他地方。

希望这可以节省其他人一点时间和恶化。