
【复盘】数据库被入侵从发现到溯源全过程专栏安全 故障排查难度进阶标签安全事故入侵溯源数据库安全复盘应急响应前言这是一次真实的安全事故复盘已脱敏。凌晨2点监控告警数据库异常连接我们花了4小时完成了从发现到溯源的全过程。记录下来希望对你有用。时间线时间事件02:14监控告警MySQL连接数异常突然增加20002:17值班同学收到告警登录服务器查看02:31确认入侵开始应急响应03:45完成隔离服务恢复06:20完成溯源找到入侵路径一、发现阶段# 异常告警触发登录服务器查看mysql-uroot-p-eSHOW PROCESSLIST\G# 发现大量来自非内网IP的连接# 来自 103.x.x.x 的连接在持续执行 SELECT * FROM users# 查看MySQL用户mysql-eSELECT user, host, authentication_string FROM mysql.user\G# 发现多了一个陌生用户 backup%二、应急隔离# 立刻隔离修改iptables封禁外网访问MySQL端口iptables-IINPUT1-ptcp--dport3306-jDROP# Kill掉所有可疑连接mysql-eSHOW PROCESSLIST\G|grep103\.|awk{print $1}|\whilereadid;domysql-eKILL$id;done# 锁定可疑账号mysql-eALTER USER backup% ACCOUNT LOCK;# 修改所有账号密码mysql-eALTER USER root% IDENTIFIED BY $(openssl rand-base6424);三、溯源分析# 查看MySQL binlog找攻击者的操作mysqlbinlog /var/lib/mysql/mysql-bin.000023|grep-A5backup# 发现攻击者创建了 backup 账号并导出了 users 表# 追查攻击来源# MySQL general log如果开启了grep103.x.x.x/var/log/mysql/mysql-general.log# 系统日志last|grep103.x.x.xgrep103.x.x.x/var/log/auth.log# Web访问日志找攻击入口grep-r103.x.x.x/var/log/nginx/# 发现这个IP在3天前通过一个旧的API接口进行了SQL注入四、根因分析攻击路径 1. 攻击者扫描发现系统存在一个2年前的旧API接口/api/v1/user/search 2. 该接口未做SQL注入防护 3. 通过 UNION SELECT 提取了数据库用户名密码MD5弱哈希被破解 4. 直接使用账号密码连接MySQLMySQL 3306 端口对外暴露 5. 创建了后门账号并导出 users 表数据五、修复与加固# 1. MySQL端口禁止对外暴露iptables-DINPUT1# 删除临时规则iptables-AINPUT-ptcp--dport3306-s10.0.0.0/8-jACCEPT iptables-AINPUT-ptcp--dport3306-jDROP# 2. 下线旧API接口# 3. 修复SQL注入使用参数化查询# 4. 用户密码强制重置已泄露# 5. 密码存储改用 bcrypt不再使用MD5# 6. 添加API接口访问频率限制六、改进措施改进项执行时间负责人MySQL端口禁止公网访问立即运维全面SQL注入扫描3天内安全删除所有废弃API1周内研发用户密码哈希升级到bcrypt2周内研发建立API废弃下线流程1月内全体结语这次入侵的根因是一个2年前的废弃接口从未被下线。技术债务不只是影响效率还会成为安全漏洞。定期清理废弃接口是运维和研发共同的责任。