K3s 加固指南

本文档提供了针对生产环境的 K3s 集群进行加固的具体指导,以便在使用 Rancher 部署之前进行配置。它概述了满足信息安全中心(Center for Information Security, CIS)Kubernetes benchmark controls 所需的配置和控制。

K3s Hardening Guides - 图1备注

这份加固指南描述了如何确保你集群中的节点安全。我们建议你在安装 Kubernetes 之前遵循本指南。

此加固指南适用于 K3s 集群,并与以下版本的 CIS Kubernetes Benchmark、Kubernetes 和 Rancher 相关联:

Rancher 版本CIS Benchmark 版本Kubernetes 版本
Rancher v2.7Benchmark v1.23Kubernetes v1.23
Rancher v2.7Benchmark v1.24Kubernetes v1.24
Rancher v2.7Benchmark v1.7Kubernetes v1.25 至 v1.26

K3s Hardening Guides - 图2备注

在 Benchmark v1.7 中,不再需要 --protect-kernel-defaults (4.2.6) 参数,并已被 CIS 删除。

有关如何评估加固的 K3s 集群与官方 CIS benchmark 的更多细节,请参考特定 Kubernetes 和 CIS benchmark 版本的 K3s 自我评估指南。

K3s 在不需要修改的情况下通过了许多 Kubernetes CIS controls,因为它默认应用了几个安全缓解措施。然而,有一些值得注意的例外情况,需要手动干预才能完全符合 CIS Benchmark 要求:

  1. K3s 不修改主机操作系统。任何主机级别的修改都需要手动完成。
  2. 某些 CIS policy controls,例如 NetworkPoliciesPodSecurityStandards(在 v1.24 及更早版本中为 PodSecurityPolicies),会限制集群功能。 你必须选择让 K3s 配置这些策略。在你的命令行标志或配置文件中添加相应的选项(启用准入插件),并手动应用适当的策略。 请参阅以下详细信息。

CIS Benchmark 的第一部分(1.1)主要关注于 Pod manifest 的权限和所有权。由于发行版中的所有内容都打包在一个二进制文件中,因此这一部分不适用于 K3s 的核心组件。

主机级别要求

确保 protect-kernel-defaults已经设置

  • v1.25 及更新版本
  • v1.24 及更早版本

自 CIS benchmark 1.7 开始,不再需要protect-kernel-defaults

这是一个 kubelet 标志,如果所需的内核参数未设置或设置为与 kubelet 的默认值不同的值,将导致 kubelet 退出。

可以在 Rancher 的集群配置中设置 protect-kernel-defaults 标志。

  1. spec:
  2. rkeConfig:
  3. machineSelectorConfig:
  4. - config:
  5. protect-kernel-defaults: true

设置内核参数

建议为集群中的所有节点类型设置以下 sysctl 配置。在 /etc/sysctl.d/90-kubelet.conf 中设置以下参数:

  1. vm.panic_on_oom=0
  2. vm.overcommit_memory=1
  3. kernel.panic=10
  4. kernel.panic_on_oops=1

运行 sudo sysctl -p /etc/sysctl.d/90-kubelet.conf 以启用设置。

此配置需要在设置 kubelet 标志之前完成,否则 K3s 将无法启动。

Kubernetes 运行时要求

CIS Benchmark 的运行时要求主要围绕 Pod 安全(通过 PSP 或 PSA)、网络策略和 API 服务器审计日志展开。

默认情况下,K3s 不包含任何 Pod 安全或网络策略。然而,K3s 附带一个控制器,可以强制执行你创建的任何网络策略。默认情况下,K3s 启用了 PodSecurityNodeRestriction 等多个准入控制器。

Pod 安全

  • v1.25 及更新版本
  • v1.24 及更早版本

K3s v1.25 及更新版本支持 Pod 安全准入(PSA),用于控制 Pod 安全性。

你可以在 Rancher 中通过集群配置,设置 defaultPodSecurityAdmissionConfigurationTemplateName 字段来指定 PSA 配置:

  1. spec:
  2. defaultPodSecurityAdmissionConfigurationTemplateName: rancher-restricted

Rancher 提供了 rancher-restricted 模板,用于强制执行高度限制性的 Kubernetes 上游 Restricted 配置文件,其中包含了 Pod 加固的最佳实践。

K3s v1.24 及更早版本支持 Pod 安全策略 (PSP) 以控制 Pod 安全性。

