容器内启用内核审计需同时配置cap_add: [audit_write]和自定义seccomp profile允许audit_*系统调用,security_opt仅用于加载配置,不能单独解禁审计功能。

在 Docker Compose 中,security_opt 主要用于向容器传递低层安全策略参数,比如 SELinux 标签、AppArmor 配置文件,或禁用特定的 seccomp 或 capabilities 限制。但需要明确一点:security_opt 本身不能“解禁内核审查”(如 audit subsystem 或 kernel auditing)——Linux 内核的审计框架(auditd / CONFIG_AUDIT=y)运行在宿主机层面,容器默认不直接启用或控制它;容器内进程触发的审计事件是否上报,取决于宿主机 audit 规则、内核配置及容器是否具备 AUDIT_WRITE capability。
不过,如果你实际想达成的是:
- 让容器内进程能调用
audit_log()、audit_rule_add()等审计相关系统调用 - 或避免因缺少
AUDIT_WRITEcapability 而被内核拒绝审计操作 - 或绕过 seccomp 默认策略对 audit 相关 syscalls 的拦截
那么真正起作用的是 capabilities 和 seccomp 配置,而非 security_opt 单独完成。
以下是实用路径:
✅ 正确做法:通过 cap_add 显式添加 AUDIT_WRITE
该 capability 允许进程向内核 audit subsystem 写入日志(如调用 audit_log_start())。Docker 默认丢弃此 capability,需手动加入:
services:
myapp:
image: alpine:latest
cap_add:
- AUDIT_WRITE
# 可选:若还需其他审计相关能力
# cap_add:
# - AUDIT_CONTROL
# - AUDIT_READ
⚠️ 注意:
AUDIT_WRITE是特权能力,仅应在可信镜像中启用,且宿主机必须已启用 audit(auditctl -s可查状态)。
✅ 配合 seccomp:解除对 audit syscalls 的拦截
Docker 默认使用 default.json seccomp profile,它会屏蔽 audit_* 类系统调用(如 audit_rule_add, audit_log_acct_message)。若应用需调用这些接口,需自定义 seccomp profile:
-
创建
seccomp-audit.json,在syscalls数组中允许相关调用:{ "defaultAction": "SCMP_ACT_ERRNO", "architectures": ["SCMP_ARCH_X86_64"], "syscalls": [ { "names": ["audit_log_acct_message", "audit_rule_add", "audit_rule_del", "audit_setloginuid"], "action": "SCMP_ACT_ALLOW" } ] } -
在
docker-compose.yml中引用:services: myapp: image: alpine:latest cap_add: - AUDIT_WRITE security_opt: - seccomp:./seccomp-audit.json
❌ security_opt 单独无法启用内核审计功能
例如以下写法无效:
security_opt: - label:disable # 这是 SELinux/AppArmor 相关,和 audit 无关 - apparmor:unconfined
它们影响访问控制策略,但不决定 audit subsystem 是否可用或可写。
? 验证是否生效
进入容器后检查:
# 查看 capability 是否存在 cat /proc/1/status | grep CapEff # 尝试触发 audit 日志(需宿主机 auditd 运行) apk add audit-libs && auditctl -s 2>/dev/null || echo "auditctl not available or no permissions"
若返回 Permission denied,说明 AUDIT_WRITE 缺失或 seccomp 拦截仍存在。
综上,真正控制容器能否参与内核审计的关键是:
-
cap_add: [AUDIT_WRITE](必要前提) - 自定义
seccompprofile 解放 audit 相关 syscall(按需) -
security_opt仅作为加载 seccomp 或 AppArmor 的载体,不直接“解禁审查”
不复杂但容易忽略。











