全链条运行时存储系统调用审计需依托ebpf(如tracee/falco)+ seccomp策略+容器运行时协同实现,覆盖vfs_open/vfs_write等内核级调用,并通过cgroup关联pod元数据;kubernetes原生审计(如api server)无法捕获此类调用。
在 kubernetes 环境中对容器做“全链条运行时存储系统调用审计”,本质上不是靠 kubernetes 原生审计(如 api server 审计或容器内操作审计)直接实现的——因为 kube-apiserver 不感知、不拦截、不记录容器进程发起的系统调用(如 openat、read、write、mmap、mount 等)。这类调用发生在容器运行时(如 containerd/runc)和宿主机内核层面,需借助底层运行时与内核安全机制协同完成。
明确目标边界:什么算“全链条”?
真正覆盖存储相关系统调用的全链条,应包含:
- 容器进程对挂载卷(hostPath、emptyDir、ConfigMap/Secret 卷、CSI 存储卷等)的实际读写行为
- 文件打开、权限检查、符号链接解析、ioctl 调用(如用于块设备控制)
- 是否涉及敏感路径(如 /etc/shadow、/root/.ssh)、高危操作(如 execve 后加载动态库、写入 /proc/sys/)
- 调用来源可追溯到具体 Pod、容器名、PID 及发起进程的完整命令行
可行技术路径与关键组件
目前生产可用的方案依赖以下组合,而非单一工具:
- eBPF + Tracee 或 Falco:在节点内核层捕获 sys_enter/sys_exit 事件,过滤出与 vfs_read/vfs_write/vfs_open/mount 等存储相关 syscall,并通过 cgroup_id 关联到对应 Pod 容器。Tracee 支持内置规则检测可疑文件访问(如写入 /etc/passwd),并输出含 container_id、pod_name、namespace 字段的结构化事件。
- seccomp + 自定义策略:为容器配置 seccomp profile,将敏感 syscall(如 mount、pivot_root、open_by_handle_at)设为 SCMP_ACT_LOG 或 SCMP_ACT_TRACE,配合 auditd 或 systemd-journald 收集日志。注意:默认 profile(runtime/default)不记录,需显式启用且仅限白名单内 syscall。
- 容器运行时增强(如 crun + OCI hooks):在容器启动前注入 eBPF 探针或 LD_PRELOAD 库(如 libaudit),劫持 glibc 文件 I/O 函数并上报。该方式侵入性强,不推荐用于生产,仅限调试验证。
- CSI 驱动侧日志(有限场景):部分企业级 CSI 插件(如阿里云 NAS CSI、AWS EBS CSI)提供挂载/卸载/IO 统计日志,但无法覆盖容器内任意文件操作,属于存储后端视角,非容器进程视角。
实操建议:以 Tracee 为例快速落地
这是当前最平衡安全性、可观测性与维护成本的方案:
- 在每个工作节点部署 Tracee DaemonSet(使用 hostNetwork 和 privileged 权限),自动识别 cgroup v2 层级并映射到 Pod 元数据
- 启用 --output-format=json --output-optional-fields=containerID,containerName,podName,namespace,hostName
- 聚焦规则:--rules ./rules/filename_access.yaml(监控 /etc、/root 等路径)、--rules ./rules/suspicious_file_writes.yaml
- 将输出日志接入 SLS 或 Loki,在查询时用 podName: "nginx-abc123" and event="vfs_write" 快速定位写操作源头
必须规避的误区
以下做法无法达成目标,常见但无效:
- 仅开启 kube-apiserver 审计:它只记录创建 PVC/PV 的 API 请求,不记录容器里 touch /data/log.txt 的行为
- 依赖容器内 auditd:容器通常无 root 权限、无 auditctl、/proc/sys/kernel/audit_enabled 不可写,且日志无法跨重启持久化
- 用 strace attach 进程:属临时调试手段,不可规模化、不可审计留存、会显著影响性能
- 认为 “容器内部操作审计(ACK advaudit)” 覆盖系统调用:它只捕获 exec/execve 命令执行事件(如 kubectl exec -it bash),不捕获 bash 内部执行的 ls/cat 等产生的 syscall
不复杂但容易忽略:真正的存储系统调用审计,是节点内核+运行时+可观测平台的联合能力,Kubernetes 本身只负责调度和编排,不替代操作系统安全监控职责。











