mysql使用ssl连接

查询MySQL状态

mysql> select version(); 
+-----------+ 
| version() | 
+-----------+ 
| 5.6.36    | 
+-----------+ 

mysql> show variables like 'have%ssl%'; 
+---------------+----------+ 
| Variable_name | Value    | 
+---------------+----------+ 
| have_openssl  | DISABLED | 
| have_ssl      | DISABLED | 
+---------------+----------+ 

mysql> show variables like 'port'; 
+---------------+-------+ 
| Variable_name | Value | 
+---------------+-------+ 
| port          | 3306  | 
+---------------+-------+ 

mysql> show variables like 'datadir'; 
+---------------+-------------------+ 
| Variable_name | Value            | 
+---------------+-------------------+ 
| datadir      | /data/mysql_data/ | 
+---------------+-------------------+ 

MySQL 5.6使用SSL加密连接实战

  1. 背景
  • 在生产环境下,安全总是无法忽视的问题,数据库安全则是重中之重,因为所有的数据都存放在数据库中
  • 当使用非加密方式连接MySQL数据库时,在网络中传输的所有信息都是明文的,可以被网络中所有人截取,敏感信息可能被泄露。在传送敏感信息(如密码)时,可以采用SSL连接的方式。
  1. MySQL 连接方式
  • socket连接
  • TCP非SSL连接
  • SSL安全连接
  1. SSL 简介
  • SSL指的是SSL/TLS,其是一种为了在计算机网络进行安全通信的加密协议。假设用户的传输不是通过SSL的方式,那么其在网络中以明文的方式进行传输,而这给别有用心的人带来了可乘之机。所以,现在很多网站其实默认已经开启了SSL功能,比如Facebook、Twtter、YouTube、淘宝等。
  1. 环境 [ 关闭SeLinux ]
  • system 环境
    [root@MySQL ~]# cat /etc/RedHat-release
    CentOS release 6.9 (Final)

通过openssl 制作生成 SSL 证书

  1. 生成一个 CA 私钥
    openssl genrsa 2048 > ca-key.pem

  2. 通过 CA 私钥生成数字证书
    openssl req -new -x509 -nodes -days 3600

  3. 创建 MySQL 服务器 私钥和请求证书
    openssl req -newkey rsa:2048 -days 3600 -nodes -keyout server-key.pem -out server-req.pem

  4. 将生成的私钥转换为 RSA 私钥文件格式
    openssl rsa -in server-key.pem -out server-key.pem

  5. 用CA 证书来生成一个服务器端的数字证书
    openssl x509 -req -in server-req.pem -days 3600 -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem

  6. 创建客户端的 RSA 私钥和数字证书
    openssl req -newkey rsa:2048 -days 3600 -nodes -keyout client-key.pem -out client-req.pem

  7. 将生成的私钥转换为 RSA 私钥文件格式
    openssl rsa -in client-key.pem -out client-key.pem

  8. 用CA 证书来生成一个客户端的数字证书
    openssl x509 -req -in client-req.pem -days 3600 -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out client-cert.pem

  9. 查看所有生成的SSL文件
    ls -l *.pem

-rw-r--r-- 1 root root 1675 Jun 24 14:16 ca-key.pem 
-rw-r--r-- 1 root root 1220 Jun 24 14:19 ca.pem 
-rw-r--r-- 1 root root 1090 Jun 24 14:29 client-cert.pem 
-rw-r--r-- 1 root root 1679 Jun 24 14:28 client-key.pem 
-rw-r--r-- 1 root root  952 Jun 24 14:28 client-req.pem 
-rw-r--r-- 1 root root 1090 Jun 24 14:24 server-cert.pem 
-rw-r--r-- 1 root root 1679 Jun 24 14:23 server-key.pem 
-rw-r--r-- 1 root root  952 Jun 24 14:20 server-req.pem