你可以在 Rancher 中通过集群配置,传递以下标志来启用 PSPs:

  1. spec:
  2. rkeConfig:
  3. machineGlobalConfig:
  4. kube-apiserver-arg:
  5. - enable-admission-plugins=NodeRestriction,PodSecurityPolicy,ServiceAccount

这会保留 NodeRestriction 插件并启用 PodSecurityPolicy

启用 PSPs 后,你可以应用策略来满足 CIS Benchmark 第 5.2 节中描述的必要控制。

K3s Hardening Guides - 图3备注

这些是 CIS Benchmark 中的手动检查。CIS 扫描结果将标记为 warning,因为需要集群操作员进行手动检查。

以下是合规的 PSP 示例:

  1. ---
  2. apiVersion: policy/v1beta1
  3. kind: PodSecurityPolicy
  4. metadata:
  5. name: restricted-psp
  6. spec:
  7. privileged: false # CIS - 5.2.1
  8. allowPrivilegeEscalation: false # CIS - 5.2.5
  9. requiredDropCapabilities: # CIS - 5.2.7/8/9
  10. - ALL
  11. volumes:
  12. - 'configMap'
  13. - 'emptyDir'
  14. - 'projected'
  15. - 'secret'
  16. - 'downwardAPI'
  17. - 'csi'
  18. - 'persistentVolumeClaim'
  19. - 'ephemeral'
  20. hostNetwork: false # CIS - 5.2.4
  21. hostIPC: false # CIS - 5.2.3
  22. hostPID: false # CIS - 5.2.2
  23. runAsUser:
  24. rule: 'MustRunAsNonRoot' # CIS - 5.2.6
  25. seLinux:
  26. rule: 'RunAsAny'
  27. supplementalGroups:
  28. rule: 'MustRunAs'
  29. ranges:
  30. - min: 1
  31. max: 65535
  32. fsGroup:
  33. rule: 'MustRunAs'
  34. ranges:
  35. - min: 1
  36. max: 65535
  37. readOnlyRootFilesystem: false

