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,保留至少一个月的数据用于溯源。

部署文件完整性监控AIDE

auditd能记录变更动作,但无法直观告诉你哪个文件被改成了什么内容。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 Agent

auditd和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服务器安全的核心在于让攻击者的每一步操作都留下痕迹,并且这些痕迹能被及时看到。