有这么一种需求,就是要求处理敏感字段,比如取出的密码或资金数据用 *** 来表示,那么 DBA 就无法看到这部分的私人数据内容。这本身是一个很不错的安全处理方式,但若 DBA 在本地装一个类似 tcpdump 的工具,则依然能够通过获取得到的包得到想要的数据。因此,除了在程序端进行展示的安全处理,还需在 MySQL 服务器端开启安全的加密通信功能,这时就是 SSL 发挥功能的时候了。
MySQL 5.7 的 SSL 配置与使用,如果仔细阅读 MySQL 5.7 的安装文档 INSTALL-BINARY,会发现 5.7 的安装文档在初始化数据目录之后还额外多做了一个操作,这是之前版本所没有的操作,而该步骤即是对于 SSL 的安装与配置:
1 |
shell> bin/mysql_ssl_rsa_setup |
运行完命令 mysql_ssl_rsa_setup 后会发现数据目录下多出了一些以 pem 结尾的文件,而这些文件就是开启 SSL 连接所需要的文件:
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 数据库并启动应该可以发现如下状态:
1 2 3 4 5 6 |
mysql> SHOW VARIABLES LIKE '%ssl%'; +---------------+---------------------------------+ | Variable_name | Value | +---------------+---------------------------------+ | have_openssl | YES | | have_ssl | YES | |
该参数表示 MySQL 服务器开启了 SSL 功能,而在 MySQL 5.7 版本下客户端默认就会使用SSL的方式来进行连接(注意:如果使用 socket 连接的话就无法加密),比如:
1 2 3 4 5 6 7 8 9 |
$ 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 |
通过 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 进行连接则报错:
1 2 3 4 5 |
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 |
mysql> grant all on *.* to 'root'@'%' identified by '123456' REQUIRE SSL; |
再次登录,但记得连接时关闭 SSL 连接。
1 2 3 4 |
$ 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) |
可以看到不允许连接的。
从 MySQL 5.7.28 开始默认就开启了 SSL 连接,之前版本需要手动使用工具 mysql_ssl_rsa_setup 来生成”SSL 密钥和证书文件”,以支持 SSL 连接。5.7.28 启动数据库时,会在数据目录自动生成以下文件。
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
,用来控制是否自动生成证书。
1 2 3 4 5 6 7 |
$ 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.) |
相关的参数,还有这些:
- 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 命令来创建各类公密钥,具体可以查看相关官方文档。
<参考>
https://mp.weixin.qq.com/s/dQwREG5OOvy1haVG3JHBkg