Nginx 本身不提供配置文件被篡改自动告警的内置功能,但可通过 inotifywait 实时监听 + sha256sum 完整性校验 + 邮件/钉钉告警组合实现;需配合文件权限加固(644/只读)、auditd 审计及禁用非授权编辑工具。

Nginx 本身不提供“配置文件被篡改自动告警”的内置功能,但可以通过组合系统级监控工具 + 文件完整性校验 + 告警触发机制来实现。核心思路是:监控 /etc/nginx/ 目录下关键配置文件的变更,并在检测到修改时立即通知运维人员。
以下是一套轻量、可靠、生产可用的实施方案,无需重写 Nginx,也不依赖外部日志分析平台:
? 1. 使用 inotifywait 实时监听配置文件变化
inotifywait(来自 inotify-tools)能高效监听文件系统事件,比轮询更省资源。
✅ 安装与基础监听
# CentOS/RHEL sudo yum install -y inotify-tools # Ubuntu/Debian sudo apt install -y inotify-tools
✅ 创建监听脚本 /usr/local/bin/nginx-conf-watch.sh:
#!/bin/bash
CONFS="/etc/nginx/nginx.conf /etc/nginx/conf.d/*.conf"
LOG="/var/log/nginx/conf-change.log"
ALERT_CMD="echo \"⚠️ Nginx config changed at $(date)\" | mail -s 'Nginx Config Alert' admin@example.com"
while inotifywait -e modify,move,create,delete,attrib $CONFS 2>/dev/null; do
echo "$(date): Nginx configuration modified" >> "$LOG"
$ALERT_CMD
# 可选:自动 reload 并记录结果
if nginx -t &>/dev/null; then
systemctl reload nginx
echo "$(date): Nginx reloaded successfully" >> "$LOG"
else
echo "$(date): Nginx config test failed — NOT reloaded" >> "$LOG"
fi
done✅ 赋予执行权限并后台运行:
sudo chmod +x /usr/local/bin/nginx-conf-watch.sh sudo nohup /usr/local/bin/nginx-conf-watch.sh > /dev/null 2>&1 &
⚠️ 注意:
inotifywait默认只监听一级目录,*.conf通配符需配合 shell 展开(启动时生效),如需动态新增 conf 文件,建议监听整个/etc/nginx/conf.d/目录并过滤.conf后缀。
?️ 2. 加入文件完整性校验(防静默篡改)
inotifywait 只能捕获“有写操作”,但无法识别是否被恶意替换为相同内容的伪造文件。增强方案:用 sha256sum 做基线校验。
✅ 生成初始校验和(首次部署时运行一次):
sudo sha256sum /etc/nginx/nginx.conf /etc/nginx/conf.d/*.conf > /etc/nginx/conf.sha256
✅ 在监听脚本中加入校验逻辑(替换原 while 循环内部分):
if ! sha256sum -c /etc/nginx/conf.sha256 --quiet 2>/dev/null; then
echo "$(date): Integrity check FAILED — config files altered!" >> "$LOG"
$ALERT_CMD
# 可选:恢复备份或阻断 reload
fi✅ 每次 reload 成功后,自动更新校验和(确保合法变更也被记录):
sudo sha256sum /etc/nginx/nginx.conf /etc/nginx/conf.d/*.conf > /etc/nginx/conf.sha256
? 3. 告警通道灵活接入
邮件是最基础方式,但推荐升级为:
-
企业微信/钉钉机器人:用
curl发送 JSON 消息 -
Prometheus + Alertmanager:将变更事件暴露为指标(如
nginx_config_modified{host="xxx"} 1),纳入统一告警体系 -
Syslog + ELK:写入 rsyslog,由 Logstash 提取
config_change字段触发告警
例如钉钉示例(替换 $ALERT_CMD):
WEBHOOK="https://oapi.dingtalk.com/robot/send?access_token=xxx"
curl -H 'Content-Type: application/json' -d "{\"msgtype\": \"text\", \"text\": {\"content\": \"? Nginx config changed on $(hostname) at $(date)\"}}" $WEBHOOK✅ 补充加固建议(防篡改源头)
- 设置配置文件为只读(仅 root 可写):
sudo chown root:root /etc/nginx/nginx.conf /etc/nginx/conf.d/*.conf sudo chmod 644 /etc/nginx/nginx.conf /etc/nginx/conf.d/*.conf
- 禁用非必要编辑工具(如禁止普通用户使用
vim直接编辑) - 配合 SELinux/AppArmor 限制进程写入
/etc/nginx/的能力 - 关键环境启用
auditd审计所有chmod/chown/write操作(审计规则示例):sudo auditctl -w /etc/nginx/ -p wa -k nginx_config_change
不复杂但容易忽略


















