You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何审计容器进程系统调用?使用auditd区分容器与宿主机进程遇阻

用auditd区分宿主机与容器进程的解决方案

一、修复“排除宿主机进程”方法的问题

你之前的脚本无效,核心原因是容器内的/usr/bin并非宿主机的/usr/bin目录——容器文件系统是独立的overlay挂载,容器里的/usr/bin实际对应宿主机上的容器镜像层路径(比如/var/lib/docker/overlay2/<hash>/merged/usr/bin),所以你用dir=/usr/bin的规则只会排除宿主机自身的/usr/bin下进程,对容器内的进程完全无效。

另外,即使路径匹配正确,auditd规则的生效逻辑也需要注意:exit,never规则需放在exit,always规则之前(你的脚本顺序是对的),但针对宿主机进程的排除应该精确匹配宿主机的可执行文件路径,示例脚本如下:

#!/bin/bash
auditctl -D
# 排除宿主机/usr/bin下的所有进程调用
auditctl -a exit,never -S all -F path=/usr/bin/ -k key_exclude
# 排除宿主机/bin下的所有进程调用
auditctl -a exit,never -S all -F path=/bin/ -k key_exclude
# 监控所有exit_group调用
auditctl -a exit,always -S exit_group -k key_match
auditctl -l

不过这种方法局限性很大——如果容器挂载了宿主机的/bin//usr/bin,或者容器内其他路径的进程仍会被监控,因此更可靠的方案是基于进程树的匹配。

二、监控containerd-shim及其子进程的实现

所有容器进程都是containerd-shim-runc-v2的后代进程,你可以通过auditd的字段特性实现精准监控:

方法1:动态获取shim进程ID并监控后代

自动获取所有shim进程的PID,为每个shim的后代进程添加审计规则:

#!/bin/bash
auditctl -D

# 获取所有containerd-shim-runc-v2的PID
SHIM_PIDS=$(pgrep containerd-shim-runc-v2)

for pid in $SHIM_PIDS; do
    # 监控该shim的所有后代进程的exit_group调用
    auditctl -a exit,always -S exit_group -F ancestor=$pid -k container_process
done

auditctl -l

方法2:通过进程名匹配shim的子进程

如果shim进程名固定为containerd-shim-runc-v2,可以直接匹配父进程名为该值的进程:

#!/bin/bash
auditctl -D
# 监控所有父进程是containerd-shim-runc-v2的进程的exit_group调用
auditctl -a exit,always -S exit_group -F ppid=containerd-shim-runc-v2 -k container_process
# 可选:监控shim进程自身
auditctl -a exit,always -S exit_group -F comm=containerd-shim-runc-v2 -k container_shim
auditctl -l

关键注意事项

  • auditd的ancestor字段需要内核版本≥3.10支持,确保你的系统内核满足要求;
  • 新启动的容器会生成新的shim进程,需重新运行脚本添加规则,或用systemd定时器定期更新规则;
  • 可通过ausearch -k container_process验证规则是否生效,查看捕获的容器进程审计日志。

内容的提问来源于stack exchange,提问作者jing-rui

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 11:57:25