要使示例 PSP 生效,我们需要创建一个 ClusterRole 和 一个ClusterRoleBinding。我们还需要为需要额外权限的系统级 Pod 提供“系统无限制策略”,以及允许必要的 sysctls 来实现 ServiceLB 完整功能的额外策略。

  1. ---
  2. apiVersion: policy/v1beta1
  3. kind: PodSecurityPolicy
  4. metadata:
  5. name: restricted-psp
  6. spec:
  7. privileged: false
  8. allowPrivilegeEscalation: false
  9. requiredDropCapabilities:
  10. - ALL
  11. volumes:
  12. - 'configMap'
  13. - 'emptyDir'
  14. - 'projected'
  15. - 'secret'
  16. - 'downwardAPI'
  17. - 'csi'
  18. - 'persistentVolumeClaim'
  19. - 'ephemeral'
  20. hostNetwork: false
  21. hostIPC: false
  22. hostPID: false
  23. runAsUser:
  24. rule: 'MustRunAsNonRoot'
  25. seLinux:
  26. rule: 'RunAsAny'
  27. supplementalGroups:
  28. rule: 'MustRunAs'
  29. ranges:
  30. - min: 1
  31. max: 65535
  32. fsGroup:
  33. rule: 'MustRunAs'
  34. ranges:
  35. - min: 1
  36. max: 65535
  37. readOnlyRootFilesystem: false
  38. ---
  39. apiVersion: policy/v1beta1
  40. kind: PodSecurityPolicy
  41. metadata:
  42. name: system-unrestricted-psp
  43. annotations:
  44. seccomp.security.alpha.kubernetes.io/allowedProfileNames: '*'
  45. spec:
  46. allowPrivilegeEscalation: true
  47. allowedCapabilities:
  48. - '*'
  49. fsGroup:
  50. rule: RunAsAny
  51. hostIPC: true
  52. hostNetwork: true
  53. hostPID: true
  54. hostPorts:
  55. - max: 65535
  56. min: 0
  57. privileged: true
  58. runAsUser:
  59. rule: RunAsAny
  60. seLinux:
  61. rule: RunAsAny
  62. supplementalGroups:
  63. rule: RunAsAny
  64. volumes:
  65. - '*'
  66. ---
  67. apiVersion: policy/v1beta1
  68. kind: PodSecurityPolicy
  69. metadata:
  70. name: svclb-psp
  71. annotations:
  72. seccomp.security.alpha.kubernetes.io/allowedProfileNames: '*'
  73. spec:
  74. allowPrivilegeEscalation: false
  75. allowedCapabilities:
  76. - NET_ADMIN
  77. allowedUnsafeSysctls:
  78. - net.ipv4.ip_forward
  79. - net.ipv6.conf.all.forwarding
  80. fsGroup:
  81. rule: RunAsAny
  82. hostPorts:
  83. - max: 65535
  84. min: 0
  85. runAsUser:
  86. rule: RunAsAny
  87. seLinux:
  88. rule: RunAsAny
  89. supplementalGroups:
  90. rule: RunAsAny
  91. ---
  92. apiVersion: rbac.authorization.k8s.io/v1
  93. kind: ClusterRole
  94. metadata:
  95. name: psp:restricted-psp
  96. rules:
  97. - apiGroups:
  98. - policy
  99. resources:
  100. - podsecuritypolicies
  101. verbs:
  102. - use
  103. resourceNames:
  104. - restricted-psp
  105. ---
  106. apiVersion: rbac.authorization.k8s.io/v1
  107. kind: ClusterRole
  108. metadata:
  109. name: psp:system-unrestricted-psp
  110. rules:
  111. - apiGroups:
  112. - policy
  113. resources:
  114. - podsecuritypolicies
  115. resourceNames:
  116. - system-unrestricted-psp
  117. verbs:
  118. - use
  119. ---
  120. apiVersion: rbac.authorization.k8s.io/v1
  121. kind: ClusterRole
  122. metadata:
  123. name: psp:svclb-psp
  124. rules:
  125. - apiGroups:
  126. - policy
  127. resources:
  128. - podsecuritypolicies
  129. resourceNames:
  130. - svclb-psp
  131. verbs:
  132. - use
  133. ---
  134. apiVersion: rbac.authorization.k8s.io/v1
  135. kind: ClusterRole
  136. metadata:
  137. name: psp:svc-local-path-provisioner-psp
  138. rules:
  139. - apiGroups:
  140. - policy
  141. resources:
  142. - podsecuritypolicies
  143. resourceNames:
  144. - system-unrestricted-psp
  145. verbs:
  146. - use
  147. ---
  148. apiVersion: rbac.authorization.k8s.io/v1
  149. kind: ClusterRole
  150. metadata:
  151. name: psp:svc-coredns-psp
  152. rules:
  153. - apiGroups:
  154. - policy
  155. resources:
  156. - podsecuritypolicies
  157. resourceNames:
  158. - system-unrestricted-psp
  159. verbs:
  160. - use
  161. ---
  162. apiVersion: rbac.authorization.k8s.io/v1
  163. kind: ClusterRole
  164. metadata:
  165. name: psp:svc-cis-operator-psp
  166. rules:
  167. - apiGroups:
  168. - policy
  169. resources:
  170. - podsecuritypolicies
  171. resourceNames:
  172. - system-unrestricted-psp
  173. verbs:
  174. - use
  175. ---
  176. apiVersion: rbac.authorization.k8s.io/v1
  177. kind: ClusterRoleBinding
  178. metadata:
  179. name: default:restricted-psp
  180. roleRef:
  181. apiGroup: rbac.authorization.k8s.io
  182. kind: ClusterRole
  183. name: psp:restricted-psp
  184. subjects:
  185. - kind: Group
  186. name: system:authenticated
  187. apiGroup: rbac.authorization.k8s.io
  188. ---
  189. apiVersion: rbac.authorization.k8s.io/v1
  190. kind: ClusterRoleBinding
  191. metadata:
  192. name: system-unrestricted-node-psp-rolebinding
  193. roleRef:
  194. apiGroup: rbac.authorization.k8s.io
  195. kind: ClusterRole
  196. name: psp:system-unrestricted-psp
  197. subjects:
  198. - apiGroup: rbac.authorization.k8s.io
  199. kind: Group
  200. name: system:nodes
  201. ---
  202. apiVersion: rbac.authorization.k8s.io/v1
  203. kind: RoleBinding
  204. metadata:
  205. name: system-unrestricted-svc-acct-psp-rolebinding
  206. namespace: kube-system
  207. roleRef:
  208. apiGroup: rbac.authorization.k8s.io
  209. kind: ClusterRole
  210. name: psp:system-unrestricted-psp
  211. subjects:
  212. - apiGroup: rbac.authorization.k8s.io
  213. kind: Group
  214. name: system:serviceaccounts
  215. ---
  216. apiVersion: rbac.authorization.k8s.io/v1
  217. kind: RoleBinding
  218. metadata:
  219. name: svclb-psp-rolebinding
  220. namespace: kube-system
  221. roleRef:
  222. apiGroup: rbac.authorization.k8s.io
  223. kind: ClusterRole
  224. name: psp:svclb-psp
  225. subjects:
  226. - kind: ServiceAccount
  227. name: svclb
  228. ---
  229. apiVersion: rbac.authorization.k8s.io/v1
  230. kind: RoleBinding
  231. metadata:
  232. name: svc-local-path-provisioner-psp-rolebinding
  233. namespace: kube-system
  234. roleRef:
  235. apiGroup: rbac.authorization.k8s.io
  236. kind: ClusterRole
  237. name: psp:svc-local-path-provisioner-psp
  238. subjects:
  239. - kind: ServiceAccount
  240. name: local-path-provisioner-service-account
  241. ---
  242. apiVersion: rbac.authorization.k8s.io/v1
  243. kind: RoleBinding
  244. metadata:
  245. name: svc-coredns-psp-rolebinding
  246. namespace: kube-system
  247. roleRef:
  248. apiGroup: rbac.authorization.k8s.io
  249. kind: ClusterRole
  250. name: psp:svc-coredns-psp
  251. subjects:
  252. - kind: ServiceAccount
  253. name: coredns
  254. ---
  255. apiVersion: rbac.authorization.k8s.io/v1
  256. kind: RoleBinding
  257. metadata:
  258. name: svc-cis-operator-psp-rolebinding
  259. namespace: cis-operator-system
  260. roleRef:
  261. apiGroup: rbac.authorization.k8s.io
  262. kind: ClusterRole
  263. name: psp:svc-cis-operator-psp
  264. subjects:
  265. - kind: ServiceAccount
  266. name: cis-operator-serviceaccount

