当使用非加密方式连接MySQL数据库时,在网络中传输的所有信息都是明文的,可以被网络中所有人截取,敏感信息可能被泄露。在传送敏感信息(如密码)时,可以采用SSL连接的方式。
一、配置MySQL服务端支持SSL连接
1. MySQL 5.7.6以前版本的配置方法:
a. 使用命令手工创建SSL文件:
# pwd
/data/mysql562
# mkdir certs
# cd certs
创建CA文件:
# openssl genrsa 2048 > ca-key.pem
# openssl req -new -x509 -nodes -days 3600 \
> -key ca-key.pem -out ca.pem
创建服务端公钥和私钥:
# openssl req -newkey rsa:2048 -days 3600 \
> -nodes -keyout server-key.pem -out server-req.pem
# openssl rsa -in server-key.pem -out server-key.pem
# openssl x509 -req -in server-req.pem -days 3600 \
> -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem
创建客户端公钥和私钥:
# openssl req -newkey rsa:2048 -days 3600 \
> -nodes -keyout client-key.pem -out client-req.pem
# openssl rsa -in client-key.pem -out client-key.pem
# openssl x509 -req -in client-req.pem -days 3600 \
> -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out client-cert.pem
# chown mysql.mysql -R /data/mysql562/certs
检查创建的文件:
# ll
-rw-r--r--. 1 mysql mysql 1679 3月 10 11:44 ca-key.pem
-rw-r--r--. 1 mysql mysql 1220 3月 10 11:44 ca.pem
-rw-r--r--. 1 mysql mysql 1090 3月 10 11:49 client-cert.pem
-rw-r--r--. 1 mysql mysql 1675 3月 10 11:49 client-key.pem
-rw-r--r--. 1 mysql mysql 952 3月 10 11:49 client-req.pem
-rw-r--r--. 1 mysql mysql 1090 3月 10 11:47 server-cert.pem
-rw-r--r--. 1 mysql mysql 1679 3月 10 11:46 server-key.pem
-rw-r--r--. 1 mysql mysql 952 3月 10 11:46 server-req.pem
b. 修改MySQL服务端配置文件/etc/my.cnf,增加以下参数:
[mysqld]
ssl-ca=ca.pem
ssl-cert=server-cert.pem
ssl-key=server-key.pem
2. MySQL5.7.6及以后版本的配置方法:
a. 使用MySQL提供的脚本创建SSL文件,会创建到数据库所在目录中:
# pwd
/usr/local/mysql
# ./bin/mysql_ssl_rsa_setup
# cd /data/mysql3306/data/
# chown mysql.mysql *
# ll
-rw-------. 1 mysql mysql 1679 3月 10 13:21 ca-key.pem
-rw-r--r--. 1 mysql mysql 1074 3月 10 13:21 ca.pem
-rw-r--r--. 1 mysql mysql 1078 3月 10 13:21 client-cert.pem
-rw-------. 1 mysql mysql 1675 3月 10 13:21 client-key.pem
-rw-------. 1 mysql mysql 1679 3月 10 13:21 private_key.pem
-rw-r--r--. 1 mysql mysql 451 3月 10 13:21 public_key.pem
-rw-r--r--. 1 mysql mysql 1078 3月 10 13:21 server-cert.pem
-rw-------. 1 mysql mysql 1679 3月 10 13:21 server-key.pem
b. 修改MySQL服务端配置文件/etc/my.cnf,增加以下参数:
[mysqld]
ssl-ca=ca.pem
ssl-cert=server-cert.pem
ssl-key=server-key.pem
二、配置客户端以SSL方式连接MySQL:
在服务器端配置了SSL参数后,客户端发起连接时默认使用SSL方式。
1. 命令行方式使用SSL连接:
# mysql -h192.168.20.246 -P 3306 -uroot -p
Enter password:
mysql> \s
--------------
mysql Ver 14.14 Distrib 5.7.17, for Linux (x86_64) using EditLine wrapper
Connection id: 4
Current database:
Current user: root@192.168.20.253
SSL: Cipher in use is DHE-RSA-AES256-SHA
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server version: 5.7.17 MySQL Community Server (GPL)
Protocol version: 10
Connection: 192.168.20.246 via TCP/IP
Server characterset: utf8mb4
Db characterset: utf8mb4
Client characterset: gbk
Conn. characterset: gbk
TCP port: 3306
Uptime: 4 min 42 sec
2. 以非加密方式连接MySQL:
# mysql -h192.168.20.246 -P 3306 -uroot -p --ssl-mode=DISABLED
Enter password:
mysql> \s
--------------
mysql Ver 14.14 Distrib 5.7.17, for Linux (x86_64) using EditLine wrapper
Connection id: 7
Current database:
Current user: root@192.168.20.253
SSL: Not in use
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server version: 5.7.17 MySQL Community Server (GPL)
Protocol version: 10
Connection: 192.168.20.246 via TCP/IP
Server characterset: utf8mb4
Db characterset: utf8mb4
Client characterset: gbk
Conn. characterset: gbk
TCP port: 3306
Uptime: 6 min 5 sec
3. 设置用户必须以SSL方式连接MySQL数据库:
mysql> create user hy@'%' identified by 'XXxx_123' require ssl;
mysql> grant select on *.* to hy@'%';
此时以非加密方式连接会报错:
# mysql -h192.168.20.246 -P 3306 -uhy -p --ssl-mode=DISABLED
Enter password:
ERROR 1045 (28000): Access denied for user 'hy'@'192.168.20.253' (using password: YES)
三、启用X509身份认证
使用上述步骤创建的符合X509格式的CA文件、公钥、私钥可以对连接进行身份认证,进一步提高连接的安全性。需先将CA文件、公钥、私钥分发给客户端。
1. 设置用户必须以X509方式验证身份后连接数据库:
mysql> create user hrb@'%' identified by 'XXxx_123' require x509;
mysql> grant select on *.* to hrb@'%';
2. 在客户端使用分发的CA文件、公钥、私钥连接数据库:
# mysql -h192.168.20.246 -P 3306 -uhrb -p --ssl-ca=./ca.pem --ssl-cert=./client-cert.pem --ssl-key=client-key.pem
Enter password:
mysql> \s
--------------
mysql Ver 14.14 Distrib 5.7.17, for Linux (x86_64) using EditLine wrapper
Connection id: 14
Current database:
Current user: hrb@192.168.20.253
SSL: Cipher in use is DHE-RSA-AES256-SHA
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server version: 5.7.17 MySQL Community Server (GPL)
Protocol version: 10
Connection: 192.168.20.246 via TCP/IP
Server characterset: utf8mb4
Db characterset: utf8mb4
Client characterset: gbk
Conn. characterset: gbk
TCP port: 3306
Uptime: 35 min 2 sec
此时若不指定CA文件、公钥、私钥,仅使用SSL连接数据库会报错:
# mysql -h192.168.20.246 -P 3306 -uhrb -p
Enter password:
ERROR 1045 (28000): Access denied for user 'hrb'@'192.168.20.253' (using password: YES)
转载请注明原文地址: https://ju.6miu.com/read-20852.html