-
产品:Docker MySQL
-
版本:5.6
-
环境:CentOS Linux 7
文章目录
方案背景
根据等保要求,生产数据库需开启连接限制与密码复杂度功能,防止数据库被恶意爆破;
通过使用connection_control插件,对多次连接失败的客户端增加响应延迟;
在客户端多次连接失败产生延迟后,输入正确的用户名密码,可成功登录数据库,但该次登录仍会被延迟,登录成功后连接失败记录将被清空,之后该客户端的连接将恢复正常,重新开始计算。
通过使用validate_password插件,对数据库账号启用安全的密码复杂度策略,后续进行账号密码设置时,需要满足密码复杂度策略要求。
变更内容
序号 |
变更步骤 |
操作时长 |
1 |
检查数据库插件加载情况 |
2分钟 |
2 |
备份数据库参数文件 |
5分钟 |
3 |
修改数据库参数文件 |
5分钟 |
4 |
重启数据库 |
5分钟 |
5 |
检查数据库插件加载情况 |
2分钟 |
6 |
验证业务可用性 |
10分钟 |
变更范围
序号 |
服务器用途 |
服务器IP |
Docker ID |
数据库端口 |
1 |
生产库 |
192.168.1.14 |
ae86114514a8 |
24599 |
变更影响
变更过程中对业务影响 |
变更后对业务影响 |
预估操作影响时长 |
业务中断,无法对外提供服务 |
无 |
30分钟 |
风险评估
操作过程存在一定风险,针对主要风险作出以下应对。对于风险状态的判断由实施当天的实施小组进行讨论后判定,提请现场工作组总指挥确认是否启动应急措施。
序号 |
风险点描述 |
影响范围 |
风险等级 |
应急措施 |
1 |
数据库启动异常 |
业务无法访问数据库 |
高 |
变更前备份数据库参数文件,发生异常时根据异常信息修复; |
2 |
应用连接数据库异常 |
用户无法访问业务 |
高 |
根据回退方案对相关变更内容进行回退; |
实施方案
1、在Docker中检查数据库插件加载情况:
docker exec -it ae86114514a8 bash
mysql -uroot -p
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE 'connection%';
Empty set (0.00 sec)
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE 'validate%';
Empty set (0.00 sec)
查询结果均为:Empty set,表示当前未加载相关插件;
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、在宿主机修改数据库参数文件
vi mysqld.cnf
#增加插件加载及相关参数
plugin-load="validate_password.so;connection_control.so"
#防止插件在数据库运行时被卸载
connection-control=FORCE_PLUS_PERMANENT
connection-control-failed-login-attempts=FORCE_PLUS_PERMANENT
validate-password = FORCE_PLUS_PERMANENT
validate_password_length=8
validate_password_mixed_case_count=1
validate_password_number_count=1
validate_password_policy=MEDIUM
validate_password_special_char_count=1
connection_control_failed_connections_threshold=4
connection_control_min_connection_delay=600000
connection_control_max_connection_delay=2147483000
4、将修改好的数据库参数文件从宿主机拷贝到docker中覆盖
docker cp /tmp/mysqld.cnf mysql:/etc/mysql/mysql.conf.d/
5、重启数据库
#在Docker中关闭数据库
docker exec -it ae86114514a8 bash
service mysql stop
#在宿主机启动Docker
docker start ae86114514a8
#检查Docker运行状态
docker ps -a
6、在Docker中检查数据库插件加载情况
docker exec -it ae86114514a8 bash
mysql -uroot -p
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE 'connection%';
+------------------------------------------+---------------+
| PLUGIN_NAME | PLUGIN_STATUS |
+------------------------------------------+---------------+
| CONNECTION_CONTROL | ACTIVE |
| CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS | ACTIVE |
+------------------------------------------+---------------+
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE 'validate%';
+-------------------+---------------+
| PLUGIN_NAME | PLUGIN_STATUS |
+-------------------+---------------+
| validate_password | ACTIVE |
+-------------------+---------------+
查询结果均为:ACTIVE,表示当前已加载相关插件;
7、对比重启前后数据库参数值
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
8、验证业务可用性
开启应用,通知用户登录应用,验证业务可用性。
变更检验
使用错误密码连接数据库验证;
#确认有账号连接失败的测试记录
select * from information_schema.Connection_control_failed_login_attempts;
show status like 'Connection_control_delay_generated';
#通过修改连接失败触发次数参数,可重置失败记录数,避免影响业务
set global connection_control_failed_connections_threshold=4;
回退方案
1、在Docker中恢复数据库参数文件
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
2、重启数据库
#在Docker中关闭数据库
docker exec -it ae86114514a8 bash
service mysql stop
#在宿主机启动Docker
docker start ae86114514a8
#检查Docker运行状态
docker ps -a
创作不易,如需转载本公众号原创文章,均需在文章明显位置注明出处,或插上公众号名片,醒狮运维团队每周将对抄袭的文章进行举报,投诉。
关注醒狮运维公众号,了解更多运维知识及漏洞资讯!
原文始发于微信公众号(醒狮运维):Docker环境MySQL开启连接限制与密码复杂度方案
评论