欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

mysql使用ssl连接

程序员文章站 2024-02-27 16:53:57
...

查询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 环境
    [[email protected] ~]# 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 [email protected]: 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;

测试
[[email protected] 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;
相关标签: 连接mysql