MySQL 配置 SSL

  • 复制 CA 证书和服务端SSL文件至MySQL 数据目录

  • 即用show variables like 'datadir';查出来目录所在地方
    cp ca.pem server-*.pem /data/mysql_data -v

  • 修改 MySQL 数据目录的CA 证书和服务端 SSL 文件所属用户与组
    chown -v mysql.mysql /data/mysql_data/{ca,server*}.pem

  • 配置 MySQL 服务的配置文件 [/etc/my.cnf],添加以下信息

    [mysqld] 
    ssl-ca=/data/mysql_data/ca.pem 
    ssl-cert=/data/mysql_data/server-cert.pem 
    ssl-key=/data/mysql_data/server-key.pem
  • 重启MySQL服务
    /etc/init.d/mysqld restart

  • 登陆查看SSL开启状态
    have_openssl 与 have_ssl 值都为YES表示ssl开启成功
    show variables like 'have%ssl%';

SSL连接测试

  • 创建用户并指定 SSL 连接
    grant all on *.* to 'ssl_test'@'%' identified by '123' require SSL;
    Query OK, 0 rows affected (0.00 sec)

    • 通过密码连接测试
      mysql -h 192.168.60.129 -ussl_test -p'123'

      Warning: Using a password on the command line interface can be insecure.
      ERROR 1045 (28000): Access denied for user ‘ssl_test’@‘192.168.60.129’ (using password: YES)

    • 通过客户端密钥与证书SSL + 密码连接测试
      mysql -h 192.168.60.129 -ussl_test --ssl-cert=client-cert.pem --ssl-key=client-key.pem

MySQL5.7 linux系统配置ssl和ssl方式登录

安装MySQL5.7

  1. 安装 MySQL

最新稳定的MySQL版本是5.7,所以这是我们将在本教程中安装和配置的版本。该包是您需要添加的第一件事,它在MySQL存储库中可用。 执行以下命令开始:
yum localinstall -y https://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm

  1. 该命令将添加可以用于安装数据库系统的MySQL存储库:

yum install -y mysql-community-server

  1. 在安装过程结束时,使用systemd工具启动MySQL:

systemctl start mysqld

  1. 检查MySQL状态:

mysqld.service - MySQL Server

  1. MySQL可以通过执行netstat工具看到3306端口,

netstat -plntu | grep mysql

MySQL配置SSL

