docker安全审计日志需分层配置:内核级(auditd)、运行时级(docker 27+ audit-log)、服务级(swarm上下文),并结构化采集、防篡改存储。

Docker 容器安全审计日志不能只靠 --log-driver 记录 stdout,必须分层配置:明确日志来源、启用对应审计机制、结构化采集、防篡改存储。核心是区分“容器应用日志”和“安全审计日志”,后者需覆盖内核调用、运行时行为、服务操作三类事件。
明确三类安全审计日志来源
-
内核级审计日志:由 auditd 生成的
/var/log/audit/audit.log,记录系统调用(如 execve、openat)、用户登录、权限变更等 -
Docker 运行时审计事件:Docker 27+ 实验性
audit-log功能,直接捕获container_create、exec_create、image_pull等事件,输出为 JSON Lines -
服务级操作日志:Swarm 模式下
docker service logs所含上下文(服务名、任务 ID、操作者),需 daemon 配置透出标签
启用 Docker 原生运行时审计(推荐 Docker 27+)
编辑 /etc/docker/daemon.json:
{
"experimental": true,
"audit-log": {
"path": "/var/log/docker/audit.json",
"log-format": "json",
"log-level": "info"
},
"log-driver": "local",
"log-opts": {
"max-size": "10m",
"max-file": "5",
"compress": "true"
}
}
重启 Docker:sudo systemctl restart docker
该日志自动包含镜像 digest、UID/GID、挂载点、网络模式等字段,无需应用修改,可被 Filebeat/Loki 直接解析。
配置 Swarm 服务审计上下文(仅限 Swarm 集群)
同样在 /etc/docker/daemon.json 中补充:
{
"log-driver": "json-file",
"log-opts": {
"labels": "com.docker.swarm.service,com.docker.swarm.task.id,io.docker.audit.user",
"env": "USER,HOME"
}
}
重启后,docker service logs --timestamps payment-api 就能显示服务名、任务 ID 和触发操作的用户名,支撑责任追溯。
采集与落盘:防篡改 + 可验证
- 审计日志路径(如
/var/log/docker/audit.json或/var/log/audit/audit.log)必须映射到宿主机只读挂载卷或 WORM 存储 - 使用 Filebeat 采集并签名:启用
processors.add_fields添加主机指纹,配合hash.sha256插件对每条日志生成哈希 - 输出目标建议双写:一份投 Kafka(供实时告警),一份存入 OpenSearch/Graylog(支持关联查询与合规导出)
验证是否生效
- 启动一个测试容器:
docker run --label audit=true alpine sh -c "sleep 1" - 查看审计日志:
sudo tail -n 5 /var/log/docker/audit.json,应出现"action":"container_create"字段 - 登录 Harbor 或执行
docker service create后,检查对应审计路径是否有结构化记录
不复杂但容易忽略:auditd 必须开启且规则完整,Docker daemon 必须重启,宿主机日志路径要有 SELinux 上下文或 chmod 正确权限。











