实时监控防篡改检测网站恶意代码:手把手搭建网站实时监控防篡改
为什么你需要实时监控网站文件
网站被植入恶意代码或文件被篡改,是站长最头疼的问题。
一旦被挂马,轻则收录异常、跳转广告,重则服务器被攻击。实时监控防篡改检测网站恶意代码能第一时间发现异动,帮你争取处理时间。
本文提供两种方案:
- 有宝塔面板的用户直接使用内置的“网站防篡改”插件。
- 非宝塔用户用 inotify + md5sum 脚本实现轻量监控。
---
准备工作
- 一台已运行网站的 Linux 服务器(CentOS 7+/Ubuntu 20+)。
- SSH 远程登录权限(或宝塔面板后台管理员权限)。
- 确定网站文件根目录路径(例如
/www/wwwroot/example.com)。
---
方案一:使用宝塔面板防篡改插件(推荐新手)
- 登录宝塔面板,进入“软件商店”,搜索“网站防篡改”并安装(免费版可用)。
- 安装完成后点击“设置”,在“目录白名单”中输入你的网站根目录(如
/www/wwwroot/example.com)。 - 启用“实时防护”,建议同时开启“文件改动通知”。
- 如果网站有需要动态写入的目录(如缓存目录
/runtime、上传目录/uploads),请添加到“排除目录”,否则会误报。 - 点击“开启防护”,面板会自动监控所有文件的修改、删除、新建操作,一旦发现变化会记录日志并可以发送告警邮件。
效果验证:手动在网站根目录新建一个 test.html,几秒后台面板日志中会出现“文件新增”记录。
---
方案二:使用 inotify + md5sum 脚本(适合非宝塔环境)
此方案需要 Linux 内核支持 inotify(2.6.13+ 默认支持)。
步骤1:安装 inotify-tools
# CentOS/RHEL
yum install -y inotify-tools
# Ubuntu/Debian
apt install -y inotify-tools
步骤2:创建监控脚本
新建文件 /opt/file_monitor.sh,内容如下:
#!/bin/bash
# 网站根目录
WATCH_DIR="/www/wwwroot/example.com"
# 日志文件
LOG_FILE="/var/log/website_monitor.log"
# 基准哈希文件
BASELINE_FILE="/opt/baseline.md5"
echo "$(date) - 开始监控 $WATCH_DIR" >> "$LOG_FILE"
# 生成基准哈希(首次运行)
find "$WATCH_DIR" -type f -not -path "*/runtime/*" -not -path "*/uploads/*" -exec md5sum {} \; > "$BASELINE_FILE"
# 实时监控
inotifywait -mrq --timefmt '%Y-%m-%d %H:%M:%S' --format '%T %w%f %e' \
-e modify,delete,create,move "$WATCH_DIR" | while read change; do
# 排除目录检查(这里简单示例,实际用 if 判断路径)
echo "$change" | grep -qE "(runtime|uploads)" && continue
# 记录变更
echo "$(date) - 检测到变更: $change" >> "$LOG_FILE"
# 重新计算文件哈希并与基准比较(如需更深检测可扩展)
file=$(echo "$change" | awk '{print $NF}')
if [ -f "$file" ]; then
new_md5=$(md5sum "$file" | awk '{print $1}')
old_md5=$(grep " $file$" "$BASELINE_FILE" | awk '{print $1}')
if [ "$new_md5" != "$old_md5" ]; then
echo "$(date) - 告警:文件 $file 内容已修改" >> "$LOG_FILE"
fi
fi
done
步骤3:设置为后台运行并开机自启
chmod +x /opt/file_monitor.sh
nohup /opt/file_monitor.sh &
echo "@reboot root /opt/file_monitor.sh" >> /etc/crontab
提示:脚本中排除了 runtime 和 uploads 目录,请根据实际业务调整。
---
避坑指南
- 排除动态目录:缓存、上传、日志等频繁写入的目录一定要排除,否则日志会刷爆。
- 监控文件数量:网站文件过多时 inotify 可能达到最大监控数限制(
/proc/sys/fs/inotify/max_user_watches),可用echo 81920 > /proc/sys/fs/inotify/max_user_watches临时调大,如需持久化修改/etc/sysctl.conf。 - 误报处理:如果是正常更新程序或手动上传文件,先在防篡改系统中放行,而不是关闭监控。
- 恶意代码特征:监控到文件中突然出现
base64_decode、eval、system等函数,或者文件被插入标签,立即隔离并查看访问日志。
---
效果验证
- 在网站根目录创建一个非排除目录的文件(例如
test_vuln.php),内容随意。 - 如果是宝塔方案,查看“网站防篡改”插件的日志,应能看到文件新增记录。
- 如果是脚本方案,查看
/var/log/website_monitor.log,应出现类似输出:
2025-04-01 12:00:00 - 检测到变更: CREATE /www/wwwroot/example.com/test_vuln.php
2025-04-01 12:00:01 - 告警:文件 /www/wwwroot/example.com/test_vuln.php 内容已修改
- 删除测试文件,确认监控恢复正常。
---
常见问题解答
Q:监控后发现文件被篡改怎么办?
A:立即根据日志找到被改文件,用备份还原。同时检查网站是否还有后门,并升级 CMS 和插件。
Q:宝塔防篡改插件付费吗?
A:宝塔面板免费版即可使用基础功能,企业版提供更多高级防护。
Q:脚本方式能否直接拦截篡改?
A:脚本只检测和告警,不自动拦截。若需自动恢复,可结合 rsync 从备份同步。
Q:监控影响网站性能吗?
A:inotify 基于内核事件,对性能影响极小;宝塔插件也是类似原理,正常运行下无感。
---
如果你正在处理实时监控防篡改检测网站恶意代码,建议先按本文步骤完整执行,再根据自己的环境做微调;
遇到异常时优先回看避坑和高频问题部分。