在MySQL服务器的初始启动时,将创建一个超级用户帐户(‘root’@'localhost),并将默认密码设置并存储在错误日志文件中。 通过执行以下命令显示此密码:
grep 'temporary password' /var/log/mysqld.log

[Note] A temporary password is generated for root@localhost: en>_g6syXIXq

  1. 第一步是更改root密码。

登录到MySQL shell:mysql -u root -p

输入使用上一个命令显示的自动生成的密码。

接下来,使用以下查询更改密码:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'RootStrongPassword1!';

刷新权限并退出:FLUSH PRIVILEGES;,EXIT;

  1. 为MySQL启用SSL

默认情况下,MySQL有自己的SSL证书,存储在/var/lib/mysql中。

注意:在生产中,始终使用更安全和“personal”的证书。

从MySQL shell检查SSL:SHOW GLOBAL VARIABLES LIKE '%ssl%';

+---------------+-----------------+
| Variable_name | Value           |
+---------------+-----------------+
| have_openssl  | YES             |
| have_ssl      | YES             |
| ssl_ca        | ca.pem          |
| ssl_capath    |                 |
| ssl_cert      | server-cert.pem |
| ssl_cipher    |                 |
| ssl_crl       |                 |
| ssl_crlpath   |                 |
| ssl_key       | server-key.pem  |
+---------------+-----------------+
  1. 检查SSL状态
    STATUS;
  ···
  SSL: Not in use
  ···

如您所见,SSL没有被使用。 所以,下一步是启用它。

  1. 在MySQL配置文件中启用SSL

    编辑MySQL配置文件:vi /etc/my.cnf

    在[mysqld]部分,粘贴以下内容,保存并重启systemctl restart mysqld

ssl-ca=/var/lib/mysql/ca.pem
ssl-cert=/var/lib/mysql/server-cert.pem
ssl-key=/var/lib/mysql/server-key.pem
  1. 再次检查MySQL shell中的SSL状态。
    STATUS;
···
SSL: Not in use
···
  1. 启用客户端

此时尚未使用SSL。 这是因为我们需要通过SSL强制所有的客户端连接。 所以,退出MySQL shell并再次编辑

在文件末尾粘贴以下内容:

[client]
ssl-ca=/var/lib/mysql/ca.pem
ssl-cert=/var/lib/mysql/client-cert.pem
ssl-key=/var/lib/mysql/client-key.pem

再次保存,退出并重新启动MySQL:systemctl restart mysqld

检查MySQL状态如上所述:STATUS;

···
SSL:            Cipher in use is DHE-RSA-AES256-SHA
···
  1. 启用远程连接

本教程的最后一步是启用远程连接。 每个系统管理员都知道,只允许经过验证的客户端是至关重要的。

编辑MySQL配置文件:
vi /etc/my.cnf

在[mysqld]部分的末尾粘贴以下行:

bind-address = *
require_secure_transport = ON

保存,退出并重启MySQL:systemctl restart mysqld

  1. 为远程连接创建新用户

此时,SSL和远程连接已启用。 接下来要做的是创建一个新的MySQL用户:
mysql -u root -p

创建一个新用户:

mysql> CREATE USER 'gmolica'@'%' IDENTIFIED BY 'Unixmen1!' REQUIRE X509;
mysql> GRANT ALL PRIVILEGES ON . TO 'gmolica'@'%' IDENTIFIED BY 'Unixmen1!' REQUIRE X509;
mysql> FLUSH PRIVILEGES;
mysql> EXIT;

参考1

参考2

客户端连接

最好使用远程连接进行测试,localhost或者-S unix socket连接,这种有可能不会用ssl
mysql -uroot -h 192.168.31.84 -p

或者查看状态Ssl_cipher也可以,Value不为空,表明客户端连接启用ssl
mysql> show status like 'ssl_cipher';                                                                                                                
+---------------+--------------------+
| Variable_name | Value              |
+---------------+--------------------+
| Ssl_cipher    | DHE-RSA-AES256-SHA |
+---------------+--------------------+

如果客户不想使用ssl连接,可以在mysql连接参数中使用-ssl=0来禁用ssl连接,执行效果请自行使用status查看
bin/mysql -uroot  -h 192.168.31.84 --ssl=0 -p

创建必须使用ssl登录的用户

如果服务器不强制要求用户使用ssl连接,则用户可以使用普通方式,也可以使用ssl方式连接服务器。某些安全场合,可以限制用户必须ssl登录。

创建ssltest测试用户,密码为foodsafe,必须ssl登录
GRANT ALL PRIVILEGES ON *.* TO 'ssltest'@'%' IDENTIFIED BY 'foodsafe' REQUIRE SSL;
FLUSH PRIVILEGES;

测试
[root@vtfsdb1 mysql01]# bin/mysql -u ssltest -h 192.168.31.84 --ssl=0 -p
Enter password: 
ERROR 1045 (28000): Access denied for user 'ssltest'@'192.168.31.84' (using password: YES)
如果不使用ssl登录,尽管密码正确,也会提示Access denied。1234567891011

系统用户表user与ssl

系统权限表mysql.user中,表现为ssl_type有值,如果不要求则为空。

修改用户不需要ssl
alter user 'ssltest'@'%' require none;

查看
select user,ssl_type,ssl_cipher from mysql.user where user='ssltest';
+---------+----------+------------+
| user    | ssl_type | ssl_cipher |
+---------+----------+------------+
| ssltest |          |            |
+---------+----------+------------+

修改用户需要ssl
 alter user 'ssltest'@'%' require ssl;

查看
select user,ssl_type,ssl_cipher from mysql.user where user='ssltest';
+---------+----------+------------+
| user    | ssl_type | ssl_cipher |
+---------+----------+------------+
| ssltest | ANY      |            |
+---------+----------+------------+

修改完成记得flush privileges;

猜你喜欢

转载自blog.csdn.net/lfagon/article/details/83086400
今日推荐