Shell脚本如何配置容器审计日志

wen 实用脚本 1

容器审计日志Shell脚本配置指南:从入门到生产级实践

目录导读

  • 为什么需要容器审计日志?
  • 核心概念:审计日志 vs 普通日志
  • Step 1:审计日志基础配置(auditd + Docker)
  • Step 2:Shell脚本自动捕获容器事件
  • Step 3:日志格式化与持久化存储
  • Step 4:实时告警与安全分析
  • 常见问题与问答(Q&A)
  • 生产环境最佳实践

为什么需要容器审计日志?

在Kubernetes和Docker主导的云原生时代,容器安全漏洞层出不穷,审计日志(Audit Log)不同于应用程序日志,它记录谁、在什么时间、对哪个容器执行了什么操作——比如创建特权容器、挂载宿主机目录、修改网络规则等。
企业合规要求(如PCI DSS、SOC 2)明确需要审计日志,而Shell脚本是实现自动化配置的最低成本方案。

Shell脚本如何配置容器审计日志


核心概念:审计日志 vs 普通日志

| 类型 | 普通日志 | 审计日志 | |------|----------|----------|| 应用输出、错误信息 | 系统调用、用户操作、安全事件 | | 用途 | 调试与监控 | 合规审计、攻击溯源 | | 存储 | 滚动文件/ELK | 只写一次、不可篡改 | | 配置方式 | log4j/容器stdout | auditd rules + shell脚本 |

举个实例:容器内执行su root,普通日志无记录,但审计日志会记录UID=1000的用户调用了execve系统调用。


Step 1:审计日志基础配置(auditd + Docker)

1 安装auditd

yum install audit -y  # CentOS/RHEL
systemctl enable auditd && systemctl start auditd

2 配置Docker守护进程审计

创建审计规则文件/etc/audit/rules.d/docker.rules

# 监控Docker相关目录
-w /var/lib/docker -p wa -k docker_data
# 监控docker命令执行
-a always,exit -F path=/usr/bin/docker -F perm=x -k docker_cmd
# 监控容器网络命名空间
-w /run/docker/netns -p wa -k docker_net

重载规则:

auditctl -R /etc/audit/rules.d/docker.rules

🔍 关键点-k为日志添加标签(key),方便后续Shell脚本过滤。


Step 2:Shell脚本自动捕获容器事件

1 基础轮询脚本(每秒检查)

#!/bin/bash
AUDIT_LOG="/var/log/audit/audit.log"
OUTPUT_LOG="/var/log/container_audit.log"
tail -Fn0 $AUDIT_LOG | while read line; do
    # 只保留docker相关事件
    if echo "$line" | grep -q "docker_"; then
        # 提取关键字段
        CONTAINER_ID=$(echo "$line" | grep -oP 'exe="/usr/bin/docker"' | head -1)
        USER=$(echo "$line" | grep -oP 'uid=\K[0-9]+')
        OP=$(echo "$line" | grep -oP 'syscall=\K[0-9]+')
        TIMESTAMP=$(date +"%Y-%m-%d %H:%M:%S")
        echo "[$TIMESTAMP] UID:$USER | Container Op:$OP | Detail:$line" >> $OUTPUT_LOG
    fi
done

生产优化:使用inotifywait替代轮询,降低CPU开销。

2 结构化JSON输出(适合ELK接入)

# 输出JSON格式
echo "{\"timestamp\":\"$TIMESTAMP\",\"uid\":\"$USER\",\"syscall\":$OP,\"raw\":\"$line\"}" >> /var/log/audit_json.log

Step 3:日志格式化与持久化存储

1 日志轮转(避免磁盘写满)

cat > /etc/logrotate.d/container_audit << 'EOF'
/var/log/container_audit.log {
    daily
    rotate 30
    compress
    delaycompress
    missingok
    notifempty
    postrotate
        systemctl restart auditd > /dev/null 2>&1 || true
    endscript
}
EOF

2 远程集中存储(rsyslog + Graylog)

# 发送到远程Graylog
echo "*.* @@graylog.example.com:514" >> /etc/rsyslog.conf
systemctl restart rsyslog

Step 4:实时告警与安全分析

1 检测特权容器创建

#!/bin/bash
# 检测 --privileged 参数
tail -Fn0 /var/log/audit/audit.log | while read line; do
    if echo "$line" | grep -q "docker run.*--privileged"; then
        echo "WARNING: Privileged container start!" | mail -s "Security Alert" admin@example.com
        # 可选:记录嫌疑人
        whoami >> /var/log/suspicious_actions.log
    fi
done

2 集成falco(推荐)

虽然falco是独立工具,但Shell脚本可作为轻量替代,复杂规则建议使用audit2allow工具转换。


常见问题与问答(Q&A)

Q1:审计日志会不会影响容器性能?
A:CPU影响<3%(参考Linux Audit性能报告),建议将audit_buffer调大(echo 8192 > /proc/sys/kernel/audit_backlog_limit)。

Q2:容器内执行的操作能审计吗?
A:默认只能审计宿主机级别的系统调用,如需审计容器内操作,需要在容器内安装auditd(不推荐),或使用eBPF技术(如bpftrace)。

Q3:如何过滤Docker Compose产生的噪音?
A:使用-k compose_events区分标签,Shell脚本中grep -v "compose_"过滤。

Q4:日志文件被篡改怎么办?
A:使用chattr +a追加模式锁定日志文件,或写入远程Syslog服务器(通过加密通道)。


生产环境最佳实践

  1. 分级审计:关键操作(如docker run --privileged)使用-a always,exit,普通操作(如docker ps)使用-a exit,always避免噪声。
  2. Shell脚本自检:定期运行auditctl -l检查规则是否被篡改。
  3. 日志签名sha256sum对每日日志生成哈希链,防止删除。
  4. 灾难恢复:日志保留至少90天,冷备到对象存储(如AWS S3,替换为oss.example.com)。

最后提醒:审计日志配置完成后,务必用ausearch -k docker_cmd | tail -20测试是否捕获到Docker命令,安全无小事,每一行Shell脚本可能挽救一次合规审核。

抱歉,评论功能暂时关闭!