-
产品:Docker MySQL
-
版本:5.6
-
环境:CentOS Linux 7
文章目录
-
Docker MySQL开启SSL加密传输方案
-
方案背景
-
变更内容
-
变更范围
-
变更影响
-
风险评估
-
实施方案
-
变更检验
-
回退方案
-
关注公众号,学习更多运维实战案例!
方案背景
根据等保要求,生产数据库需开启SSL加密传输功能,避免以明文方式在网络中传输敏感信息,防止信息泄露;
变更内容
序号 |
变更步骤 |
操作时长 |
1 |
检查数据库SSL状态 |
2分钟 |
2 |
备份数据库参数文件 |
5分钟 |
3 |
创建SSL证书 |
5分钟 |
4 |
修改数据库参数文件 |
5分钟 |
5 |
重启数据库 |
5分钟 |
6 |
检查数据库SSL状态 |
2分钟 |
7 |
配置数据库账号SSL认证 |
2分钟 |
8 |
配置应用SSL连接串 |
10分钟 |
9 |
测试业务连接 |
10分钟 |
变更范围
序号 |
服务器用途 |
服务器IP |
Docker ID |
数据库端口 |
1 |
生产库 |
192.168.1.14 |
ae86114514a8 |
24599 |
变更影响
变更过程中对业务影响 |
变更后对业务影响 |
预估操作影响时长 |
业务中断,无法对外提供服务 |
无 |
1小时 |
风险评估
操作过程存在一定风险,针对主要风险作出以下应对。对于风险状态的判断由实施当天的实施小组进行讨论后判定,提请现场工作组总指挥确认是否启动应急措施。
序号 |
风险点描述 |
影响范围 |
风险等级 |
应急措施 |
1 |
数据库启动异常 |
业务无法访问数据库 |
高 |
变更前备份数据库参数文件,发生异常时根据异常信息修复; |
2 |
应用连接数据库异常 |
用户无法访问业务 |
高 |
根据回退方案对相关变更内容进行回退; |
实施方案
1、在Docker中检查数据库是否开启SSL:
docker exec -it ae86114514a8 bash
mysql -uroot -p
show variables like '%ssl%';
+---------------+----------+
| Variable_name | Value |
+---------------+----------+
| have_openssl | DISABLED |
| have_ssl | DISABLED |
| ssl_ca | |
| ssl_capath | |
| ssl_cert | |
| ssl_cipher | |
| ssl_crl | |
| ssl_crlpath | |
| ssl_key | |
+---------------+----------+
have_openssl和have_ssl参数值为:DISABLE,表示当前未开启SSL;
2、在Docker中备份数据库参数文件
#确认mysql用户对参数文件有可读权限
ls -l /etc/mysql/mysql.conf.d/mysqld.cnf
#备份参数文件,使用-p参数连文件权限一起备份
cp -p /etc/mysql/mysql.conf.d/mysqld.cnf /etc/mysql/mysql.conf.d/mysqld.cnf.bak
#从docker中拷贝到宿主机,以防万一
docker cp mysql:/etc/mysql/mysql.conf.d /tmp
#记录参数信息,防止数据库重启后在线修改的参数值丢失
mysql -uroot -p -e"show global variables;" > /tmp/mysql_golbal_var.log
3、在宿主机创建SSL证书
由于生产环境使用的MySQL版本是5.6,没有5.7以上版本自带的mysql_ssl_rsa_setup工具自动生成SSL证书,故通过宿主机的OpenSSL创建证书;
mkdir newcerts && cd newcerts
openssl genrsa 2048 > ca-key.pem
根据官方文档提示,Common Name 不能和后面签发的服务器、客户端证书相同,否则后面使用 SSL 登录的时候会出现错误 ERROR 2026 (HY000): SSL connection error: error:00000001:lib(0):func(0):reason(1)
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
openssl verify -CAfile ca.pem server-cert.pem client-cert.pem
server-cert.pem: OK
client-cert.pem: OK
4、在宿主机修改数据库参数文件
vi mysqld.cnf
##增加SSL证书参数
[mysqld]
ssl_ca=ca.pem
ssl_cert=server-cert.pem
ssl_key=server-key.pem
将修改好的数据库参数文件从宿主机拷贝到docker中覆盖
docker cp /tmp/mysqld.cnf mysql:/etc/mysql/mysql.conf.d/
5、重启数据库
#在Docker中关闭数据库
docker exec -it ae86114514a8 bash
service mysql stop
#确认是否在存在MySQL相关进程
ps -ef|grep mysql
#在宿主机启动Docker
docker start ae86114514a8
#检查Docker运行状态
docker ps -a
6、在Docker中检查数据库SSL状态
docker exec -it ae86114514a8 bash
mysql -uroot -p
show variables like '%ssl%';
+---------------+-----------------+
| Variable_name | Value |
+---------------+-----------------+
| have_openssl | YES |
| have_ssl | YES |
| ssl_ca | ca.pem |
| ssl_capath | |
| ssl_cert | server-cert.pem |
| ssl_cipher | |
| ssl_crl | |
| ssl_crlpath | |
| ssl_key | server-key.pem |
+---------------+-----------------+
have_openssl和have_ssl参数值为:YES,表示当前已开启SSL;
7、配置数据库账号SSL认证
#检查MySQL账号当前认证方式
select user,host,ssl_type from mysql.user;
+----------+-----------+----------+
| user | host | ssl_type |
+----------+-----------+----------+
| xsyunwei | % | |
+----------+-----------+----------+
#开启数据库账号SSL认证(5.6版本语法)
GRANT USAGE ON *.* TO 'xsyunwei'@'%' REQUIRE SSL;
#开启数据库账号SSL认证(5.7以上版本语法)
ALTER USER 'xsyunwei'@'%' REQUIRE SSL;
FLUSH PRIVILEGES;
#配置认证方式为双向认证(必须使用SSL登录,并且验证证书)
update MySQL.user set ssl_type='X509' where user='xsyunwei';
FLUSH PRIVILEGES;
mysql -uxsyunwei -p --ssl-ca=/var/lib/mysql/ca.pem --ssl-cert=/var/lib/mysql/client-cert.pem --ssl-key=/var/lib/mysql/client-key.pem
#检查SSL信息
SHOW STATUS LIKE 'Ssl_version';
+---------------+---------+
| Variable_name | Value |
+---------------+---------+
| Ssl_version | TLSv1.2 |
+---------------+---------+
SHOW STATUS LIKE 'Ssl_cipher';
+---------------+-----------------------------+
| Variable_name | Value |
+---------------+-----------------------------+
| Ssl_cipher | ECDHE-RSA-AES256-GCM-SHA384 |
+---------------+-----------------------------+
8、对比重启前后数据库参数值
mysql -uroot -p -e"show global variables;" > /tmp/mysql_golbal_var_2.log
diff /tmp/mysql_golbal_var.log /tmp/mysql_golbal_var_2.log
9、配置应用SSL连接串
应用由.NET开发,参考GitHub上的连接串配置说明文档:https://mysqlconnector.net/connection-options/,在连接串中加入以下参数,实现SSL连接:
SslMode=VerifyCA;Ssl-Ca=路径ca.pem;Ssl-Cert=路径client-cert.pem;Ssl-Key=路径client-key.pem
(实际操作中,由于应用较老,连接器MySql.Data版本为5.2.3.0,不支持SslMode参数,经升级MySql.Data版本到6.7.4.0后配置成功。)
10、测试业务连接
通知用户登录应用。
变更检验
在宿主机上捕获的数据库传输包为加密包。
回退方案
1、取消数据库账号验证模式
update MySQL.user set ssl_type='' where user='xsyunwei';
flush privileges;
2、取消数据库账号SSL认证
#5.6
GRANT USAGE ON *.* TO 'xsyunwei'@'%' REQUIRE NONE;
#5.7
ALTER USER 'xsyunwei'@'%' REQUIRE NONE;
FLUSH PRIVILEGES;
3、恢复数据库参数文件
mv /etc/mysql/mysql.conf.d/mysqld.cnf /etc/mysql/mysql.conf.d/mysqld.cnf.bak2
mv /etc/mysql/mysql.conf.d/mysqld.cnf.bak /etc/mysql/mysql.conf.d/mysqld.cnf
4、重启数据库
#在Docker中关闭数据库
docker exec -it ae86114514a8 bash
service mysql stop
#在宿主机启动Docker
docker start ae86114514a8
#检查Docker运行状态
docker ps -a
5、恢复应用连接串
删除连接串中SSL相关参数:
SslMode=VerifyCA;Ssl-Ca=路径ca.pem;Ssl-Cert=路径client-cert.pem;Ssl-Key=路径client-key.pem
创作不易,如需转载本公众号原创文章,均需在文章明显位置注明出处,或插上公众号名片,醒狮运维团队每周将对抄袭的文章进行举报,投诉。
关注醒狮运维公众号,了解更多运维知识及漏洞资讯!
原文始发于微信公众号(醒狮运维):Docker环境MySQL开启SSL加密传输方案
评论