本方案基于CentOS 7/8系统构建,利用Linux内核的inotify机制监控文件变化,配合rsync实现毫秒级自动恢复。首先需要安装核心依赖工具。执行以下命令安装inotify-tools和rsync:
yum install -y inotify-tools rsync
如果系统提示找不到包,请先执行yum makecache更新缓存。安装完成后,使用inotifywait --help命令验证工具是否正常可用。
防篡改的核心在于“对比恢复”,因此需要一个绝对纯净的备份目录作为数据源。假设你的Web站点根目录为/www/wwwroot,我们将备份目录设定为/data/backup_web。执行以下命令创建目录并同步初始数据:
mkdir -p /data/backup_web
rsync -avz --delete /www/wwwroot/ /data/backup_web/
注意:请务必确保/data/backup_web中的文件是已知的、安全的版本。后续系统将以此目录为准,强制覆盖Web根目录下的任何变动。
创建一个监控脚本/usr/local/bin/web_guard.sh。该脚本将死循环监控Web目录,一旦检测到修改、删除、创建或移动操作,立即触发同步恢复。
cat > /usr/local/bin/web_guard.sh << 'EOF'
!/bin/bash
定义源目录(备份)和目标目录(Web根目录)
SRC_DIR="/data/backup_web"
DST_DIR="/www/wwwroot"
LOG_FILE="/var/log/web_guard.log"
排除不需要监控的日志文件或缓存目录,避免频繁IO
EXCLUDE="--exclude=.log --exclude=runtime/cache/"
记录日志函数
log_msg() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> $LOG_FILE
}
log_msg "防篡改守护进程启动..."
使用inotifywait监控
-m: 持续监控
-r: 递归监控子目录
-q: 安静模式,仅输出事件
-e: 监控的事件类型(修改、删除、创建、移动、属性变更)
inotifywait -mrq -e modify,delete,create,move,attrib $DST_DIR | while read event
do
检测到变化,休眠0.5秒防止频繁触发(如编辑器保存时的多次写入)
sleep 0.5
log_msg "检测到文件变动: $event"
log_msg "开始从备份源恢复数据..."
执行同步,强制将DST_DIR恢复为SRC_DIR的状态
rsync -avz --delete $EXCLUDE $SRC_DIR/ $DST_DIR/
if [ $? -eq 0 ]; then
log_msg "恢复成功,文件已还原。"
else
log_msg "恢复失败,请检查错误!"
fi
done
EOF
脚本编写完成后,必须赋予执行权限,否则无法运行:
chmod +x /usr/local/bin/web_guard.sh
为了确保脚本在服务器重启后自动运行,且崩溃后能自动重启,我们需要将其注册为Systemd服务。创建服务文件/etc/systemd/system/webguard.service:
cat > /etc/systemd/system/webguard.service << 'EOF'
[Unit]
Description=Web Site Anti-Tamper Daemon
After=network.target
[Service]
Type=simple
User=root
ExecStart=/usr/local/bin/web_guard.sh
Restart=on-failure
RestartSec=5s
[Install]
WantedBy=multi-user.target
EOF
接下来执行以下命令重载systemd配置并启动服务:

systemctl daemon-reload
systemctl enable webguard
systemctl start webguard
使用systemctl status webguard查看服务状态,确保显示为active (running)。此时,系统已经在后台实时监控Web目录。
除了实时恢复,利用Linux的chattr命令锁定核心文件是防篡改的第二道防线。设置+i属性后,即便是root用户也无法删除或修改该文件,除非先解锁。进入备份目录对关键文件进行加锁:
锁定备份目录中的所有PHP和HTML文件
find /data/backup_web -type f \( -name ".php" -o -name ".html" \) -exec chattr +i {} \;
同样,建议对生产环境的Web目录也执行加锁操作,这样即便监控脚本有延迟,黑客也无法直接写入shell:
find /www/wwwroot -type f \( -name ".php" -o -name ".html" \) -exec chattr +i {} \;
解除锁定命令:如果需要更新网站代码,必须先执行chattr -i 文件名解除锁定,修改完成后记得重新加锁。
完成上述配置后,进行一次模拟攻击测试。在Web根目录下创建一个测试文件test_hack.php:
touch /www/wwwroot/test_hack.php
等待约1秒钟,然后查看该文件是否存在:
ls -l /www/wwwroot/test_hack.php
如果系统配置正确,命令将提示“No such file or directory”,因为监控脚本检测到创建事件后,立即利用rsync的--delete参数将其删除了。查看日志文件可以确认恢复过程:
tail -f /var/log/web_guard.log
日志中应包含“检测到文件变动”和“恢复成功”的记录。至此,一套具备实时监控、自动恢复和底层加锁的全站防篡改系统已部署完成。












易频IT社区是综合性互联网IT技术门户网站,专注分享网络技术、服务器运维、网络安全、编程开发、系统架构、云计算、大数据等行业干货,实时更新IT行业资讯、零基础教程、实战案例,为IT从业者、技术爱好者提供专业的学习交流平台。
Copyright © 2021-2026 易频IT社区. All Rights Reserved. 备案号:闽ICP备2023013482号 网站地图