Debian服务器部署入侵检测系统,最直接的落地方式不是装一堆花哨的平台,而是先把内核级审计和文件完整性监控这两件事做扎实。很多管理员习惯在出事之后翻日志,但默认的rsyslog只能记录登录和部分服务事件,对进程执行、系统调用、关键目录变更几乎没有感知。真正能用于溯源和实时告警的,是auditd与基于inotify的文件监控组合,再配合一套轻量的HIDS规则引擎。下面直接讲部署和配置的具体步骤,所有操作在Debian 12上验证通过。
安装并配置auditd内核审计auditd是Linux内核自带的审计框架用户态工具,它能记录系统调用、文件访问、命令执行等底层事件。Debian默认没有安装,先执行:
apt update && apt install auditd audispd-plugins -y
安装完成后不要急着启动,先调整审计规则。主配置文件在/etc/audit/rules.d/audit.rules,清空默认内容后写入以下规则:
# 删除已有规则 -D # 设置缓冲区,避免高负载下丢事件 -b 8192 -f 2 # 监控/etc目录下所有写入和属性变更 -w /etc/ -p wa -k etc_changes # 监控/usr/bin和/usr/sbin下关键命令的执行 -w /usr/bin/ -p x -k bin_exec -w /usr/sbin/ -p x -k sbin_exec # 监控定时任务和启动项 -w /var/spool/cron/ -p wa -k cron_changes -w /etc/cron.d/ -p wa -k cron_changes -w /etc/cron.daily/ -p wa -k cron_changes -w /etc/cron.hourly/ -p wa -k cron_changes # 记录所有用户登录相关事件 -w /var/log/faillog -p wa -k logins -w /var/log/lastlog -p wa -k logins -w /var/log/tallylog -p wa -k logins # 监控敏感系统文件 -w /etc/passwd -p wa -k identity -w /etc/shadow -p wa -k identity -w /etc/group -p wa -k identity -w /etc/gshadow -p wa -k identity -w /etc/sudoers -p wa -k sudoers -w /etc/ssh/sshd_config -p wa -k sshd_config
规则中-p参数指定触发条件,w是写入,a是属性变更,x是执行,k后面是自定义标签,方便后续用ausearch按标签检索。保存后重启auditd服务:
systemctl restart auditd systemctl enable auditd
验证规则是否加载成功:
auditctl -l
如果输出你写入的所有规则,说明内核已经开始审计。现在可以用ausearch测试一下,比如查看最近5分钟内的文件变更事件:
ausearch -k etc_changes -ts recent
auditd默认把日志写入/var/log/audit/audit.log,这个文件增长很快,需要配置日志轮转。Debian已经自带了logrotate配置,但默认保留周期偏短,建议修改/etc/logrotate.d/auditd,把rotate改成12,保留至少一个月的数据用于溯源。
部署文件完整性监控AIDEauditd能记录变更动作,但无法直观告诉你哪个文件被改成了什么内容。AIDE(Advanced Intrusion Detection Environment)通过建立全盘或关键目录的哈希数据库,定期比对来发现文件内容变化。安装:
apt install aide -y
安装过程中会提示是否初始化数据库,选择No,我们先手动配置。编辑/etc/aide/aide.conf,默认配置已经比较完善,但需要根据Debian服务器实际情况调整监控范围。重点确认以下配置存在且未被注释:
# 监控权限、所有者、大小、修改时间、内容哈希 Checksums = sha256 OwnerMode = p+u+g Size = s Mtime = m Inode = i # 对/bin /sbin /usr/bin /usr/sbin使用完整检查 /bin Full /sbin Full /usr/bin Full /usr/sbin Full # 对/etc使用完整检查但排除一些频繁变化的文件 /etc Full !/etc/mtab !/etc/adjtime !/etc/udev/hwdb.bin
配置完成后生成初始数据库:
aideinit -y -f
这个命令会生成/var/lib/aide/aide.db.new并自动重命名为aide.db。以后每次需要检查时执行:
aide.wrapper --check
如果文件被篡改,输出中会列出具体差异。建议把检查命令加入cron每天执行一次,并将结果发送到管理员邮箱或写入日志:
echo "0 3 * * * root /usr/bin/aide.wrapper --check | mail -s 'AIDE Daily Report' admin@example.com" >> /etc/crontab
注意AIDE的数据库本身也可能被攻击者替换,所以生成数据库后应该把aide.db复制一份到离线介质或只读挂载的存储上。如果服务器有TPM或支持secure boot,可以考虑用dm-verity做更底层的保护,但这超出了本文范围。
部署轻量级HIDS:Wazuh Agentauditd和AIDE解决了底层记录和完整性校验,但缺少实时分析和集中告警能力。Wazuh是一个开源HIDS平台,Agent端非常轻量,Server端可以用单节点部署。这里只讲Agent在Debian上的部署,Server端假设你已经有一台管理节点。
添加Wazuh官方仓库并安装Agent:
curl -s https://packages.wazuh.com/key/GPG-KEY-WAZUH | gpg --no-default-keyring --keyring gnupg-ring:/usr/share/keyrings/wazuh.gpg --import && chmod 644 /usr/share/keyrings/wazuh.gpg echo "deb [signed-by=/usr/share/keyrings/wazuh.gpg] https://packages.wazuh.com/4.x/apt/ stable main" | tee /etc/apt/sources.list.d/wazuh.list apt update apt install wazuh-agent -y
安装后需要配置Agent指向你的Wazuh Server地址。编辑/var/ossec/etc/ossec.conf,找到server段:
192.168.1.100 1514 tcp
把address改成实际的管理节点IP。然后启动Agent:
systemctl enable wazuh-agent systemctl start wazuh-agent
Wazuh Agent默认会读取auditd日志、监控文件完整性、检测rootkit和异常行为。它和auditd不冲突,而是互补关系:auditd负责内核级原始记录,Wazuh负责分析、关联和告警。在Server端可以配置邮件、Slack等通知渠道,也可以写自定义规则检测特定攻击模式。
针对SSH暴力破解的实时阻断入侵检测不只是记录,还需要响应。Debian服务器最常见的攻击面是SSH,fail2ban是必备组件。安装:
apt install fail2ban -y
创建本地配置文件,不要直接修改默认的jail.conf:
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
编辑jail.local,重点调整以下参数:
[DEFAULT] bantime = 3600 findtime = 600 maxretry = 5 ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24 [sshd] enabled = true port = 22 filter = sshd logpath = /var/log/auth.log backend = systemd
这里bantime设为1小时,findtime窗口10分钟,最多尝试5次失败就封禁。ignoreip里加入你的内网管理网段,防止误封。重启fail2ban:
systemctl restart fail2ban systemctl enable fail2ban
查看当前封禁列表:
fail2ban-client status sshd
fail2ban的日志在/var/log/fail2ban.log,可以结合Wazuh的日志分析做更精准的联动。比如Wazuh检测到某个IP在扫描多个端口,可以触发脚本调用fail2ban-client手动封禁。
日志集中与快速检索有了auditd、AIDE、Wazuh和fail2ban,日志分散在多个位置,出问题时逐个翻效率太低。建议用journald作为统一入口,再配合lnav或直接grep做快速检索。Debian 12默认使用systemd-journald,确认/etc/systemd/journald.conf中Storage=persistent,这样日志会持久化到/var/log/journal。
日常排查时,用journalctl按时间、服务、优先级过滤:
# 查看最近1小时所有错误级别日志 journalctl -p err --since "1 hour ago" # 查看sshd服务今天的日志 journalctl -u ssh --since today # 跟踪auditd相关内核消息 journalctl -k -f | grep audit
如果需要更强大的全文检索和可视化,可以部署ELK或Grafana Loki,但对于单台Debian服务器来说,journald加grep已经足够应付大部分场景。关键是养成习惯:每次登录先看journalctl -p warning,每周做一次AIDE全量比对,每月审计一次auditd异常事件。
加固内核参数防止日志被清除攻击者入侵后第一件事往往是清理日志。除了文件权限,还可以通过内核参数限制对日志文件的删除和修改。编辑/etc/sysctl.d/99-security.conf:
# 防止普通用户查看dmesg kernel.dmesg_restrict = 1 # 限制ptrace,防止进程注入 kernel.yama.ptrace_scope = 2 # 开启地址空间随机化 kernel.randomize_va_space = 2 # 记录更多网络异常 net.ipv4.conf.all.log_martians = 1 net.ipv4.conf.default.log_martians = 1
应用配置:
sysctl -p /etc/sysctl.d/99-security.conf
同时把auditd和Wazuh的日志目录设置不可变属性,防止被rm删除:
chattr +a /var/log/audit/audit.log chattr +a /var/ossec/logs/alerts/alerts.log
chattr +a表示只能追加不能删除或覆盖,攻击者即使拿到root权限,在没有意识到这个属性的情况下也无法直接清除日志。注意这个属性会影响logrotate,需要先在logrotate配置中用prerotate脚本临时去掉属性,轮转后再加回来。
实际运维中的检测策略建议部署完上述工具后,真正的价值在于日常使用。建议把以下检查项固化成脚本,每天定时执行并汇总输出:
#!/bin/bash
echo "=== Failed SSH attempts today ==="
grep "Failed password" /var/log/auth.log | grep "$(date +%b\ %d)" | awk '{print $(NF-3)}' | sort | uniq -c | sort -nr | head -10
echo "=== AIDE changes ==="
aide.wrapper --check | grep -E "^(Added|Removed|Changed)" | head -20
echo "=== Auditd anomalies ==="
ausearch -ts today -k identity,etc_changes,sudoers | aureport -f -i | head -20
echo "=== Fail2ban bans ==="
fail2ban-client status sshd | grep "Currently banned"
把这个脚本保存为/usr/local/bin/security_check.sh,加入cron每天凌晨执行,输出重定向到/var/log/security_daily.log。坚持执行一周,你会对服务器的正常行为基线有清晰认识,任何偏离基线的活动都会更容易被发现。
入侵检测不是装完就完事,而是一个持续观察和调整的过程。auditd的规则要根据业务调整,AIDE的数据库要在每次合法变更后更新,Wazuh的告警阈值需要不断优化减少误报。Debian服务器安全的核心在于让攻击者的每一步操作都留下痕迹,并且这些痕迹能被及时看到。
