如何记录Kubernetes容器内部执行的Linux命令?
Kubernetes 容器内部 Linux 命令审计实现方案
要完整记录容器内执行的所有 Linux 命令用于审计,可根据你的安全需求和集群配置,选择以下一种或多种方案组合使用:
方案1:Shell 命令历史持久化采集
这是成本最低的实现方案,适合对审计强度要求中等的场景:
- 核心思路:修改容器内 Shell 的默认配置,将所有执行的命令历史持久化输出到指定路径,再通过日志采集工具统一收集到审计中心。
- 操作步骤:
- 要么修改业务基础镜像,要么通过 Mutating Webhook 动态给所有启动的容器注入 Shell 配置,以 bash 为例,需要追加的配置如下:
# 实时写入命令历史,指定历史记录的时间格式 export PROMPT_COMMAND='history -a >(tee -a /var/log/container_cmd_history | logger -t "container_cmd")' export HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S " shopt -s histappend - 给容器挂载宿主机的空目录卷或者专属的持久化卷存储命令日志,防止容器销毁后日志丢失。
- 用 DaemonSet 部署的 Filebeat、Fluentd 等采集工具,批量采集所有节点上的容器命令日志,上报到集中的审计平台存储。
- 注意要修改日志文件的权限,仅保留 root 可写,避免普通用户篡改历史记录。
- 要么修改业务基础镜像,要么通过 Mutating Webhook 动态给所有启动的容器注入 Shell 配置,以 bash 为例,需要追加的配置如下:
方案2:内核层系统调用审计
这个方案从内核层面捕获所有命令执行行为,无法被用户绕过,适合安全等级要求高的场景:
- 核心思路:利用 Linux 内核的审计能力,监控所有属于容器 PID 命名空间的进程的
execve系统调用,不管用户有没有修改 Shell 配置,都能完整记录所有执行的命令。 - 操作步骤:
- 每个节点部署 auditd 服务,或者用基于 eBPF 的开源工具(比如 Tracee、Falco),配置审计规则过滤出容器进程的命令执行事件。
- 采集到的审计日志要关联上对应的 Pod 名、命名空间、容器ID、镜像名等 K8s 元数据,方便后续溯源定位。
- 可以配置过滤规则过滤掉容器内置服务的常规执行操作,减少无用的日志噪音。
方案3:Kubectl Exec 操作全链路审计
大部分人工操作容器的场景都是通过 kubectl exec 进入容器,这个方案可以覆盖所有人工操作的审计:
- 核心思路:在 K8s API 层面记录所有 exec 请求的发起信息,同时对 exec 会话做全量录制,方便后续回放核查。
- 操作步骤:
- 开启 K8s APIServer 的审计日志功能,配置审计规则将所有
/api/*/pods/*/exec路径的请求日志级别设为 RequestResponse,完整记录请求的发起用户、时间、操作的 Pod 信息、执行的命令参数。 - 部署准入控制器强制所有 exec 操作开启会话录制,录制的会话文件存储到独立的对象存储服务,支持后续全程回放操作过程。
- 这个方案无法覆盖容器内部进程主动执行命令的场景,需要配合内核层审计方案一起使用。
- 开启 K8s APIServer 的审计日志功能,配置审计规则将所有
通用注意事项
- 所有审计日志必须存储在独立于 K8s 集群的审计系统中,配置 WORM(一次写入多次读取)策略,禁止删除或篡改审计日志,满足合规要求。
- 提前做好日志的清洗和过滤规则,避免日志量过大占用过多存储资源,也提升后续审计排查的效率。
- 审计相关的组件权限要做严格管控,禁止普通用户修改审计规则或者访问审计日志。
内容的提问来源于stack exchange,提问作者Prasad
相关产品推荐
相关产品推荐

