Docker MySQL开启SSL加密传输方案

Docker MySQL开启SSL加密传输方案

  • 产品:Docker MySQL
  • 版本: 5.6
  • 环境: CentOS Linux 7

方案背景

根据等保要求,生产数据库需开启SSL加密传输功能,避免以明文方式在网络中传输敏感信息,防止信息泄露;

变更内容

序号变更步骤操作时长
1检查数据库SSL状态2分钟
2备份数据库参数文件5分钟
3创建SSL证书5分钟
4修改数据库参数文件5分钟
5重启数据库5分钟
6检查数据库SSL状态2分钟
7配置数据库账号SSL认证2分钟
8配置应用SSL连接串10分钟
9测试业务连接10分钟

变更范围

序号服务器用途服务器IPDocker ID数据库端口
1生产库192.168.1.14ae86114514a824599

变更影响

变更过程中对业务影响变更后对业务影响预估操作影响时长
业务中断,无法对外提供服务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创建证书;

  • 生成一个 CA 私钥(参考官方文档:https://dev.mysql.com/doc/refman/5.6/en/creating-ssl-files-using-openssl.html)
mkdir newcerts && cd newcerts
openssl genrsa 2048 > ca-key.pem
  • 通过 CA 证书私钥生成数字证书

根据官方文档提示,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
  • 创建 MySQL 服务器私钥和请求证书
openssl req -newkey rsa:2048 -days 3600 -nodes -keyout server-key.pem -out server-req.pem
  • 将生成的私钥转换为 RSA 私钥文件格式
openssl rsa -in server-key.pem -out server-key.pem
  • 使用前面生成的 CA 证书来生成一个服务器端的数字证书
openssl x509 -req -in server-req.pem -days 3600 -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem
  • 创建客户端的 RSA 私钥和数字证书
openssl req -newkey rsa:2048 -days 3600 -nodes -keyout client-key.pem -out client-req.pem
  • 将生成的私钥转换为 RSA 私钥文件格式
openssl rsa -in client-key.pem -out client-key.pem
  • 使用前面生成的 CA 证书来生成一个客户端的数字证书
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认证

  • 开启数据库账号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

关注公众号,学习更多运维实战案例!

在这里插入图片描述

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

醒狮运维

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值