数据库被黑记录
总结
由于数据库弱密码,导致测试服务器的数据库被黑。本篇文章旨在记录并引以为鉴。
起因
2024 年 11 月某一天,数据库连接失败。于是排查发现了数据库被黑。
查询资料发现是互联网上自动扫描的攻击程序造成。这些程序会持续扫描公网 IP 段,寻找 MySQL(3306)、Redis(6379)、MongoDB(27017)等常用服务的默认端口。一旦发现,它们会立即尝试用默认用户名(如 root
、admin
)和常见弱密码(包括空密码)进行登录。
攻击者成功登录后,删除了我们原有的所有数据库,并留下了一张名为 recover_your_data
的新表,内容是要求支付比特币以赎回数据的勒索信息。
处理步骤
从发现异常到服务恢复,以下是详细的步骤复盘。
第一步:数据库连接失败
在进行测试时,发现应用无法连接到数据库。
第二步:发现数据库被黑
尝试通过 Navicat 客户端工具连接数据库,发现数据库中测试业务数据全部消失不见。取而代之的是一个陌生的 PLEASE_READ_ME
库。至此,可以 100% 确认:数据库被黑。
第三步:备份数据与日志
在进行任何修改之前,首要任务是保留“犯罪现场”,以便后续排查。
- 备份剩余数据:虽然业务库被删,但攻击者留下的勒索信息、MySQL 的系统库(如
mysql
库中的用户信息)可能包含有价值的线索。对剩余的所有数据库进行备份。 - 备份日志文件:拷贝 MySQL 的错误日志(
error.log
)、慢查询日志(slow-query.log
)以及系统日志,这些日志可能会记录下攻击者的登录 IP 和操作时间。
第四步:排查被黑原因
备份后开始排查。
- 检查用户权限:在
mysql
库中,执行了SELECT user, host FROM mysql.user;
。发现'root'@'%'
的存在,表示测试数据库允许任何 IP 以 root 身份登录。 - 检查密码:发现是弱密码。
- 分析日志:分析 MySQL 日志和系统日志,没有发现其他信息。
于是可以分析出:公网 IP + 3306 端口 + root@% + 弱密码导致了数据库被黑。
第五步:修改密码,重启服务
定位问题后,开始进行修复:
修改密码:为
root
用户设置一个高强度的复杂密码,并限制其登录 IP。-- 修改本地登录的root用户密码 ALTER USER 'root'@'localhost' IDENTIFIED BY 'XXXXXX'; -- 限制登录IP UPDATE user SET host='192.168.X.X' WHERE user='root'; -- 刷新权限 FLUSH PRIVILEGES;
配置防火墙:在服务器防火墙(如
firewalld
)上,关闭对公网开放的 3306 端口。如果必须远程连接,也应配置为只允许特定的白名单 IP 访问。重启服务:完成修改后,重启 MySQL 服务,确保所有旧的、恶意的连接被断开。
第六步:数据恢复
- 使用备份的数据脚本进行恢复(数据勤备份)
支付赎金的做法并不可取。
第七步:全面排查
对所有使用的数据库服务(包括生产、预发和所有测试环境)进行了一次彻底的安全审计,检查是否存在类似的弱密码、不合理的授权、公网端口暴露等问题,并形成规范,杜绝此类事件再次发生。
更多信息
- MySQL 官方安全指南: MySQL Security Guidelines
- mysql_secure_installation 工具: mysql_secure_installation
- MySQL 自带的一个安全脚本,可以引导你完成移除匿名用户、禁止 root 远程登录、移除测试数据库等一系列安全设置,推荐在新服务器上第一时间运行。
- OWASP 数据库安全备忘录: OWASP Database Security Cheat Sheet
- OWASP Top 10:2021