服务器数据库被清空,十有八九是遭遇了入侵后的恶意篡改或删除操作,核心对策是按“断网止损→溯源排查→漏洞修复→数据恢复→安全加固”五步走,越早处置,数据找回概率越大。
服务器被入侵数据库被清空,先做这三件事
数据库突然被清空,很多人的第一反应是慌乱或者直接重装系统,行业共识认为,此时最忌讳盲目操作,因为后续的数据恢复和痕迹保留都依赖现场完整性。
立即断开公网连接
- 在云厂商控制台,将服务器安全组的出方向和入方向全部设为拒绝
- 如果是物理机,直接拔掉网线或关闭外网网卡,命令为
ifdown eth0(CentOS)或ip link set eth0 down(Debian系) - 保留服务器开机状态,不要重启,不要关闭数据库进程进程内存中可能还有攻击者的连接会话和操作记录
备份当前环境证据
- 用
cp -a /var/lib/mysql /root/mysql_bak_时间戳这类命令,把数据库目录原样复制一份到独立磁盘 - 执行
mysqldump -u root -p --all-databases > /root/all.sql尝试逻辑导出,如果数据库服务还能启动的话 - 截图或记录当前的进程列表(
ps aux)、网络连接(netstat -antlp)、计划任务(crontab -l)
判断数据是被删除还是被篡改
查看 MySQL 的 binlog 日志,比如执行 mysqlbinlog --base64-output=decode-rows -v mysql-bin.000012 | grep -i drop,如果日志里有明确的多条 DROP 或 TRUNCATE 语句,就是人为删库,如果日志显示 UPDATE 语句将字段值改为空或随机字符,属于篡改攻击,两类情况的恢复路径完全不同。
排查服务器被入侵的几种常见入口
“服务器老是被清数据库”这句话里,“老是被”三个字说明问题大概率不是偶然的一次弱口令,而是系统里残留了后门程序或者周期性任务。
定时任务和后门脚本排查
- 运行
crontab -l和cat /etc/crontab,检查是否有非自己创建的定时任务 - 查看
/etc/rc.local、/etc/init.d/目录,留意文件名带有随机字符串的可疑脚本 - 使用
find /tmp /var/tmp /dev/shm -type f -mtime -7 -exec ls -la {} \;查找近期新增文件,攻击者常在这几个目录放木马 - 检查系统用户列表
cat /etc/passwd,看是否有uid=0的非 root 用户
数据库权限与账号泄露点
数据库被入侵,常见原因按发生频率排序:弱口令暴破、phpMyAdmin 未设访问限制、应用代码注入、备份文件泄露。
- 检查 MySQL 用户表
select user,host,authentication_string from mysql.user;,留意是否有陌生账号 - 查看应用的数据库配置文件(.env、config.php、web.config),文件中是否使用了 root 账户连接数据库
- 检查 web 目录下是否有被上传的 webshell,查找
php、jsp、asp文件中包含eval(、base64_decode(、assert(等敏感函数
系统日志关键词分析
SSH 登录日志是判断入侵来源的重要依据:
- CentOS 查看
/var/log/secure,Ubuntu 查看/var/log/auth.log,执行grep Failed /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | head -20列出暴力破解来源 IP 排行 - 查看是否有多条非本人操作的登录成功记录,特别是深夜时段或异常 IP
- 用
last -20检查最近登录历史,如有陌生 IP 登录记录,说明 SSH 凭据或被写入公钥,需检查~/.ssh/authorized_keys文件 - 同时检查 web 访问日志,一般位于
/var/log/nginx/access.log或/var/log/apache2/access.log,搜索 POST 请求、上传接口(upload)和可疑的 User-Agent 特征,确认攻击者是否通过 web 应用漏洞进入服务器
服务器数据库被删如何恢复,分场景处理
有近期物理备份或云快照
这是最省事的路径,登录云厂商控制台,进入云盘快照列表,选择最近一次正常时间点的快照,执行回滚操作。注意回滚会导致快照创建之后写入的新数据全部丢失,确认该时间段内没有重要业务数据产生后再操作。
开启了 binlog 但无完整备份
- 找到 binlog 中最后一次正常操作对应的 position 点
- 执行
mysqlbinlog --stop-position=操作前点值 mysql-bin.000012 | mysql -u root -p重放日志,将该点之前的数据变更恢复到数据库中 - 如果有多份 binlog,需要按顺序依次重放,期间注意跳过误操作语句,可以使用
--ignore-table或手动编辑 SQL 文件过滤
无备份无 binlog 的情况
需要评估残留文件的恢复价值:
- MySQL 的 InnoDB 引擎,如果表空间文件(.ibd)还在,但数据字典已被删,恢复难度较大,需要专业数据恢复工具处理
- 传统 MyISAM 引擎的 .frm、.MYD 文件若未被覆盖,仍有恢复可能
- 这类场景及时联系专业的数据恢复服务商处理,不建议自己反复尝试读写磁盘,那反而可能覆盖残留数据
堵住漏洞,防止数据库被再次清空
数据库层面的加固操作
- 修改 MySQL root 密码为16位以上随机字符串,包含大小写字母、数字、特殊符号,使用
ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码'; - 删除无用的 User 账号,禁用 root 远程登录,为业务单独配置最小权限账号:
GRANT SELECT,INSERT,UPDATE,DELETE ON 业务库. TO 'app'@'localhost'; - 修改数据库默认端口 3306 为自定义端口,同时防火墙层只对白名单 IP 放行
- 独立设置数据库服务器,与 web 服务器分离,通过内网互相访问,不暴露公网端口
- 开启数据库审计日志,记录所有敏感操作语句,为下次排查留证据
应用层面修复注入漏洞
数据库被清空,攻击者通常不是直接猜到数据库密码,而是通过网站存在的 SQL 注入漏洞或后台管理漏洞间接操作,排查逻辑如下:
- 对所有用户输入内容执行参数化查询或预编译语句,严禁直接拼接 SQL
- 管理后台路径不要使用默认的 admin、manage、system 等常见目录名
- 后台登录接口必须设置访问频率限制,可使用 Nginx 的
limit_req模块或 WAF 规则防止暴力破解 - 上传功能严格校验文件类型,禁止上传可执行文件到 web 目录,存储目录与前缀使用随机命名
服务器安全配置基线
| 配置项 | 建议值 |
|---|---|
| SSH 登录方式 | 禁止密码登录,仅允许密钥登录 |
| SSH 端口 | 修改为高端口(如 22122),不对外开放默认 22 |
| WEB 程序运行用户 | 使用 www 等低权限用户,禁止 root |
| fail2ban | 开启,连续失败 5 次封禁 IP 1 小时 |
| 系统补丁 | 每月更新一次安全补丁,长期不更新漏洞越来越多 |
使用 apt update && apt upgrade -y 或 yum update -y 让系统处于最新状态,同时关闭不使用的系统服务,systemctl stop rpcbind、systemctl stop postfix,降低被利用面。
服务器防护服务和数据安全建议
对于“服务器老是被清数据库”的运维场景,建议:
- 异地备份是底线:备份文件保存到独立存储,不同云厂商的对象存储更为稳妥,例如简米云 OSS、酷番云 COS,均支持跨地域冗余存储,防止单机房故障导致的备份同时丢失
- 用脚本每日自动备份数据库并上传至云端,同时保留近 14 天的备份版本,防止勒索病毒把旧备份也一并加密
- 设置了自动备份后还需定期演练恢复流程,确保备份文件可用
如果缺少专业运维人员,可以评估使用云平台自带的云防火墙和数据库审计产品,这类服务通常按月收费,具体价格根据厂商定价各有差异,相比数据被清后业务停摆的损失,这笔投入是值得的。
常见问题解答
服务器被入侵后必须重装系统吗?
不一定,如果排查确认后门仅存在于 web 目录和数据库层面,且没有发现内核级 rootkit,可以将数据库备份后重装系统,这是最稳妥的做法,重装后用新密码重新搭建环境,被再次入侵的风险比在原系统上手动清理残留要低得多。
排查服务器安全风险时如何判断是否为挖矿病毒?
挖矿病毒通常会导致 CPU 占用持续处于 80% 以上,并且网络连接中出现大量到矿池地址的外联连接,可以用 top 查看进程占用,再用 ss -antp 检查可疑外联 IP,一旦确认是挖矿病毒,需要禁用对应系统服务,删除计划任务和启动项中的持久化配置,然后更新所有弱口令。
数据库备份策略怎么设置才合理?
多数情况下建议至少设置每日凌晨 2 点执行一次全量备份,并保留 7 天以上,结合 binlog 可以实现秒级误操作回滚,云数据库产品普遍支持自动备份,可在控制台免费开启自动备份功能,备份文件默认保留 7 天至 30 天,需要恢复到任意时间点时可使用基于时间点的恢复功能。
服务器数据安全没有一劳永逸的解法,每次被清库都是一次安全审计机会,把上述排查步骤走完,服务器被请数据库的概率会大幅下降。