如何记录K8s中在Pod内执行命令的用户操作及关联用户名?
解决方案:关联K8s用户名与Pod内操作日志
要实现将K8s/OpenShift用户与Pod内执行的命令关联记录,核心思路是把K8s审计日志的用户信息和容器Runtime级别的操作日志做关联匹配,弥补单一工具的信息缺失。具体实现步骤如下:
1. 从K8s审计日志提取用户与Pod关联信息
当用户通过kubectl exec或OpenShift的oc exec/rsh触发Pod内命令时,K8s审计日志会生成Exec类型的事件,其中包含关键字段:
user.username:触发操作的K8s用户名(比如user01)objectRef.uid:目标Pod的唯一UID(跨命名空间唯一,是核心关联键)requestObject.command:用户执行的初始命令片段
需配置审计日志的采集规则,确保这类Exec事件被完整捕获,重点提取上述三个字段。
2. 用Runtime工具捕获Pod内完整操作
使用Tetragon或Falco捕获容器内的所有进程执行事件,这些工具能提供:
k8s.pod.uid:Pod的唯一UID(和审计日志的objectRef.uid完全匹配)process.command:容器内执行的完整命令(比如whoami、ls -l等)process.pid、process.cwd等额外上下文信息
以Tetragon为例,可通过自定义规则捕获execve系统调用,确保所有交互式和非交互式命令都被记录;Falco则可启用默认的Exec规则集,补充自定义字段输出Pod UID。
3. 日志关联与聚合
搭建日志处理流水线,将两类日志导入同一分析系统(比如Elasticsearch、Loki),通过以下方式关联:
- 关联键:使用
Pod UID作为核心匹配字段 - 时间窗口:设置合理的时间范围(比如10秒),匹配审计日志
Exec事件与后续Runtime工具捕获的操作日志(因为kubectl exec触发后,容器内会立即启动对应进程) - 标签注入:在日志处理阶段(比如用Fluentd/Fluent Bit),将审计日志中的K8s用户名注入到对应的Runtime日志中,生成一条包含
k8s_user、pod_uid、command的完整记录
4. 特殊场景处理
- 对于容器启动时的初始化命令、内部进程触发的命令(非K8s用户通过
exec触发),这类操作没有对应的K8s用户信息,可在日志中标记为internal_process,避免混淆 - OpenShift环境下,可直接利用
openshift-audit日志(包含更丰富的用户认证信息)和CRI-O的容器日志结合,简化关联流程
内容的提问来源于stack exchange,提问作者Michael Cab
相关产品推荐
相关产品推荐

