网站篡改监控,文件变动实时告警:网站篡改监控实战
网站被篡改往往在访问异常时才被发现,而手动检查文件不仅效率低,还容易遗漏。
本文介绍一套轻量级方案,利用 Linux 的 inotify 机制监控网站目录,一旦文件被修改、删除或新增,立即通过邮件或 Webhook 发送告警。
整个过程不需要复杂的安全平台,适合个人站长和刚接触服务器运维的用户。
监控方案选型与准备工作
搜索“网站篡改监控”的用户通常希望找到能实时告警、部署简单的工具。
常见方案有商业监控平台、开源的 Tripwire 或 AIDE,以及基于 inotify 的自定义脚本。
对于零基础用户,推荐从 inotify + Python 脚本入手,因为它依赖少、规则灵活,且能快速看到效果。
在开始前,请确认服务器满足以下条件:
- 操作系统为常见 Linux 发行版(如 Ubuntu 20.04+、CentOS 7+)。
- 已安装 Python 3 和 pip。
- 拥有网站目录的读取权限,通常为
/www/wwwroot/你的域名或/var/www/html。 - 准备一个接收告警的邮箱或即时通讯工具(如钉钉、企业微信)的 Webhook 地址。
如果尚未安装 Python 3,可执行apt install python3 python3-pip -y(Debian/Ubuntu)或yum install python3 python3-pip -y(CentOS)。
安装 inotify 工具并编写监控脚本
inotify 是 Linux 内核提供的文件系统事件通知机制,通过 inotifywait 命令可以监听目录变化。
第一步:安装 inotify-tools
# Ubuntu/Debian
apt install inotify-tools -y
# CentOS
yum install inotify-tools -y
第二步:创建监控脚本
新建文件 /opt/website_monitor.py,内容如下:
import subprocess
import requests
import time
WATCH_DIR = '/www/wwwroot/yourdomain.com' # 替换为你的网站目录
WEBHOOK_URL = 'https://your-webhook-url' # 替换为实际的告警地址
cmd = ['inotifywait', '-m', '-r', '-e', 'modify,create,delete,move', '--format', '%w%f %e', WATCH_DIR]
process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
for line in process.stdout:
filepath, event = line.strip().split(' ', 1)
message = f"网站文件变动告警\n文件: {filepath}\n事件: {event}\n时间: {time.strftime('%Y-%m-%d %H:%M:%S')}"
try:
requests.post(WEBHOOK_URL, json={'text': message}, timeout=5)
except Exception as e:
print(f"告警发送失败: {e}")
print(message)
第三步:安装 Python 依赖
pip3 install requests
第四步:运行脚本并验证
python3 /opt/website_monitor.py
在另一个终端中修改网站目录下的任意文件,
例如 echo 'test' >> /www/wwwroot/yourdomain.com/index.php,
观察脚本是否输出变动信息并发送告警。
配置后台运行与告警渠道对接
直接运行脚本会在关闭终端后停止,建议使用 systemd 管理。
创建服务文件 /etc/systemd/system/website-monitor.service:
[Unit]
Description=Website File Monitor
After=network.target
[Service]
Type=simple
ExecStart=/usr/bin/python3 /opt/website_monitor.py
Restart=always
User=root
[Install]
WantedBy=multi-user.target
执行以下命令启用服务:
systemctl daemon-reload
systemctl enable website-monitor
systemctl start website-monitor
systemctl status website-monitor
如果使用钉钉或企业微信机器人,只需将 WEBHOOK_URL 替换为对应的机器人地址,并调整请求体格式。
例如钉钉机器人需要发送 JSON 数据:
requests.post(WEBHOOK_URL, json={'msgtype': 'text', 'text': {'content': message}})
常见报错与避坑要点
- 脚本无输出:检查
WATCH_DIR路径是否正确,以及当前用户是否有读取权限。 - 告警发送失败:确认 Webhook 地址可访问,服务器能解析外网域名,必要时关闭防火墙测试。
- 监控目录过大导致延迟:inotify 有默认监听数量限制,可通过
sysctl fs.inotify.max_user_watches=524288调整。 - 误报频繁:网站程序自身会生成缓存文件,建议在脚本中过滤
.log、.cache等后缀。 - 不要监控整个根目录:仅监控网站实际目录,避免系统文件变动干扰。
如何确认监控是否生效
完成配置后,按以下顺序验证:
- 查看服务状态:
systemctl status website-monitor显示active (running)。 - 手动创建测试文件:
touch /www/wwwroot/yourdomain.com/test.txt。 - 检查告警接收端是否收到消息,同时查看脚本日志
journalctl -u website-monitor -f。 - 删除测试文件,确认再次收到删除告警。
如果以上步骤均正常,说明文件变动实时告警已生效。
日常运维中,建议定期检查服务是否运行,并关注告警频率,过于频繁的告警可能意味着网站正被频繁修改,需要进一步排查原因。
常见疑问
监控脚本会影响服务器性能吗?
inotify 是内核事件通知,资源占用极低。
但在监控数十万文件的大目录时,需要调整内核参数。
如果网站使用宝塔面板,路径怎么写?
宝塔默认网站目录为 /www/wwwroot/域名,直接在脚本中替换即可。
能否同时监控多个网站?
可以,在脚本中维护一个目录列表,循环启动多个 inotifywait 进程,或使用 -r 递归监控上级目录。