Docker Daemon 审计日志需依赖宿主机 auditd 服务,通过 auditctl 监控 /usr/bin/dockerd 和 /var/run/docker.sock,并确保 dockerd 以固定用户(如 root)运行;关键日志字段包括时间戳、exe、addr、comm、syscall、success 和 res;仅靠 dockerd debug 或 json-file 日志无法满足等保等合规要求,因其缺失调用者身份、源地址及系统级行为记录。

如何开启 Docker Daemon 的审计日志(audit log)
Docker Daemon 本身不直接生成细粒度操作审计日志,必须依赖宿主机的 auditd 服务配合规则才能捕获 dockerd 进程行为。单纯改 daemon.json 加 log-driver 没用——那只是容器日志,不是 daemon 审计日志。
实操上要分三步走:
- 确认宿主机已安装并运行
auditd:systemctl is-active auditd - 添加审计规则,监控
dockerd可执行文件和关键系统调用:auditctl -w /usr/bin/dockerd -p x -k docker_exec,再加一条监控 socket 文件:auditctl -w /var/run/docker.sock -p wa -k docker_socket - 确保
dockerd启动时以固定用户运行(如root),否则 audit 规则可能因权限隔离失效
auditd 日志里哪些字段对合规检查最关键
默认 ausearch -i -k docker_socket 输出冗长,但真正支撑等保、GDPR 或 PCI-DSS 审计的只有几个字段:时间戳、调用进程名(exe)、源 IP(addr)、目标 socket 路径、系统调用名(syscall)、返回值(success 和 res)。
容易被忽略的是 comm 字段——它显示发起调用的命令名(比如 curl、docker、python),而不是 exe(总是 /usr/bin/docker)。没这个字段,就无法区分是运维手动执行还是脚本自动调用。
常见错误现象:日志里大量 comm=docker 但无 addr,说明调用来自本地 Unix socket,此时需额外抓取 dockerd 自身日志(journalctl -u docker --since "2 hours ago")补全上下文。
为什么不能只靠 dockerd 的 debug 模式或 json-file 日志做合规审计
dockerd 开启 debug: true 或把 log-driver 设为 json-file,只能记录 API 请求路径、参数和响应状态码,不记录调用者身份、源地址、系统级行为(如 fork、mmap、openat),也不留存失败请求的原始 payload。
合规检查(如等保2.0 8.1.4 条款)明确要求“记录用户标识、操作时间、操作类型、操作结果”,而 dockerd 默认日志里的 user= 字段常为空,remote_addr 在 Unix socket 场景下永远是 -。
性能影响也要考虑:debug 模式会让 daemon 日志暴增 5–10 倍,且日志落盘延迟高;auditd 则在内核层捕获,开销低、不可绕过、不可删除(只要配置了 write-only 日志归档)。
如何验证 audit 规则是否生效且未被绕过
最直接的验证方式是模拟一次非法操作并查日志,比如用非 root 用户尝试直连 /var/run/docker.sock:sudo -u nobody curl --unix-socket /var/run/docker.sock http://localhost/version。然后立刻执行:ausearch -m avc,syscalls -ts recent -i | grep docker。
若没输出,说明规则失效,常见原因有:
-
auditd规则未持久化(重启后丢失),需写入/etc/audit/rules.d/docker.rules并执行augenrules --load - SELinux 处于 enforcing 模式但未启用 audit 功能:
setsebool -P auditadm_enabled 1 -
dockerd被 systemd 用PrivateTmp=yes或ProtectSystem=strict启动,导致 audit 规则无法关联到其子进程
真正的难点不在开启,而在持续验证规则覆盖是否完整——比如容器内进程通过 hostNetwork 直连宿主机 docker.sock,这种调用不会触发你设在 /var/run/docker.sock 上的规则,得额外监控 AF_INET 类型的 connect 系统调用。