上述策略可以放置在 /var/lib/rancher/k3s/server/manifests 目录下名为 policy.yaml 的文件中。在启动 K3s 之前,必须创建策略文件和其目录结构。建议限制访问权限以避免泄露潜在的敏感信息。

  1. sudo mkdir -p -m 700 /var/lib/rancher/k3s/server/manifests

K3s Hardening Guides - 图4备注

CNI、DNS 和 Ingress 等关键 Kubernetes 组件在 kube-system 命名空间中作为 Pod 运行。因此,这个命名空间的限制政策较少,从而使这些组件能够正常运行。

网络策略

CIS 要求所有命名空间应用网络策略,合理限制进入命名空间和 Pod 的流量。

K3s Hardening Guides - 图5备注

这些是 CIS Benchmark 中的手动检查。CIS 扫描结果将标记为 warning,因为需要集群操作员进行手动检查。

网络策略可以放置在 /var/lib/rancher/k3s/server/manifests 目录下的 policy.yaml 文件中。如果该目录不是作为 PSP(如上所述)的一部分创建的,则必须首先创建该目录。

  1. sudo mkdir -p -m 700 /var/lib/rancher/k3s/server/manifests

以下是合规的网络策略示例:

  1. ---
  2. kind: NetworkPolicy
  3. apiVersion: networking.k8s.io/v1
  4. metadata:
  5. name: intra-namespace
  6. namespace: kube-system
  7. spec:
  8. podSelector: {}
  9. ingress:
  10. - from:
  11. - namespaceSelector:
  12. matchLabels:
  13. name: kube-system
  14. ---
  15. kind: NetworkPolicy
  16. apiVersion: networking.k8s.io/v1
  17. metadata:
  18. name: intra-namespace
  19. namespace: default
  20. spec:
  21. podSelector: {}
  22. ingress:
  23. - from:
  24. - namespaceSelector:
  25. matchLabels:
  26. name: default
  27. ---
  28. kind: NetworkPolicy
  29. apiVersion: networking.k8s.io/v1
  30. metadata:
  31. name: intra-namespace
  32. namespace: kube-public
  33. spec:
  34. podSelector: {}
  35. ingress:
  36. - from:
  37. - namespaceSelector:
  38. matchLabels:
  39. name: kube-public

除非特意允许,否则活动限制会阻止 DNS。以下是允许 DNS 相关流量的网络策略示例:

  1. ---
  2. apiVersion: networking.k8s.io/v1
  3. kind: NetworkPolicy
  4. metadata:
  5. name: default-network-dns-policy
  6. namespace: <NAMESPACE>
  7. spec:
  8. ingress:
  9. - ports:
  10. - port: 53
  11. protocol: TCP
  12. - port: 53
  13. protocol: UDP
  14. podSelector:
  15. matchLabels:
  16. k8s-app: kube-dns
  17. policyTypes:
  18. - Ingress

