有这么一种需求,就是要求处理敏感字段,比如取出的密码或资金数据用 *** 来表示,那么 DBA 就无法看到这部分的私人数据内容。这本身是一个很不错的安全处理方式,但若 DBA 在本地装一个类似 tcpdump 的工具,则依然能够通过获取得到的包得到想要的数据。因此,除了在程序端进行展示的安全处理,还需在 MySQL 服务器端开启安全的加密通信功能,这时就是 SSL 发挥功能的时候了。
MySQL 5.7 的 SSL 配置与使用,如果仔细阅读 MySQL 5.7 的安装文档 INSTALL-BINARY,会发现 5.7 的安装文档在初始化数据目录之后还额外多做了一个操作,这是之前版本所没有的操作,而该步骤即是对于 SSL 的安装与配置:
shell> bin/mysql_ssl_rsa_setup
1
shell>bin/mysql_ssl_rsa_setup
运行完命令 mysql_ssl_rsa_setup 后会发现数据目录下多出了一些以 pem 结尾的文件,而这些文件就是开启 SSL 连接所需要的文件:
server-cert.pem
server-key.pem
client-cert.pem
client-key.pem
ca.pem
ca-key.pem
public_key.pem
private_key.pem
1
2
3
4
5
6
7
8
server-cert.pem
server-key.pem
client-cert.pem
client-key.pem
ca.pem
ca-key.pem
public_key.pem
private_key.pem
PS:如果你是 yum 安装,那么直接执行 mysql_ssl_rsa_setup,就会在 /var/log/mysql/ 目录下就会生成这些文件。
若这时启动 MySQL 数据库并启动应该可以发现如下状态:
mysql> SHOW VARIABLES LIKE '%ssl%';
+---------------+---------------------------------+
| Variable_name | Value |
+---------------+---------------------------------+
| have_openssl | YES |
| have_ssl | YES |
1
2
3
4
5
6
mysql>SHOWVARIABLESLIKE'%ssl%';
+---------------+---------------------------------+
|Variable_name|Value|
+---------------+---------------------------------+
|have_openssl|YES|
|have_ssl|YES|
该参数表示 MySQL 服务器开启了 SSL 功能,而在 MySQL 5.7 版本下客户端默认就会使用SSL的方式来进行连接(注意:如果使用 socket 连接的话就无法加密),比如:
$ mysql -ubackup -p -h10.0.60.143
mysql> \s
--------------
mysql Ver 14.14 Distrib 5.7.16, for Linux (x86_64) using EditLine wrapper
Connection id:13
Current database:
Current user:root@10.0.60.143
SSL:Cipher in use is DHE-RSA-AES256-SHA
1
2
3
4
5
6
7
8
9
$mysql-ubackup-p-h10.0.60.143
mysql>\s
--------------
mysqlVer14.14Distrib5.7.16,forLinux(x86_64)usingEditLinewrapper
Connectionid:13
Currentdatabase:
Currentuser:root@10.0.60.143
SSL:CipherinuseisDHE-RSA-AES256-SHA
通过 STATUS 的 SSL 列就能判断连接的用户是否使用了 SSL,比如上述例子中的 Cipher in use is DHE-RSA-AES256-SHA 就表示当前 root 用户是通过 SSL 的方式进行连接。
当我们在 MySQL 开启 SSL 连接时,在客户端驱动连接时如果也开启了 SSL 连接,那么自然就需要配置相关证书了,不然就会报错;当客户端驱动关闭 SSL 连接时,那么 MySQL 端就不会使用 SSL 连接方式处理了。
若在创建用户时,希望该用户每次必须通过 SSL 方式,则需在创建用户通过 “REQUIRE SSL” 来进行设置,对于上述的 root 用户,可以通过如下方式来进行修改以确保每次通过 SSL 进行连接,强制不使用 SSL 进行连接则报错:
mysql> ALTER USER root@'%' REQUIRE SSL;
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)
1
2
3
4
5
mysql>ALTERUSERroot@'%'REQUIRESSL;
QueryOK,0rowsaffected(0.00sec)
mysql>flushprivileges;
QueryOK,0rowsaffected(0.01sec)
或者创建用户时直接指定。
mysql> grant all on *.* to 'root'@'%' identified by '123456' REQUIRE SSL;
1
mysql>grantallon*.*to'root'@'%'identifiedby'123456'REQUIRESSL;
再次登录,但记得连接时关闭 SSL 连接。
$ mysql -uroot -p -h10.0.60.143 --ssl=off
WARNING: --ssl is deprecated and will be removed in a future version. Use --ssl-mode instead.
Enter password:
ERROR 1045 (28000): Access denied for user 'root'@'10.0.60.143' (using password: YES)
1
2
3
4
$mysql-uroot-p-h10.0.60.143--ssl=off
WARNING:--sslisdeprecatedandwillberemovedinafutureversion.Use--ssl-modeinstead.
Enterpassword:
ERROR1045(28000):Accessdeniedforuser'root'@'10.0.60.143'(usingpassword:YES)
可以看到不允许连接的。
从 MySQL 5.7.28 开始默认就开启了 SSL 连接,之前版本需要手动使用工具 mysql_ssl_rsa_setup 来生成”SSL 密钥和证书文件”,以支持 SSL 连接。5.7.28 启动数据库时,会在数据目录自动生成以下文件。
ca-key.pem
ca.pem
client-cert.pem
client-key.pem
private_key.pem
public_key.pem
server-cert.pem
server-key.pem
1
2
3
4
5
6
7
8
ca-key.pem
ca.pem
client-cert.pem
client-key.pem
private_key.pem
public_key.pem
server-cert.pem
server-key.pem
当然,你也可以手动关闭自动生成证书。MySQL 5.7.28 官方默认打开了参数 --auto-generate-certs,用来控制是否自动生成证书。
$ mysql --verbose --help |less
--auto-generate-certs
Auto generate SSL certificates at server startup if --ssl
is set to ON and none of the other SSL system variables
are specified and certificate/key files are not present
in data directory.
(Defaults to on; use --skip-auto-generate-certs to disable.)
1
2
3
4
5
6
7
$mysql--verbose--help|less
--auto-generate-certs
AutogenerateSSLcertificatesatserverstartupif--ssl
issettoONandnoneoftheotherSSLsystemvariables
arespecifiedandcertificate/keyfilesarenotpresent
indatadirectory.
(Defaultstoon;use--skip-auto-generate-certstodisable.)
相关的参数,还有这些:
auto_generate_certs
sha256_password_auto_generate_rsa_keys
sha256_password_private_key_path
sha256_password_public_key_path
Rsa_public_key
早期版本此参数虽然也有,但是默认是关闭的。如果你的 MySQL 源码编译时用 openssl 替代 yassl,那就有这些参数!MySQL 5.7.28 开始也正是因为默认编译时使用了 openssl 替代 yassl,所以官方就默认开启了开启了 SSL。
NOTE
以往 MySQL 社区版默认是使用 yassl 编译,企业版默认使用 openssl 编译,手动编译时可以选择 yassl 或 openssl。
MySQL 5.7.28 开始仅支持 OpenSSL,yassl 被移除了,默认编译用的是 openssl,社区版和企业版支持并且只支持 openssl 作为其 SSL 库。
MySQL 5.6 同样支持以 SSL 的方式进行连接,但是操作相对 5.7 较为复杂,用户需要自己通过 openssl 命令来创建各类公密钥,具体可以查看相关官方文档。
如果您觉得本站对你有帮助,那么可以支付宝扫码捐助以帮助本站更好地发展,在此谢过。