目录
一、审计日志介绍:
在Kubernetes集群中,API Server的审计日志记录了哪些用户、哪些服务请求操作集群资源,并且可以编写不通规则,控制忽略、存储的操作日志。
审计日志采用JSON输出,每条日志报包含丰富的元数据,例如请求的URL、HTTP的方法、客户端来源登,你可以使用监控服务来分析API流量,以检测趋势或可能存在的安全隐患。
这些服务会访问API Serve:
- 管理节点(controller-manager scheduler)
- 工作节点(kubelt、kube-proxy)
- 集群服务(CoreDNS、Calico、HPA等)
- kubectl、API、Dashboard
二、事件和阶段:
当客户端向API Server发出请求时,该请求将经历一个或多个阶段:
阶段 | 说明 |
RequestReceived | 审核处理程序已收到请求 |
ResponseStarted | 已发送 响应标头,但尚未发送响应正文 |
ResponseComplete | 响应正文已完成,不再发送任何字节 |
Panic | 内部服务器出错,请求未完成 |
三、Kubernetes审计日志:
Kubernetes审核策略文件包含一系列规则,描述了记录日志的级别,采集哪些日志,不采集哪些日志。
规则级别如下表所示:
级别 | 说明 |
None | 不为事件创建日志条目 |
Metadata | 创建日志条目。包括元数据,但不包括请求正文或响应正文 |
Request | 创建日志条目。包括元数据和请求正文,但不包括响应正文 |
RequestResponse | 创建日志条目。包括元数据、请求正文和响应正文 |
参考资料:https://kubernetes.io/zh/docs/tasks/debug-application-cluster/audit/
示列:
日志示列格式:
四、审计日志的启用:
审计日志支持写入本地文件和Webhook(发送到外部HTTP API)两种方式。
启用审计日志功能:
【】vi /etc/kubernetes/manifests/kube-apiserver.yaml
…
- --audit-policy-file=/etc/kubernetes/audit/audit-policy.yaml
- --audit-log-path=/var/log/k8s_audit.log
- --audit-log-maxage=30
- --audit-log-maxbackup=10
- --audit-log-maxsize=100
...
volumeMounts:
...
- mountPath: /etc/kubernetes/audit/audit-policy.yaml
name: audit
- mountPath: /var/log/k8s_audit.log
name: audit-log
volumes:
- name: audit
hostPath:
path: /etc/kubernetes/audit/audit-policy.yaml
type: File
- name: audit-log
hostPath:
path: /var/log/k8s_audit.log
type: FileOrCreate
参数说明
audit-policy-file | 审计日志策略文件 |
audit-log-path | 审计日志输出文件 |
audit-log-maxage | 审计日志保留的最大天数 |
audit-log-maxbackup | 审计日志最大分片存储多少个日志文件 |
audit-log-maxsize | 单个审计日志最大大小,单位MB |
注:需要使用hostpath数据卷将宿主机策略文件和日志文件挂载到容器中。
【】vi /etc/kubernetes/audit/audit-policy.yaml#简略版自定义
apiVersion: audit.k8s.io/v1 # 这是必填项。
kind: Policy
# 不要在 RequestReceived 阶段为任何请求生成审计事件。
omitStages:
- "RequestReceived"
rules:
# 在日志中用 RequestResponse 级别记录 Pod 变化。
- level: RequestResponse
resources:
- group: ""
# 资源 "pods" 不匹配对任何 Pod 子资源的请求,
# 这与 RBAC 策略一致。
resources: ["pods"]
# 在日志中按 Metadata 级别记录 "pods/log"、"pods/status" 请求
- level: Metadata
resources:
- group: ""
resources: ["pods/log", "pods/status"]
# 不要在日志中记录对名为 "controller-leader" 的 configmap 的请求。
- level: None
resources:
- group: ""
resources: ["configmaps"]
resourceNames: ["controller-leader"]
# 不要在日志中记录由 "system:kube-proxy" 发出的对端点或服务的监测请求。
- level: None
users: ["system:kube-proxy"]
verbs: ["watch"]
resources:
- group: "" # core API 组
resources: ["endpoints", "services"]
# 不要在日志中记录对某些非资源 URL 路径的已认证请求。
- level: None
userGroups: ["system:authenticated"]
nonResourceURLs:
- "/api*" # 通配符匹配。
- "/version"
# 在日志中记录 kube-system 中 configmap 变更的请求消息体。
- level: Request
resources:
- group: "" # core API 组
resources: ["configmaps"]
# 这个规则仅适用于 "kube-system" 名字空间中的资源。
# 空字符串 "" 可用于选择非名字空间作用域的资源。
namespaces: ["kube-system"]
# 在日志中用 Metadata 级别记录所有其他名字空间中的 configmap 和 secret 变更。
- level: Metadata
resources:
- group: "" # core API 组
resources: ["secrets", "configmaps"]
# 在日志中以 Request 级别记录所有其他 core 和 extensions 组中的资源操作。
- level: Request
resources:
- group: "" # core API 组
- group: "extensions" # 不应包括在内的组版本。
# 一个抓取所有的规则,将在日志中以 Metadata 级别记录所有其他请求。
- level: Metadata
# 符合此规则的 watch 等长时间运行的请求将不会
# 在 RequestReceived 阶段生成审计事件。
omitStages:
- "RequestReceived"
【】cat /var/log/audit/audit.log#以json格式输出的
#以json格式输出的安全jq用来解析json,老版本会是json
【】yum -y install jq
【】cat /var/log/k8s_audit.log |jq
简略版配置
【】vi /etc/kubernetes/audit/audit-policy.yaml#简略版自定义只记录pod操作
apiVersion: audit.k8s.io/v1
kind: Policy
# 忽略步骤,不为RequestReceived阶段生成审计日志
omitStages:
- "RequestReceived"
rules:
# 不记录日志
- level: None
users:
- system:apiserver
- system:kube-controller-manager
- system:kube-scheduler
- system:kube-proxy
- kubelet
# 针对资源记录日志
- level: Metadata
resources:
- group: ""
resources: ["pods"]
# - group: "apps"
# resources: ["deployments"]
# 其他资源不记录日志
- level: None
重启kubelet以生效
【】systemctl restart kubelet#若不生效则删一下apiserver的pod
五、收集审计日志方案:
- 审计日志文件+filebeat 比较实际
- 审计webhook+logstash
- 审计webhook+falco