Kubernetes审计日志所在位置取决于谁运行您的控制平面。在自管集群上,它们是在控制平面节点上的JSON行文件,路径由–audit-log-path参数指定。在EKS上,它们会发送到CloudWatch Logs,在AKS上发送到Log Analytics工作区或存储帐户,而在GKE上发送到Cloud Audit Logs。有一点是一样的:必须开启审计日志记录。在自管集群和EKS上,审计日志记录默认关闭,直到有人启用它。
审计日志记录了对Kubernetes API的每次请求:谁运行kubectl exec进入哪个pod,谁读取了哪个密钥,谁绑定自己为cluster-admin。Prime Core为Kubernetes审计数据提供了93条检测规则,对应220个MITRE ATT&CK技术手段。其中包括:exec进入运行中的容器(T1609),部署流氓容器(T1610),通过容器API读取凭证(T1552.007)。
在您开始之前
它是否已启用?
| 平台 | 查看位置 |
|---|---|
| 自管(kubeadm和类似的) | –audit-policy-file和–audit-log-path在API服务器上;对于kubeadm,在/etc/kubernetes/manifests/kube-apiserver.yaml中 |
| EKS | 集群→可观察性→控制平面日志,“审计”日志类型 |
| AKS | 集群上的诊断设置,类别为kube-audit或kube-audit-admin |
| GKE | 默认情况下启用管理员活动;Kubernetes的数据访问日志记录需自行选择加入 |
如果审计日志未开启,过去没有可导出的数据,本指南的其他部分是关于下次的。
详细信息取决于策略。 在元数据级别,您看到的是谁对哪个对象做了什么。在请求或请求响应级别,您也能看到内容,例如请求privileged: true的pod spec。在查阅之前,知道您拥有什么级别是很重要的。
预期的量。 控制器和服务帐户不断与API通信。在AKS上,kube-audit-admin省略了只读get和list调用,这保持了大小适中但也隐藏了密钥读取。
导出它
自管集群, 在控制平面节点上:
# 首先确认路径
sudo grep -- '--audit-log-path' /etc/kubernetes/manifests/kube-apiserver.yaml
sudo cat /var/log/kubernetes/audit/audit.log > k8s_audit.jsonl
旋转的文件(由–audit-log-maxbackup)与其相邻,名称中带有时间戳。如果时间窗口足够长,请包含它们。
EKS, 来自CloudWatch Logs:
aws logs filter-log-events --log-group-name /aws/eks/my-cluster/cluster
--log-stream-name-prefix kube-apiserver-audit
--start-time $(date -d '2026-10-19T00:00:00Z' +%s000) --end-time $(date -d '2026-10-20T00:00:00Z' +%s000)
--output json | jq -c '.events[].message | fromjson' > eks_audit_1019.jsonl
每个CloudWatch事件将审计条目包装为一个字符串;fromjson可将其解封。date -d语法是GNU的;在macOS上,采用其他方法计算毫秒时间戳。
AKS, 来自Log Analytics(资源特定表):
az monitor log-analytics query -w
--analytics-query "AKSAuditAdmin | where TimeGenerated between (datetime(2026-10-19) .. datetime(2026-10-20))"
--output json > aks_audit_1019.json
GKE, 来自Cloud Audit Logs:
gcloud logging read 'resource.type="k8s_cluster" AND logName:"cloudaudit.googleapis.com" AND timestamp>="2026-10-19T00:00:00Z" AND timestamp<"2026-10-20T00:00:00Z"'
--project=my-project --format=json | jq -c '.[]' > gke_audit_1019.jsonl
注意事项
| 请求 | 其重要性 |
|---|---|
| 在pods/exec(objectRef.subresource: exec)上创建 | 有人在运行的容器中打开了一个shell |
| 建立cluster-admin的ClusterRoleBinding时创建 | 特权升级至完全控制 |
| 通过不常见身份进行获取或列出密钥 | 凭证收集 |
| 创建了具有特权、hostPath或hostNetwork的Pod | 迈向逃逸到节点的一步 |
| user.username: system:anonymous返回2xx响应 | 不应有效的匿名访问 |
| 某个服务帐户频繁返回403 | 被盗的令牌试探其权限 |
在LogTotal中上传、净化和审查
- 上传。 打开 logtotal.com 并拖入.jsonl文件。
- 净化。 [what gets masked: usernames, service account names, source IPs, namespaces, object names]. Look it over before you continue.
- 审查。
当出现问题时
| 症状 | 可能的原因 | Fix |
|---|---|---|
| 控制平面上没有审计文件 | API服务器没有配置审计策略 | 预期的;为未来配置它 |
| EKS日志组或审计流丢失 | 未启用“审计”控制平面日志类型 | 为未来启用它 |
| 每行都是一个长的转义字符串 | CloudWatch包装 | 如上所示,使用fromjson解封 |
| 您可以看到谁更改了pod,但无法看到如何更改 | 策略位于元数据级别 | 为敏感资源提高级别 |
| AKS数据中没有密钥读取 | kube-audit-admin排除了get和list | 如果需要它们,请收集kube-audit |
FAQ
容器日志不够吗?
不够。容器日志显示应用程序输出了什么。审计日志显示的是人和服务帐户对集群所做的操作。不同的问题,不同的日志。
我能在托管集群上读取审计文件吗?
不能。在EKS、AKS和GKE上,您无法访问控制平面节点。提供商的日志服务是唯一的途径。