概述

Mysql 8 默认启用SSL安全连接,也可以强制必须启用。建议手动生成自签名证书和key并配置到服务端和客户端路径里,也可以直接使用mysql默认生成的。

前提条件

https://dev.mysql.com/doc/refman/8.4/en/using-encrypted-connections.html#using-encrypted-connections-server-side-startup-configuration

  1. 使用OpenSSL编译的MySQL服务器
  2. 官网mysql安装包已经集成了,支持ssl自签名证书
  3. 自签名证书文件系统自动生成,默认在数据存储目录下
[root@centos7-172-028-002-001 mysql]# ll /var/lib/mysql | grep pem
-rw------- 1 mysql mysql       1680 3月  18 22:03 ca-key.pem
-rw-r--r-- 1 mysql mysql       1108 3月  18 22:03 ca.pem
-rw-r--r-- 1 mysql mysql       1108 3月  18 22:03 client-cert.pem
-rw------- 1 mysql mysql       1676 3月  18 22:03 client-key.pem
-rw------- 1 mysql mysql       1680 3月  18 22:03 private_key.pem
-rw-r--r-- 1 mysql mysql        452 3月  18 22:03 public_key.pem
-rw-r--r-- 1 mysql mysql       1108 3月  18 22:03 server-cert.pem
-rw------- 1 mysql mysql       1680 3月  18 22:03 server-key.pem
  1. 因为是自签名证书,启动日志中会报一条警告信息
[Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.

Mysql 8手动配置SSL安全连接

https://dev.mysql.com/doc/refman/8.4/en/using-encrypted-connections.html#mandatory-encrypted-connections

修改配置文件

[mysqld]
# 强制所有网络连接使用ssl。socket不受限制(默认就是安全状态。如果客户端强制使用SSL连接,允许登录,但会提示建议取消SSL的信息)
require_secure_transport=ON

修改运行参数

进入数据库手动设置正在运行的数据库

SET PERSIST require_secure_transport=ON;
  • 设置成功后,会写入数据目录下的 mysqld-auto.cnf文件
  • mysql重启后会自动读取这个文件,实现持久化修改
cat mysqld-auto.cnf

{"Version": 2, "mysql_dynamic_variables": {"require_secure_transport": {"Value": "ON", "Metadata": {"Host": "", "User": "dba", "Timestamp": 1788524612742190}}}}[root@vm172-16-0-84 mysql_data]#

Mysql 8服务器端配置SSL安全连接

https://dev.mysql.com/doc/refman/8.4/en/using-encrypted-connections.html#using-encrypted-connections-server-side-startup-configuration

[mysqld]
# 可以自行创建ca证书、服务端证书和KEY
ssl_ca=ca.pem
ssl_cert=server-cert.pem
ssl_key=server-key.pem
# 如果开启,那么强制客户端必须使用SSL连接;如果关闭,可以指定账号使用SSL连接
require_secure_transport=ON

以下示例

  1. 简化生成自签名证书
# 创建目录
mkdir -p /var/lib/mysql/ssl && cd /var/lib/mysql/ssl
# 生成KEY
openssl genrsa -out mysql-key.pem 2048
# 生成自签名证书
openssl req -x509 -new -key mysql-key.pem -days 3650 -out mysql-cert.pem
# 赋权
chmod 600 /var/lib/mysql/ssl/* 
chown -R mysql:mysql /var/lib/mysql/ssl
  1. 查看证书有效期
openssl x509 -in mysql-cert.pem -noout -dates
  1. 配置my.cnf
# 配置自定义证书和key。使用简化自签名证书,ssl_ca与ssl_cert一样
ssl_ca=/var/lib/mysql/ssl/mysql-cert.pem
ssl_cert=/var/lib/mysql/ssl/mysql-cert.pem
ssl_key=/var/lib/mysql/ssl/mysql-key.pem
# 如果开启,那么强制客户端必须使用SSL连接;如果关闭,可以指定账号使用SSL连接
# 如果不配置上述自定义证书,默认使用mysql系统生成的自签名证书,在/var/lib/mysql/下
require_secure_transport=ON

Mysql 8客户端配置SSL安全连接

https://dev.mysql.com/doc/refman/8.4/en/using-encrypted-connections.html#using-encrypted-connections-client-side-configuration

--ssl-mode=DISABLED|PREFERRED|REQUIRED|VERIFY_CA|VERIFY_IDENTITY
  1. DISABLED
  • 完全不使用SSL加密
  • 所有通信都以明文传输
  • 安全性最低,性能最好
  • 适用于测试环境或内部安全网络
  1. PREFERRED
  • 默认模式
  • 尝试使用SSL,失败则回退到非SSL
  • 对于Unix套接字连接不会加密
  • 平衡了安全性和兼容性
  1. REQUIRED
  • 强制要求SSL加密
  • 如果服务器不支持SSL则连接失败
  • 不验证证书的有效性
  • 适用于需要加密但不关心证书来源的环境
  1. VERIFY_CA
  • 要求SSL加密
  • 验证服务器证书是否由受信任的CA签发
  • 不验证主机名是否匹配
  • 比REQUIRED更安全
  1. VERIFY_IDENTITY
  • 最严格的模式
  • 要求SSL加密
  • 验证CA证书
  • 验证主机名是否与证书匹配
  • 防止中间人攻击
  • 安全性最高,配置也最复杂

Mysql 8客户端连接验证

  1. 服务端开启了require_secure_transport=ON,客户端禁用SSL连接,被拒绝
[root@centos7-05145 ~]# mysql -h 172.28.2.1 -u root -p --ssl-mode=DISABLED
Enter password: 
ERROR 3159 (HY000): Connections using insecure transport are prohibited while --require_secure_transport=ON.
  1. 服务端开启了require_secure_transport=ON,客户端启用SSL连接,查看连接状态
[root@centos7-05145 ~]# mysql -h 172.28.2.1 -u root -p --ssl-mode=REQUIRED
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.4.4 MySQL Community Server - GPL

Copyright (c) 2000, 2024, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> status
--------------
mysql  Ver 8.4.2 for Linux on x86_64 (MySQL Community Server - GPL)

Connection id:          8
Current database:
Current user:           root@192.168.5.145
SSL:                    Cipher in use is ECDHE-RSA-AES128-GCM-SHA256
Current pager:          stdout
Using outfile:          ''
Using delimiter:        ;
Server version:         8.4.4 MySQL Community Server - GPL
Protocol version:       10
Connection:             172.28.2.1 via TCP/IP
Server characterset:    utf8mb4
Db     characterset:    utf8mb4
Client characterset:    utf8mb4
Conn.  characterset:    utf8mb4
TCP port:               3306
Binary data as:         Hexadecimal
Uptime:                 2 min 44 sec

Threads: 2  Questions: 6  Slow queries: 0  Opens: 512  Flush tables: 3  Open tables: 26  Queries per second avg: 0.036
--------------

Mysql 8 创建使用SSL安全连接的账号

# require ssl 强制账号使用证书认证
CREATE USER 用户名@'%' IDENTIFIED BY 'password' require ssl;

# require x509 强制账号使用证书认证
CREATE USER 用户名@'%' IDENTIFIED BY 'password' require x509;

# 修改账号使用证书认证
ALTER USER '用户名'@'%'  require ssl;

Mysql 8 服务端查看SSL状态

# 查看ssl 配置
mysql> SHOW VARIABLES LIKE '%ssl%';
+-------------------------------------+-----------------+
| Variable_name                       | Value           |
+-------------------------------------+-----------------+
| admin_ssl_ca                        |                 |
| admin_ssl_capath                    |                 |
| admin_ssl_cert                      |                 |
| admin_ssl_cipher                    |                 |
| admin_ssl_crl                       |                 |
| admin_ssl_crlpath                   |                 |
| admin_ssl_key                       |                 |
| mysqlx_ssl_ca                       |                 |
| mysqlx_ssl_capath                   |                 |
| mysqlx_ssl_cert                     |                 |
| mysqlx_ssl_cipher                   |                 |
| mysqlx_ssl_crl                      |                 |
| mysqlx_ssl_crlpath                  |                 |
| mysqlx_ssl_key                      |                 |
| performance_schema_show_processlist | OFF             |
| ssl_ca                              | ca.pem          |
| ssl_capath                          |                 |
| ssl_cert                            | server-cert.pem |
| ssl_cipher                          |                 |
| ssl_crl                             |                 |
| ssl_crlpath                         |                 |
| ssl_fips_mode                       | OFF             |
| ssl_key                             | server-key.pem  |
| ssl_session_cache_mode              | ON              |
| ssl_session_cache_timeout           | 300             |
+-------------------------------------+-----------------+
25 rows in set (0.01 sec)

# 查看 TLS 版本
mysql>  SHOW VARIABLES LIKE 'tls_version';
+---------------+-----------------+
| Variable_name | Value           |
+---------------+-----------------+
| tls_version   | TLSv1.2,TLSv1.3 |
+---------------+-----------------+
1 row in set (0.01 sec)

# 查看强制开启状态
mysql> SHOW VARIABLES LIKE 'require_secure_transport';
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| require_secure_transport | ON    |
+--------------------------+-------+
1 row in set (0.00 sec)

更多推荐