本页面介绍了 CIS Kubernetes 基准,提供了一项评估,并说明了 Google Distributed Cloud 为落实建议所采取的措施。
CIS 基准
Center for Internet Security(CIS,互联网安全中心)公布了最佳做法安全建议的基准。CIS Kubernetes 基准提供了一系列用于配置 Kubernetes 以支持可靠的安全状况的建议。基准与特定的 Kubernetes 版本相关联。CIS Kubernetes 基准是针对开源 Kubernetes 发行版编写的,旨在尽可能广泛应用于各个发行版。
版本
下表列出了用于执行本文档所述评估的 Distributed Cloud、Kubernetes 和 CIS Kubernetes Benchmark 的版本:
| Distributed Cloud 版本 | Kubernetes 版本 | CIS Kubernetes 基准版本 |
|---|---|---|
| 1.4.0 - 本地控制平面 | 1.25 | 1.70 |
访问基准
您可以通过 CIS 网站获取 CIS Kubernetes 基准。
建议级别
在 CIS Kubernetes 基准中,
| 级别 | 说明 |
|---|---|
| 第 1 级 | 建议应该: |
| 第 2 级 | 扩展第 1 级配置文件。 建议具有以下一个或多个特性: |
评估状态
每项建议都会包含评估状态。评估状态表明给定建议可以自动执行,还是需要手动步骤来实施。两种状态同样重要,并根据以下说明确定和提供支持:
| 记分 | 说明 |
|---|---|
| 自动 | 表示可以完全自动进行技术控制评估并将其验证为通过/失败状态的建议。建议将包含实现自动化所需的信息。 |
| 手动 | 表示无法完全自动进行技术控制评估的建议,并且需要所有或一些手动步骤来验证已配置状态是否按预期设置。预期状态因环境而异。 |
Distributed Cloud 本地控制平面集群的状态
| # | 建议 | 级别 | 状态 |
|---|---|---|---|
| 1 | 控制平面安全配置 | ||
| 1.1 | 控制平面节点配置文件 | ||
| 1.1.1 | 确保将 API 服务器 pod 规范文件权限设置为 644 或更严格(自动) |
L1 | 通过 |
| 1.1.2 | 确保将 API 服务器 pod 规范文件所有权设置为 root:root(自动) |
L1 | 通过 |
| 1.1.3 | 确保控制器管理器 pod 规范文件权限设置为 644 或更严格(自动) |
L1 | 通过 |
| 1.1.4 | 确保控制器管理器 pod 规范文件所有权设置为 root:root(自动) |
L1 | 通过 |
| 1.1.5 | 确保将调度器 pod 规范文件权限设置为 644 或更严格(自动) |
L1 | 通过 |
| 1.1.6 | 确保将调度器 pod 规范文件所有权设置为 root:root(自动) |
L1 | 通过 |
| 1.1.7 | 确保将 etcd pod 规范文件权限设置为 644 或更严格(自动) |
L1 | 通过 |
| 1.1.8 | 确保将 etcd pod 规范文件所有权设置为 root:root(自动) |
L1 | 通过 |
| 1.1.9 | 确保将容器网络接口文件权限设置为 644 或更严格(手动) |
L1 | 等效控制措施 |
| 1.1.10 | 确保将容器网络接口文件所有权设置为 root:root(手动) |
L1 | 通过 |
| 1.1.11 | 确保将 etcd 数据目录权限设置为 700 或更严格(自动) |
L1 | 等效控制措施 |
| 1.1.12 | 确保将 etcd 数据目录所有权设置为 etcd:etcd(自动) |
L1 | 等效控制措施 |
| 1.1.13 | 确保将 admin.conf 文件权限设置为 600 或更严格(自动) |
L1 | 通过 |
| 1.1.14 | 确保将 admin.conf 文件所有权设置为 root:root(自动) |
L1 | 通过 |
| 1.1.15 | 确保将 scheduler.conf 文件权限设置为 644 或更严格(自动) |
L1 | 通过 |
| 1.1.16 | 确保将 scheduler.conf 文件所有权设置为 root:root(自动) |
L1 | 等效控制措施 |
| 1.1.17 | 确保将 controller-manager.conf 文件权限设置为 644 或更严格(自动) |
L1 | 通过 |
| 1.1.18 | 确保将 controller-manager.conf 文件所有权设置为 root:root(自动) |
L1 | 等效控制措施 |
| 1.1.19 | 确保将 Kubernetes PKI 目录和文件所有权设置为 root:root(自动) |
L1 | 等效控制措施 |
| 1.1.20 | 确保将 Kubernetes PKI 证书文件权限设置为 644 或更严格(手动) |
L1 | 等效控制措施 |
| 1.1.21 | 确保将 Kubernetes PKI 密钥文件权限设置为 600(手动) |
L1 | 通过 |
| 1.2 | API 服务器 | ||
| 1.2.1 | 确保将 --anonymous-auth 参数设置为 false(手动) |
L1 | 通过 |
| 1.2.2 | 确保未设置 --token-auth-file 参数(自动) |
L1 | 通过 |
| 1.2.3 | 确保未设置 --DenyServiceExternalIPs(自动) |
L1 | 失败 |
| 1.2.4 | 确保对 --kubelet-client-certificate 和 --kubelet-client-key 参数进行适当设置(自动) |
L1 | 通过 |
| 1.2.5 | 确保对 --kubelet-certificate-authority 参数进行适当设置(自动) |
L1 | 通过 |
| 1.2.6 | 确保 --authorization-mode 参数未设置为 AlwaysAllow(自动) |
L1 | 通过 |
| 1.2.7 | 确保 --authorization-mode 参数包含 Node(自动) |
L1 | 通过 |
| 1.2.8 | 确保 --authorization-mode 参数包含 RBAC(自动) |
L1 | 失败 |
| 1.2.9 | 确保已设置准许控制插件 EventRateLimit(手动) | L1 | 通过 |
| 1.2.10 | 确保未设置准许控制插件 AlwaysAdmit(自动) | L1 | 通过 |
| 1.2.11 | 确保已设置准许控制插件 AlwaysPullImages(手动) | L1 | 失败 |
| 1.2.12 | 确保在未使用 PodSecurityPolicy 的情况下已设置准许控制插件 SecurityContextDeny(手动) | L1 | 警告 |
| 1.2.13 | 确保已设置准许控制插件 ServiceAccount(自动) | L1 | 通过 |
| 1.2.14 | 确保已设置准许控制插件 NamespaceLifecycle(自动) | L1 | 通过 |
| 1.2.15 | 确保已设置准许控制插件 NodeRestriction(自动) | L1 | 通过 |
| 1.2.16 | 确保 --secure-port 参数未设置为 0(自动) |
L1 | 通过 |
| 1.2.17 | 确保将 --profiling 参数设置为 false(自动) |
L1 | 通过 |
| 1.2.18 | 确保设置 --audit-log-path 参数(自动) |
L1 | 失败 |
| 1.2.19 | 确保将 --audit-log-maxage 参数设置为 30 或进行适当设置(自动) |
L1 | 失败 |
| 1.2.20 | 确保将 --audit-log-maxbackup 参数设置为 10 或进行适当设置(自动) |
L1 | 未通过 |
| 1.2.21 | 确保将 --audit-log-maxsize 参数设置为 100 或进行适当设置(自动) |
L1 | 失败 |
| 1.2.22 | 确保对 --request-timeout 参数进行适当设置(手动) |
L1 | 未通过 |
| 1.2.23 | 确保将 --service-account-lookup 参数设置为 true(自动) |
L1 | 通过 |
| 1.2.24 | 确保对 --service-account-key-file 参数进行适当设置(自动) |
L1 | 通过 |
| 1.2.25 | 确保对 --etcd-certfile 和 --etcd-keyfile 参数进行适当设置(自动) |
L1 | 通过 |
| 1.2.26 | 确保对 --tls-cert-file 和 --tls-private-key-file 参数进行适当设置(自动) |
L1 | 通过 |
| 1.2.27 | 确保对 --client-ca-file 参数进行适当设置(自动) |
L1 | 通过 |
| 1.2.28 | 确保对 --etcd-cafile 参数进行适当设置(自动) |
L1 | 通过 |
| 1.2.29 | 确保对 --encryption-provider-config 参数进行适当设置(手动) |
L1 | 通过 |
| 1.2.30 | 确保正确配置加密提供程序(手动) | L1 | 通过 |
| 1.2.31 | 确保 API 服务器仅使用强加密加密方式(手动) | L1 | 通过 |
| 1.3 | 控制器管理器 | ||
| 1.3.1 | 确保对 --terminated-pod-gc-threshold 参数进行适当设置(手动) |
L1 | 通过 |
| 1.3.2 | 确保将 --profiling 参数设置为 false(自动) |
L1 | 通过 |
| 1.3.3 | 确保将 --use-service-account-credentials 参数设置为 true(自动) |
L1 | 通过 |
| 1.3.4 | 确保对 --service-account-private-key-file 参数进行适当设置(自动) |
L1 | 通过 |
| 1.3.5 | 确保对 --root-ca-file 参数进行适当设置(自动) |
L1 | 通过 |
| 1.3.6 | 确保将 RotateKubeletServerCertificate 参数设置为 true(自动) | L2 | 通过 |
| 1.3.7 | 确保将 --bind-address 参数设置为 127.0.0.1(自动) |
L1 | 通过 |
| 1.4 | 调度器 | ||
| 1.4.1 | 确保将 --profiling 参数设置为 false(自动) |
L1 | 通过 |
| 1.4.2 | 确保将 --bind-address 参数设置为 127.0.0.1(自动) |
L1 | 通过 |
| 2 | ** etcd 节点配置** |
||
| 2.1 | 确保对 --cert-file 和 --key-file 参数进行适当设置(自动) |
L1 | 通过 |
| 2.2 | 确保将 --client-cert-auth 参数设置为 true(自动) |
L1 | 通过 |
| 2.3 | 确保 --auto-tls 参数未设置为 true(自动) |
L1 | 通过 |
| 2.4 | 确保对 --peer-cert-file 和 --peer-key-file 参数进行适当设置(自动) |
L1 | 通过 |
| 2.5 | 确保将 --peer-client-cert-auth 参数设置为 true(自动) |
L1 | 通过 |
| 2.6 | 确保 --peer-auto-tls 参数未设置为 true(自动) |
L1 | 通过 |
| 2.7 | 确保已对 etcd 使用唯一的证书授权机构(手动) | L2 | 通过 |
| 3 | 控制平面配置 | ||
| 3.1 | 身份验证和授权 | ||
| 3.1.1 | 不应对用户使用客户端证书身份验证(手动) | L2 | 通过 |
| 3.2 | Logging | ||
| 3.2.1 | 确保创建最低审核政策(手动) | L1 | 通过 |
| 3.2.2 | 确保审核政策涵盖关键的安全问题(手动) | L2 | 失败 |
| 4 | 工作器节点安全配置 | ||
| 4.1 | 工作器节点配置文件 | ||
| 4.1.1 | 确保将 kubelet 服务文件权限设置为 644 或更严格(自动) |
L1 | 失败 |
| 4.1.2 | 确保将 kubelet 服务文件的所有权设置为 root:root(自动) |
L1 | 通过 |
| 4.1.3 | 如果存在代理 kubeconfig 文件,请确保将权限设置为 644 或更严格(手动) |
L1 | 通过 |
| 4.1.4 | 如果存在代理 kubeconfig 文件,请确保将所有权设置为 root:root(手动) |
L1 | 通过 |
| 4.1.5 | 确保将 --kubeconfig kubelet.conf 文件权限设置为 644 或更严格(自动) |
L1 | 通过 |
| 4.1.6 | 确保将 --kubeconfig kubelet.conf 文件所有权设置为 root:root(自动) |
L1 | 通过 |
| 4.1.7 | 确保将证书授权机构文件权限设置为 644 或更严格(手动) |
L1 | 失败 |
| 4.1.8 | 确保将客户端证书授权机构文件所有权设置为 root:root(手动) |
L1 | 通过 |
| 4.1.9 | 确保将 kubelet --config 配置文件的权限设置为 644 或更严格(自动) |
L1 | 失败 |
| 4.1.10 | 确保将 kubelet --config 配置文件的所有权设置为 root:root(自动) |
L1 | 通过 |
| 4.2 | Kubelet | ||
| 4.2.1 | 确保将 --anonymous-auth 参数设置为 false(自动) |
L1 | 通过 |
| 4.2.2 | 确保 --authorization-mode 参数未设置为 AlwaysAllow(自动) |
L1 | 通过 |
| 4.2.3 | 确保对 --client-ca-file 参数进行适当设置(自动) |
L1 | 通过 |
| 4.2.4 | 确保将 --read-only-port 参数设置为 0(手动) |
L1 | 失败 |
| 4.2.5 | 确保 --streaming-connection-idle-timeout 参数未设置为 0(手动) |
L1 | 通过 |
| 4.2.6 | 确保将 --protect-kernel-defaults 参数设置为 true(自动) |
L1 | 通过 |
| 4.2.7 | 确保将 --make-iptables-util-chains 参数设置为 true(自动) |
L1 | 通过 |
| 4.2.8 | 确保未设置 --hostname-override 参数(手动) |
L2 | 通过 |
| 4.2.9 | 确定将 --event-qps 参数设置为 0 或一个层级以确保适当的事件捕获操作(手动) |
L1 | 等效控制措施 |
| 4.2.10 | 确保对 --tls-cert-file 和 --tls-private-key-file 参数进行适当设置(手动) |
L1 | 通过 |
| 4.2.11 | 确保未将 --rotate-certificates 参数设置为 false(自动) |
L1 | 通过 |
| 4.2.12 | 验证 RotateKubeletServerCertificate 参数是否设置为 true(手动) | L1 | 通过 |
| 4.2.13 | 确保 Kubelet 仅使用强加密加密方式(手动) | L1 | 失败 |
Distributed Cloud 本地控制平面集群的“失败”和“等效控制措施”
| # | 建议 | 级别 | 状态 | 值 | 理由 |
|---|---|---|---|---|---|
| 1 | 控制平面安全配置 | ||||
| 1.1.9 | 确保将容器网络接口文件权限设置为 644 或更严格(手动) |
L1 | 等效控制措施 | 755 |
无。 |
| 1.1.11 | 确保将 etcd 数据目录权限设置为 700 或更严格(自动) |
L1 | 等效控制措施 | 755 |
etcd 数据目录具有默认的 755 权限,但其子目录使用 700。 |
| 1.1.12 | 确保将 etcd 数据目录所有权设置为 etcd:etcd(自动) |
L1 | 等效控制措施 | 2003:2003 |
由于无根控制平面(为了增强安全性),etcd 数据目录 /var/lib/etcd 由 2003:2003 所有。 |
| 1.1.16 | 确保将 scheduler.conf 文件所有权设置为 root:root(自动) |
L1 | 等效控制措施 | 2002:2002 |
由于无根控制平面(为了增强安全性),scheduler.conf 由 2002:2002 所有。 |
| 1.1.18 | 确保将 controller-manager.conf 文件所有权设置为 root:root(自动) |
L1 | 等效控制措施 | 2001:2001 |
由于无根控制平面(为了增强安全性),controller-manager.conf 由 2001:2001 所有。 |
| 1.1.19 | 确保将 Kubernetes PKI 目录和文件所有权设置为 root:root(自动) |
L1 | 等效控制措施 | 不定 | PKI 目录 /etc/kubernetes/pki 归 root:root 所有;该目录中的文件具有不同的所有者。这是因为无根控制平面(为了增强安全性)。 |
| 1.1.20 | 确保将 Kubernetes PKI 证书文件权限设置为 644 或更严格(手动) |
L1 | 等效控制措施 | 644 |
这是因为无根控制平面(为了增强安全性)。 |
| 1.2 | API 服务器 | ||||
| 1.2.3 | 确保未设置 --DenyServiceExternalIPs(自动) |
L1 | 失败 | ||
| 1.2.9 | 确保 --authorization-mode 参数包含 RBAC(自动) |
L1 | 失败 | 事件速率限制准入控制器是一项 Kubernetes Alpha 版功能。Google Distributed Cloud 不支持非 GA 版功能。 | |
| 1.2.11 | 确保未设置准许控制插件 AlwaysAdmit(自动) |
L1 | 失败 | ||
| 1.2.12 | 确保已设置准许控制插件 AlwaysPullImages(手动) |
L1 | 失败 | AlwaysPullImages 准许控制器会为非合作多租户集群中的私有注册表映像提供一定程度的保护,但代价是使容器注册表成为在整个集群中创建新 pod 的单点故障。Distributed Cloud 集群不启用 AlwaysPullImages 准入控制器,因此集群管理员负责实施准入政策来自行进行该项权衡。 |
|
| 1.2.18 | 确保设置 --audit-log-path 参数(自动) |
L1 | 失败 | Distributed Cloud 会捕获审核日志,但不会将此标志用于审核。如需了解详情,请参阅审核日志记录。 | |
| 1.2.19 | 确保将 --audit-log-maxage 参数设置为 30 或进行适当设置(自动) |
L1 | 失败 | Distributed Cloud 会捕获审核日志,但不会将此标志用于审核。如需了解详情,请参阅审核日志记录。 | |
| 1.2.20 | 确保将 --audit-log-maxbackup 参数设置为 10 或进行适当设置(自动) |
L1 | 失败 | Distributed Cloud 会捕获审核日志,但不会将此标志用于审核。如需了解详情,请参阅审核日志记录。 | |
| 1.2.21 | 确保将 --audit-log-maxsize 参数设置为 100 或进行适当设置(自动) |
L1 | 失败 | Distributed Cloud 会捕获审核日志,但不会将此标志用于审核。如需了解详情,请参阅审核日志记录。 | |
| 1.2.22 | 确保对 --request-timeout 参数进行适当设置(手动) |
L1 | 失败 | Distributed Cloud 会捕获审核日志,但不会将此标志用于审核。如需了解详情,请参阅审核日志记录。 | |
| 3 | 控制平面配置 | ||||
| 3.2.2 | 确保审核政策涵盖关键的安全问题(手动) | L2 | 失败 | ||
| 4 | 工作器节点安全配置 | ||||
| 4.1.1 | 确保将 kubelet 服务文件权限设置为 644 或更严格(自动) |
L1 | 失败 | 755 |
|
| 4.1.7 | 确保将证书授权机构文件权限设置为 644 或更严格(手动) |
L1 | 失败 | ||
| 4.1.9 | 确保将 kubelet --config 配置文件的权限设置为 644 或更严格(自动) |
L1 | 失败 | 644 |
|
| 4.2.4 | 确保将 --read-only-port 参数设置为 0(手动) |
L1 | 失败 | Distributed Cloud 集群将 --read-only-port 实参设置为 10255,用于收集 kubelet 指标。 |
|
| 4.2.9 | 确定将 --event-qps 参数设置为 0 或一个层级以确保适当的事件捕获操作(手动) |
L1 | 等效控制措施 | Distributed Cloud 集群使用 –rotate-server-certificates 标志管理 kubelet 服务器 TLS。 |
|
| 4.2.13 | 确保 Kubelet 仅使用强加密加密方式(手动) | L1 | 失败 |