深色模式
入侵检测 HIDS:OSSEC 与 Falco 实战
摘要:HIDS 解决的是"防线被突破之后怎么发现"。本文用 Falco 检测容器与主机运行时异常行为,用 Wazuh(OSSEC 后继)做日志关联与文件完整性检测,并给出告警降噪与接入方式。
适用环境
bash
cat /etc/os-release
uname -r
command -v falco && falco --version
command -v docker && docker --version
ls /var/ossec/bin/ossec-control 2>/dev/null && echo "Wazuh/OSSEC agent 已安装"1
2
3
4
5
2
3
4
5
操作步骤
1. 选型:两类 HIDS 分工不同
| 工具 | 检测原理 | 擅长 |
|---|---|---|
| Falco | eBPF/内核模块系统调用 | 容器逃逸、异常进程、反弹 Shell |
| Wazuh (OSSEC) | 日志 + FIM + 漏洞库 | 登录异常、配置变更、合规检查 |
建议两者并用:Falco 抓运行时,Wazuh 抓日志与完整性。
2. Falco:现代内核模块/eBPF 安装
bash
# 参考官方文档添加仓库后(以官方脚本为准)
curl -fsSL https://falco.org/repo/falcosecurity-3672BA8F.asc | gpg --dearmor -o /usr/share/keyrings/falco.gpg
# Debian/Ubuntu 示例源
echo "deb [signed-by=/usr/share/keyrings/falco.gpg] https://download.falco.org/packages/deb stable main" \
> /etc/apt/sources.list.d/falco.list
apt-get update && apt-get install -y falco
systemctl enable --now falco
systemctl status falco --no-pager | head -101
2
3
4
5
6
7
8
2
3
4
5
6
7
8
eBPF 与内核模块二选一
现代发行版推荐 eBPF 驱动,避免编译内核模块。安装失败时先检查内核头文件是否齐全。
3. Falco:自定义检测规则
yaml
# /etc/falco/rules.d/custom.yaml
- rule: 敏感目录被写入可执行文件
desc: 检测在 /etc /bin /usr/bin 下创建可执行文件
condition: >
(open_write or creat) and
fd.directory in (/etc, /bin, /usr/bin, /usr/sbin) and
evt.type in (open, openat, creat) and
not proc.name in (dnf, apt, yum, dpkg, rpm)
output: "敏感目录写入 file=%fd.name proc=%proc.name user=%user.name container=%container.id"
priority: WARNING
tags: [filesystem, persistence]
- rule: 容器内启动 shell
desc: 容器里出现交互式 shell,常见于入侵后操作
condition: >
container.id != host and
proc.name in (bash, sh, zsh, ash) and
proc.pname in (nginx, java, node, python)
output: "容器内启动 shell cmd=%proc.cmdline container=%container.name image=%container.image.repository"
priority: CRITICAL
tags: [container, shell]1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
bash
falco --validate /etc/falco/rules.d/custom.yaml
systemctl restart falco1
2
2
4. 触发测试并看告警
bash
# 触发默认规则:读取敏感文件
cat /etc/shadow > /dev/null
journalctl -u falco --since "1 min ago" | grep -i "warning\|critical" | tail -51
2
3
2
3
5. Wazuh agent:日志与完整性检测
bash
# 安装 agent(地址替换为你的 manager)
WAZUH_MANAGER="10.0.0.10" apt-get install -y wazuh-agent # Debian 示例
systemctl enable --now wazuh-agent
systemctl status wazuh-agent --no-pager | head -51
2
3
4
2
3
4
配置文件关键段 /var/ossec/etc/ossec.conf:
xml
<syscheck>
<frequency>43200</frequency>
<directories check_all="yes" report_changes="yes">/etc,/usr/bin,/usr/sbin</directories>
<directories check_all="yes" report_changes="yes">/bin,/sbin</directories>
<ignore>/etc/mtab,/etc/hosts.deny</ignore>
</syscheck>
<rootcheck>
<frequency>43200</frequency>
</rootcheck>1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
重启生效:systemctl restart wazuh-agent。
6. 告警接入与降噪
yaml
# falco.yaml 片段:输出到文件与 webhook
json_output: true
json_include_output_property: true
program_output:
enabled: true
keep_alive: false
program: "/usr/local/bin/falco-alert.sh"1
2
3
4
5
6
7
2
3
4
5
6
7
降噪三步法:
- 先在非生产跑一周,统计告警 Top 20。
- 对合法行为用
tags/proc.pname加白名单,而不是关规则。 - 分级:CRITICAL 电话,WARNING 工单,INFO 日报。
验证
bash
systemctl is-active falco wazuh-agent
falco --validate /etc/falco/rules.d/custom.yaml && echo "规则语法 OK"
# 模拟反弹 shell 行为(本机 nc 监听,仅测试环境)
timeout 3 bash -c 'exec 3<>/dev/tcp/127.0.0.1/4444' 2>/dev/null
journalctl -u falco --since "2 min ago" | tail -10
# Wazuh 侧
/var/ossec/bin/agent_control -l 2>/dev/null || systemctl status wazuh-agent | head -51
2
3
4
5
6
7
2
3
4
5
6
7
判定标准:模拟行为能触发 CRITICAL 告警;告警在 1 分钟内到达值班渠道;误报率可接受。
常见坑
内核模块装不上就放弃
改用 eBPF 驱动(FALCO_DRIVER_KIND=ebpf),或升级到受支持的内核版本。
直接禁用吵闹的规则
等于关掉检测。正确做法是细化 condition 加白名单,并保留审计记录。
告警量太大没人看
HIDS 的价值取决于信噪比。上线初期必须花时间做白名单,宁可规则少而准。
只在生产装,测试环境没覆盖
攻击者往往先在测试环境落脚。HIDS 应全网覆盖。
agent 自身被停止无人知晓
监控 agent 进程存活与心跳断连,否则被入侵者停掉就完全失明。