概述

Kubernetes 审计提供了关于集群的安全相关的时间顺序记录集。Kube-apiserver 执行审计,每个请求都会产生一个事件,然后根据一定的策略进行预处理,并写入后端。策略决定了记录的内容,而后端则会将记录持久化。

为了遵守 CIS(Center for Internet Security)Kubernetes Benchmark,您需要配置审计日志。

有关配置细节,请参考Kubernetes 官方文档

默认启用

在 RKE v1.1.0+中,使用特定 Kubernetes 版本时,审计日志是默认启用的。

RKE 版本Kubernetes 版本是否默认启用审计日志
v1.1.0+v1.17.4+
v1.1.0 +v1.16.8+
v1.1.0 +v1.15.11+

YAML 配置示例

cluster.yml中使用以下配置可以默认启用审计日志:

  1. services:
  2. kube-api:
  3. audit_log:
  4. enabled: true

启用审计日志后,可以在/etc/kubernetes/audit-policy.yaml中看到默认值(在 RKE v1.1.0 之前,路径是/etc/kubernetes/audit.yaml)。

  1. # 最简单的审计日志配置:采集事件元数据
  2. ---
  3. rules:
  4. - level: Metadata

启用审计日志后,还将为审计日志路径、最大年龄、最大备份数量、最大大小(兆字节)和格式设置默认值。请运行以下命令查看默认值:

  1. ps -ef | grep kube-apiserver

在 RKE v1.1.0 中,审计日志的默认值为:

  1. --audit-log-maxage=5 # 保留旧审计日志文件的最长天数
  2. --audit-log-maxbackup=5 # 保留旧审计日志文件的最大数量
  3. --audit-log-path=/var/log/kube-audit/audit-log.json # 日志后端用于写入审计事件的日志文件路径
  4. --audit-log-maxsize=100 # 审计日志文件在被替换之前的最大大小(MB)
  5. --audit-policy-file=/etc/kubernetes/audit.yaml # 包含您的审计日志规则的文件
  6. --audit-log-format=json # 日志文件格式

您可以使用configuration自定义审计日志。

规则策略通过--audit-policy-filecluster.yml中的policy指令传递给 kube-apiserver。下面是一个例子cluster.yml,其中包含自定义值和嵌套在configuration指令下的审计日志策略。这个审计日志策略示例来自官方Kubernetes 文档

  1. services:
  2. kube-api:
  3. audit_log:
  4. enabled: true
  5. configuration:
  6. max_age: 6
  7. max_backup: 6
  8. max_size: 110
  9. path: /var/log/kube-audit/audit-log.json
  10. format: json
  11. policy:
  12. apiVersion: audit.k8s.io/v1 # 必填
  13. kind: Policy
  14. omitStages:
  15. - "RequestReceived"
  16. rules:
  17. # 在RequestResponse级别记录pod变化
  18. - level: RequestResponse
  19. resources:
  20. - group: ""
  21. # 资源 "pods "不匹配对pods的任何子资源的请求
  22. # 与RBAC策略是一致的
  23. resources: ["pods"]
  24. # 在元数据层记录 "pods/log"、"pods/status"
  25. - level: Metadata
  26. resources:
  27. - group: ""
  28. resources: ["pods/log", "pods/status"]
  29. # 不要将请求记录到名为 "controller-leader "的配置图上
  30. - level: None
  31. resources:
  32. - group: ""
  33. resources: ["configmaps"]
  34. resourceNames: ["controller-leader"]
  35. # 不要在端点或服务上记录 "system:keube-proxy "的监视请求
  36. - level: None
  37. users: ["system:kube-proxy"]
  38. verbs: ["watch"]
  39. resources:
  40. - group: "" # core API group
  41. resources: ["endpoints", "services"]
  42. # 不要记录对某些非资源URL路径的认证请求
  43. - level: None
  44. userGroups: ["system:authenticated"]
  45. nonResourceURLs:
  46. - "/api*" # Wildcard matching.
  47. - "/version"
  48. # 在kube-system中记录configmap变更的请求体
  49. - level: Request
  50. resources:
  51. - group: "" # core API group
  52. resources: ["configmaps"]
  53. # 此规则只适用于 "kube-system "命名空间中的资源
  54. # 空字符串""可用于选择非命名间隔的资源
  55. namespaces: ["kube-system"]
  56. # 在元数据级别记录所有其他命名空间的configmap和密钥变化
  57. - level: Metadata
  58. resources:
  59. - group: "" # core API group
  60. resources: ["secrets", "configmaps"]
  61. # 在请求层记录核心和扩展的所有其他资源
  62. - level: Request
  63. resources:
  64. - group: "" # core API group
  65. - group: "extensions" # 不应包括组的版本
  66. # 一个全面的规则,用于记录元数据级别的所有其他请求
  67. - level: Metadata
  68. # 在此规则下,像监控这样的长期运行的请求不会在RequestReceived中产生审计事件
  69. omitStages:
  70. - "RequestReceived"