概述
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
- 使用OpenSSL编译的MySQL服务器
- 官网mysql安装包已经集成了,支持ssl自签名证书
- 自签名证书文件系统自动生成,默认在数据存储目录下
[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
- 因为是自签名证书,启动日志中会报一条警告信息
[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;
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
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
- DISABLED
- 完全不使用SSL加密
- 所有通信都以明文传输
- 安全性最低,性能最好
- 适用于测试环境或内部安全网络
- PREFERRED
- 默认模式
- 尝试使用SSL,失败则回退到非SSL
- 对于Unix套接字连接不会加密
- 平衡了安全性和兼容性
- REQUIRED
- 强制要求SSL加密
- 如果服务器不支持SSL则连接失败
- 不验证证书的有效性
- 适用于需要加密但不关心证书来源的环境
- VERIFY_CA
- 要求SSL加密
- 验证服务器证书是否由受信任的CA签发
- 不验证主机名是否匹配
- 比REQUIRED更安全
- VERIFY_IDENTITY
- 最严格的模式
- 要求SSL加密
- 验证CA证书
- 验证主机名是否与证书匹配
- 防止中间人攻击
- 安全性最高,配置也最复杂
Mysql 8客户端连接验证
- 服务端开启了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.
- 服务端开启了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;