如果没有创建网络策略来允许访问,则默认情况下会阻止 metrics-server 和 Traefik Ingress 控制器。

  1. ---
  2. apiVersion: networking.k8s.io/v1
  3. kind: NetworkPolicy
  4. metadata:
  5. name: allow-all-metrics-server
  6. namespace: kube-system
  7. spec:
  8. podSelector:
  9. matchLabels:
  10. k8s-app: metrics-server
  11. ingress:
  12. - {}
  13. policyTypes:
  14. - Ingress
  15. ---
  16. apiVersion: networking.k8s.io/v1
  17. kind: NetworkPolicy
  18. metadata:
  19. name: allow-all-svclbtraefik-ingress
  20. namespace: kube-system
  21. spec:
  22. podSelector:
  23. matchLabels:
  24. svccontroller.k3s.cattle.io/svcname: traefik
  25. ingress:
  26. - {}
  27. policyTypes:
  28. - Ingress
  29. ---
  30. apiVersion: networking.k8s.io/v1
  31. kind: NetworkPolicy
  32. metadata:
  33. name: allow-all-traefik-v121-ingress
  34. namespace: kube-system
  35. spec:
  36. podSelector:
  37. matchLabels:
  38. app.kubernetes.io/name: traefik
  39. ingress:
  40. - {}
  41. policyTypes:
  42. - Ingress

K3s Hardening Guides - 图6备注

你必须像平常一样管理你创建的任何其他命名空间的网络策略。

API server 审计配置

CIS 要求 1.2.19 至 1.2.22 与配置 API server 审核日志相关。默认情况下,K3s 不会创建日志目录和审计策略,因为每个用户的审计策略要求和环境都是特定的。

如果你需要日志目录,则必须在启动 K3s 之前创建它。我们建议限制访问权限以避免泄露敏感信息。

  1. sudo mkdir -p -m 700 /var/lib/rancher/k3s/server/logs

以下是用于记录请求元数据的初始审计策略。应将策略写入到 /var/lib/rancher/k3s/server 目录下名为 audit.yaml 的文件中。有关 API server 的策略配置的详细信息,请参阅 官方 Kubernetes 文档

  1. ---
  2. apiVersion: audit.k8s.io/v1
  3. kind: Policy
  4. rules:
  5. - level: Metadata

还需要进一步配置才能通过 CIS 检查。这些在 K3s 中默认不配置,因为它们根据你的环境和需求而有所不同:

  • 确保 --audit-log-path 参数已经设置。
  • 确保 --audit-log-maxage 参数设置为 30 或适当的值。
  • 确保 --audit-log-maxbackup 参数设置为 10 或适当的值。
  • 确保 --audit-log-maxsize 参数设置为 100 或适当的值。

综合起来,要启用和配置审计日志,请将以下行添加到 Rancher 的 K3s 集群配置文件中:

  1. spec:
  2. rkeConfig:
  3. machineGlobalConfig:
  4. kube-apiserver-arg:
  5. - audit-policy-file=/var/lib/rancher/k3s/server/audit.yaml # CIS 3.2.1
  6. - audit-log-path=/var/lib/rancher/k3s/server/logs/audit.log # CIS 1.2.18
  7. - audit-log-maxage=30 # CIS 1.2.19
  8. - audit-log-maxbackup=10 # CIS 1.2.20
  9. - audit-log-maxsize=100 # CIS 1.2.21

Controller Manager 要求

CIS 要求 1.3.1 检查 Controller Manager 中的垃圾收集设置。垃圾收集对于确保资源充足可用性并避免性能和可用性下降非常重要。根据你的系统资源和测试结果,选择一个适当的阈值来激活垃圾收集。

你可以在 Rancher 的 K3s 集群文件中设置以下配置来解决此问题。下面的值仅是一个示例,请根据当前环境设置适当的阈值。

  1. spec:
  2. rkeConfig:
  3. machineGlobalConfig:
  4. kube-controller-manager-arg:
  5. - terminated-pod-gc-threshold=10 # CIS 1.3.1

配置 default Service Account

Kubernetes 提供了一个名为 default 的 service account,供集群工作负载使用,其中没有为 Pod 分配特定的 service account。当 Pod 需要从 Kubernetes API 获取访问权限时,应为该 Pod 创建一个特定的 service account,并为该 service account 授予权限。

