inotifywait 实时监控 Web 目录,捕获异常文件写入行为并自动隔离,核心是精准捕获+快速响应。监控非运维时段高危文件创建、可疑命名、777权限及一句话木马签名,脚本过滤安全扩展名、匹配恶意特征后移至隔离区,并建议白名单排除、频率限制、低权限运行及 systemd 托管。

用 inotifywait 实时监控 Web 目录,发现异常文件(如 PHP 木马)后自动移动到隔离区,是低成本、高响应的主动防御手段。关键不在于“全量扫描”,而在于“精准捕获写入行为 + 快速响应”。
一、明确监控目标和恶意特征
Web 目录下不该出现以下行为:
- 非运维时段(如凌晨 2–4 点)大量 PHP/JS/HTA 文件被创建或修改
- 文件名含可疑关键词:
shell、cmd、eval、base64_decode、assert、preg_replace(带/e修饰符)等 - 新文件权限为
777或属主为www-data但非部署用户创建 - 文件内容包含典型一句话木马签名(如
$_POST[.*?]+eval/assert)
二、基础 inotifywait 监控脚本(带隔离逻辑)
以下是一个最小可用版本,保存为 /opt/bin/watch-web.sh:
#!/bin/bash
WEB_DIR="/var/www/html"
QUARANTINE="/var/quarantine/$(date +%Y%m%d)"
LOG_FILE="/var/log/inotify-web.log"
# 创建隔离目录
mkdir -p "$QUARANTINE"
# 持续监听关键事件
inotifywait -m -e create,close_write,move_to --format '%w%f %e' "$WEB_DIR" | while read file event; do
# 过滤掉临时文件、日志、图片等安全扩展名
[[ "$file" =~ \.(jpg|jpeg|png|gif|css|js|txt|log)$ ]] && continue
# 只处理 PHP、HTM、HTML、JS、SH 等高风险类型
[[ "$file" =~ \.(php|phtml|php3|php4|php5|htm|html|js|sh|pl)$ ]] || continue
# 检查是否为恶意内容(简单签名匹配)
if grep -qE '(eval\(|assert\(|base64_decode\(|system\(|exec\(|shell_exec\(|preg_replace\([^)]*\/e)' "$file" 2>/dev/null; then
mv "$file" "$QUARANTINE/$(basename "$file").quarantine.$(date +%s)" 2>/dev/null
echo "$(date) [ALERT] Malicious pattern detected: $file → isolated" >> "$LOG_FILE"
# 可选:发邮件或调用告警接口
logger "Web malware isolated: $(basename "$file")"
fi
done
三、增强防护的实用建议
-
避免误杀:在
grep判断前加白名单检查,比如排除vendor/、node_modules/、wp-includes/等合法第三方目录(用[[ "$file" == *"/vendor/"* ]]跳过) -
限制触发频率:用
sleep 0.1或rate-limit工具防洪水式创建导致脚本卡死 -
权限最小化:脚本以低权限用户(如
monitor)运行,不能有rm或chown权限,只允许mv到预设隔离目录 -
配合 auditd 补充审计:
inotifywait不记录谁写的,可用auditctl -w /var/www/html -p wa -k web_write记录进程和 UID
四、部署与守护
别依赖手动启动:
- 用
systemd托管:写/etc/systemd/system/web-watch.service,设置Restart=always - 禁止直接编辑 Web 目录:把
/var/www/html设为root:www-data,权限755,上传走 SFTP/CI,不开放写权限给 Web 进程 - 每天清理旧隔离文件:
find /var/quarantine -mtime +7 -delete(先测试!)

