对于 CIS 5.1.5,default service account 应配置为不提供 service account 令牌,并且不具有任何明确的权限分配。

可以通过在每个命名空间中将 default service account 的 automountServiceAccountToken 字段更新为 false 来解决此问题。

对于内置命名空间(kube-systemkube-publickube-node-leasedefault)中的 default service accounts,K3s 不会自动执行此操作。

将以下配置保存到名为 account_update.yaml 的文件中。

  1. ---
  2. apiVersion: v1
  3. kind: ServiceAccount
  4. metadata:
  5. name: default
  6. automountServiceAccountToken: false

创建一个名为 account_update.sh 的 Bash 脚本文件。确保使用 chmod +x account_update.sh 给脚本添加可执行权限。

  1. #!/bin/bash -e
  2. for namespace in $(kubectl get namespaces -A -o=jsonpath="{.items[*]['metadata.name']}"); do
  3. kubectl patch serviceaccount default -n ${namespace} -p "$(cat account_update.yaml)"
  4. done

每次向你的集群添加新的 service account 时,运行该脚本。

加固版 K3s 模板配置参考

Rancher 使用以下参考模板配置,基于本指南中的每个 CIS 控件创建加固过的自定义 K3s 集群。此参考内容不包括其他必需的集群配置指令,这些指令因你的环境而异。

  • v1.25 及更新的版本
  • v1.24 及更早的版本
  1. apiVersion: provisioning.cattle.io/v1
  2. kind: Cluster
  3. metadata:
  4. name: # 定义集群名称
  5. spec:
  6. defaultPodSecurityAdmissionConfigurationTemplateName: rancher-restricted
  7. enableNetworkPolicy: true
  8. kubernetesVersion: # 定义 K3s 版本
  9. rkeConfig:
  10. machineGlobalConfig:
  11. kube-apiserver-arg:
  12. - enable-admission-plugins=NodeRestriction,ServiceAccount # CIS 1.2.15, 1.2.13
  13. - audit-policy-file=/var/lib/rancher/k3s/server/audit.yaml # CIS 3.2.1
  14. - audit-log-path=/var/lib/rancher/k3s/server/logs/audit.log # CIS 1.2.18
  15. - audit-log-maxage=30 # CIS 1.2.19
  16. - audit-log-maxbackup=10 # CIS 1.2.20
  17. - audit-log-maxsize=100 # CIS 1.2.21
  18. - request-timeout=300s # CIS 1.2.22
  19. - service-account-lookup=true # CIS 1.2.24
  20. kube-controller-manager-arg:
  21. - terminated-pod-gc-threshold=10 # CIS 1.3.1
  22. secrets-encryption: true
  23. machineSelectorConfig:
  24. - config:
  25. kubelet-arg:
  26. - make-iptables-util-chains=true # CIS 4.2.7
  1. apiVersion: provisioning.cattle.io/v1
  2. kind: Cluster
  3. metadata:
  4. name: # 定义集群名称
  5. spec:
  6. enableNetworkPolicy: true
  7. kubernetesVersion: # 定义 K3s 版本
  8. rkeConfig:
  9. machineGlobalConfig:
  10. kube-apiserver-arg:
  11. - enable-admission-plugins=NodeRestriction,PodSecurityPolicy,ServiceAccount # CIS 1.2.15, 5.2, 1.2.13
  12. - audit-policy-file=/var/lib/rancher/k3s/server/audit.yaml # CIS 3.2.1
  13. - audit-log-path=/var/lib/rancher/k3s/server/logs/audit.log # CIS 1.2.18
  14. - audit-log-maxage=30 # CIS 1.2.19
  15. - audit-log-maxbackup=10 # CIS 1.2.20
  16. - audit-log-maxsize=100 # CIS 1.2.21
  17. - request-timeout=300s # CIS 1.2.22
  18. - service-account-lookup=true # CIS 1.2.24
  19. kube-controller-manager-arg:
  20. - terminated-pod-gc-threshold=10 # CIS 1.3.1
  21. secrets-encryption: true
  22. machineSelectorConfig:
  23. - config:
  24. kubelet-arg:
  25. - make-iptables-util-chains=true # CIS 4.2.7
  26. protect-kernel-defaults: true # CIS 4.2.6

结论

如果你按照本指南操作,由 Rancher 提供的 K3s 自定义集群将配置为通过 CIS Kubernetes Benchmark 测试。你可以查看我们的 K3s 自我评估指南,了解我们是如何验证每个 benchmarks 的,并且你可以在你的集群上执行相同的操作。