本文档介绍什么是 CIS Kubernetes 和 Google Kubernetes Engine (GKE) 基准、如何审核基准合规性,以及在您无法直接审核或实施建议的情况下 GKE 的配置。
使用 CIS 基准
Center for Internet Security(CIS,互联网安全中心)公布了最佳做法安全建议的基准。CIS Kubernetes 基准是一系列用于配置 Kubernetes 以支持可靠的安全状况的建议。基准与特定的 Kubernetes 版本相关联。CIS Kubernetes 基准是针对开源 Kubernetes 发行版编写的,旨在尽可能广泛应用于各个发行版。
对于 GKE 等托管式服务,并非基准上的所有内容都由您负责,而且您无法直接审核或修正某些建议。如果您在 GKE 上运行,请使用 CIS GKE 基准,这是 CIS Kubernetes 基准的子基准,专门应用于 GKE 发行版。该基准来自现有的 CIS 基准,但移除了不可由用户配置或管理的项,同时添加了 Google Cloud 特有的其他控制措施。
多组基准
通过 GKE,您可以为 GKE、Kubernetes、Docker、Container-Optimized OS 和 Linux 使用 CIS 基准。如需下载适用于这些产品的最新基准,请访问 CIS 基准网站。
默认容器运行时 containerd 没有 CIS 基准。
与 GKE 配合使用的 Windows Server 节点不根据相应的 CIS 基准计分,因为 Windows Server CIS 基准并未明确把 Kubernetes 的使用计算在内,并且 Kubernetes CIS 基准目前不包含 Windows 节点。
一些工具会尝试根据多个 CIS 基准(例如 Linux、Docker 和 Kubernetes)分析 Kubernetes 节点并合并结果。这通常会导致难以理解和可能相互矛盾的建议,因为这些基准并不是针对在 Kubernetes 环境中合并和应用而设计的。
责任共担模型
在 GKE 中,在责任共担模型下,Google 负责管理以下 Kubernetes 组件:
- 控制平面,包括控制平面虚拟机、API 服务器、虚拟机上的其他组件以及 etcd。
- Kubernetes 发行版。
- 节点的操作系统。
您通常无法在 GKE 中对与这些项相关的配置进行审核或修改。
您仍需负责升级运行工作负载的节点以及工作负载本身。您通常可以审核和修正关于这些组件的任何建议。
审核和修正的范围
CIS GKE 基准来自现有的 CIS Kubernetes 基准,但移除了用户无法配置或管理的内容,同时添加了 Google Cloud 特有的其他控制措施。
CIS GKE 基准的各个部分如下:
- 控制平面组件、etcd 和控制平面配置(第 1 部分、第 2 部分和第 3 部分)均来自 CIS Kubernetes 基准。这些项通常无法在 GKE 上进行审核或修正。
- 工作器节点(第 4 部分)来自 CIS Kubernetes 基准。其中一些项可以通过 GKE 进行审核或修正,但相关说明可能会有所不同。
- 政策(第 5 部分)也来自 CIS Kubernetes 基准。这些项通常可直接应用于 GKE,无需对说明进行更改。
- CIS GKE 基准中的托管式服务(第 6 部分)是特定于 GKE 的新内容。此部分包含专门针对 Google Cloud 控制措施的所有建议。您可以在 GKE 上审核和修正这些建议。
对于无法在 GKE 上进行审核或修正的项,请参阅默认值部分,了解在 GKE 中创建的默认集群如何根据 CIS Kubernetes 基准执行。
版本
请注意,不同基准的版本号可能不同。
本文档涉及以下版本:
Kubernetes 版本 | CIS Kubernetes 基准版本 | CIS GKE 基准版本 |
---|---|---|
1.15 | 1.5.0 | 1.0.0 |
CIS Kubernetes 基准
访问基准
您可以通过 CIS 网站获取 CIS Kubernetes 基准。
建议级别
在 CIS Kubernetes 基准中:
级别 | 说明 |
---|---|
第 1 级 | 建议应该: |
第 2 级 | 扩展第 1 级配置文件。 建议具有以下一个或多个特性: |
建议评分
在 CIS Kubernetes 基准中:
评分 | 说明 |
---|---|
计分 | 不遵守这些建议将导致最终基准分数降低。 |
不计分 | 不遵守这些建议不会降低最终基准分数。 |
GKE 上的评估
我们使用以下值指定 GKE 中 Kubernetes 建议的状态:
状态 | 说明 |
---|---|
通过 | 符合基准建议。 |
失败 | 不符合基准建议。 |
等效控制措施 | 不符合基准建议中的确切条款,但 GKE 中的其他机制可提供等效的安全控制措施。 |
取决于环境 | GKE 不会配置与此建议相关的项。用户的配置决定其环境是否符合基准建议。 |
GKE 上的状态
使用指定版本创建新的 GKE 集群时,根据 CIS Kubernetes 基准,这些集群的具体执行方式如下。
默认 GKE 集群的状态:
# | 建议 | 计分/不计分 | 级别 | 默认状态 |
---|---|---|---|---|
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 文件权限设置为 644 或更严格 |
计分 | 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 | 确保未设置 --basic-auth-file 参数 | 计分 | L1 | 通过 |
1.2.3 | 确保未设置 --token-auth-file 参数 | 计分 | L1 | 失败 |
1.2.4 | 确保将 --kubelet-https 参数设置为 true | 计分 | L1 | 通过 |
1.2.5 | 确保对 --kubelet-client-certificate 和 --kubelet-client-key 参数进行适当设置 | 计分 | L1 | 通过 |
1.2.6 | 确保对 --kubelet-certificate-authority 参数进行适当设置 | 计分 | L1 | 通过 |
1.2.7 | 确保 --authorization-mode 参数未设置为 AlwaysAllow | 计分 | L1 | 通过 |
1.2.8 | 确保 --authorization-mode 参数包含 Node | 计分 | L1 | 通过 |
1.2.9 | 确保 --authorization-mode 参数包含 RBAC | 计分 | L1 | 通过 |
1.2.10 | 确保已设置准许控制插件 EventRateLimit | 不计分 | L1 | 失败 |
1.2.11 | 确保未设置准许控制插件 AlwaysAdmit | 计分 | L1 | 通过 |
1.2.12 | 确保已设置准许控制插件 AlwaysPullImages | 不计分 | L1 | 失败 |
1.2.13 | 确保在未使用 PodSecurityPolicy 的情况下已设置准许控制插件 SecurityContextDeny | 不计分 | L1 | 失败 |
1.2.14 | 确保已设置准许控制插件 ServiceAccount | 计分 | L1 | 通过 |
1.2.15 | 确保已设置准许控制插件 NamespaceLifecycle | 计分 | L1 | 通过 |
1.2.16 | 确保已设置准许控制插件 PodSecurityPolicy | 计分 | L1 | 失败 |
1.2.17 | 确保已设置准许控制插件 NodeRestriction | 计分 | L1 | 通过 |
1.2.18 | 确保未设置 --insecure-bind-address 参数 | 计分 | L1 | 通过 |
1.2.19 | 确保将 --insecure-port 参数设置为 0 | 计分 | L1 | 通过 |
1.2.20 | 确保 --secure-port 参数未设置为 0 | 计分 | L1 | 通过 |
1.2.21 | 确保将 --profiling 参数设置为 false | 计分 | L1 | 失败 |
1.2.22 | 确保已设置 --audit-log-path 参数 | 计分 | L1 | 等效控制措施 |
1.2.23 | 确保将 --audit-log-maxage 参数设置为 30 或进行适当设置 | 计分 | L1 | 等效控制措施 |
1.2.24 | 确保将 --audit-log-maxbackup 参数设置为 10 或进行适当设置 | 计分 | L1 | 等效控制措施 |
1.2.25 | 确保将 --audit-log-maxsize 参数设置为 100 或进行适当设置 | 计分 | L1 | 等效控制措施 |
1.2.26 | 确保对 --request-timeout 参数进行适当设置 | 计分 | L1 | 通过 |
1.2.27 | 确保将 --service-account-lookup 参数设置为 true | 计分 | L1 | 通过 |
1.2.28 | 确保对 --service-account-key-file 参数进行适当设置 | 计分 | L1 | 通过 |
1.2.29 | 确保对 --etcd-certfile 和 --etcd-keyfile 参数进行适当设置 | 计分 | L1 | 失败 |
1.2.30 | 确保对 --tls-cert-file 和--tls-private-key-file 参数进行适当设置 | 计分 | L1 | 通过 |
1.2.31 | 确保对 --client-ca-file 参数进行适当设置 | 计分 | L1 | 通过 |
1.2.32 | 确保对 --etcd-cafile 参数进行适当设置 | 计分 | L1 | 失败 |
1.2.33 | 确保对 --encryption-provider-config 参数进行适当设置 | 计分 | L1 | 通过 |
1.2.34 | 确保正确配置加密提供程序 | 计分 | L1 | 失败 |
1.2.35 | 确保 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 | 确保将 kubelet.conf 文件权限设置为 644 或更严格 |
计分 | L1 | 通过 |
4.1.6 | 确保 kubelet.conf 文件所有权设置为 root:root |
计分 | L1 | 通过 |
4.1.7 | 确保将证书授权机构文件权限设置为 644 或更严格 |
计分 | L1 | 通过 |
4.1.8 | 确保将客户端证书授权机构文件所有权设置为 root:root |
计分 | L1 | 通过 |
4.1.9 | 确保将 kubelet 配置文件的权限设置为 644 或更严格 |
计分 | L1 | 通过 |
4.1.10 | 确保将 kubelet 配置文件的所有权设置为 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 参数 | 不计分 | L1 | 通过 |
4.2.9 | 确保将 --event-qps 参数设置为 0 或者可确保正确捕获事件的级别 | 不计分 | L2 | 失败 |
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 | 未通过 |
5 | 政策 | |||
5.1 | RBAC 和服务账号 | |||
5.1.1 | 确保仅在必要时使用 cluster-admin 角色 | 不计分 | L1 | 取决于环境 |
5.1.2 | 尽可能缩减对密钥的访问权限 | 不计分 | L1 | 取决于环境 |
5.1.3 | 尽可能减少通配符在 Roles 和 ClusterRoles 中的使用 | 不计分 | L1 | 取决于环境 |
5.1.4 | 尽可能缩减用于创建 pod 的访问权限 | 不计分 | L1 | 取决于环境 |
5.1.5 | 确保未频繁使用默认服务账号 | 计分 | L1 | 取决于环境 |
5.1.6 | 确保仅在必要时装载服务账号令牌 | 不计分 | L1 | 取决于环境 |
5.2 | Pod 安全政策 | |||
5.2.1 | 尽可能减少特权容器的准许 | 不计分 | L1 | 取决于环境 |
5.2.2 | 尽可能减少希望共享主机进程 ID 命名空间的容器的准许 | 计分 | L1 | 取决于环境 |
5.2.3 | 尽可能减少希望共享主机 IPC 命名空间的容器的准许 | 计分 | L1 | 取决于环境 |
5.2.4 | 尽可能减少希望共享主机网络命名空间的容器的准许 | 计分 | L1 | 取决于环境 |
5.2.5 | 尽可能减少具有 allowPrivilegeEscalation 的容器的准许 | 计分 | L1 | 取决于环境 |
5.2.6 | 尽可能减少根容器的准许 | 不计分 | L2 | 取决于环境 |
5.2.7 | 尽可能减少具有 NET_RAW 功能的容器的准许 | 不计分 | L1 | 取决于环境 |
5.2.8 | 尽可能减少具有附加功能的容器的准许 | 不计分 | L1 | 取决于环境 |
5.2.9 | 尽可能减少具有分配的功能的容器的准许 | 不计分 | L2 | 取决于环境 |
5.3 | 网络政策和 CNI | |||
5.3.1 | 确保所使用的 CNI 支持网络政策 | 不计分 | L1 | 通过 |
5.3.2 | 确保所有命名空间都定义了网络政策 | 计分 | L2 | 取决于环境 |
5.4 | 密文管理 | |||
5.4.1 | 优先将密文用作文件而不是用作环境变量 | 不计分 | L1 | 取决于环境 |
5.4.2 | 考虑外部密文存储 | 不计分 | L2 | 取决于环境 |
5.5 | 可扩展的准许控制 | |||
5.5.1 | 使用 ImagePolicyWebhook 准许控制器配置映像来源 | 不计分 | L2 | 取决于环境 |
5.6 | 常规政策 | |||
5.6.1 | 使用命名空间在各资源之间创建管理边界 | 不计分 | L1 | 取决于环境 |
5.6.2 | 确保在 pod 定义中将 seccomp 配置文件设置为 docker/default | 不计分 | L2 | 取决于环境 |
5.6.3 | 将安全上下文应用到您的 Pod 和容器 | 不计分 | L2 | 取决于环境 |
5.6.4 | 不应使用默认命名空间 | 计分 | L2 | 取决于环境 |
GKE 上的默认值
如果新 GKE 集群的默认值未通过 CIS Kubernetes 基准中的建议,可参考以下在 GKE 中使用的默认值及其说明。您可以按照 CIS GKE 基准中列出的修正程序对某些建议进行修正。可以自动审核的项在 CIS GKE 基准中标记为“计分”。
默认 GKE 集群中“失败”或“取决于环境”的建议的默认值:
# | 建议 | 计分/不计分 (根据 CIS Kubernetes 基准) |
级别 | 默认状态 | 默认值 | 理由 | 计分/不计分 (根据 CIS GKE 基准) |
---|---|---|---|---|---|---|---|
1 | 控制平面组件 | ||||||
1.2 | API 服务器 | ||||||
1.2.1 | 确保将 --anonymous-auth 参数设置为 false | 不计分 | L1 | 失败 | true |
一些 GKE 监控组件使用匿名身份验证来获取指标。虽然 GKE 允许对 kubelet 进行匿名身份验证,但是公开范围与只读端口相同,因为 GKE 会停用其他调试处理程序。 | 不计分 |
1.2.3 | 确保未设置 --token-auth-file 参数 | 计分 | L1 | 失败 | 集 | 一些控制层面组件使用静态令牌启动,然后这些令牌被用于向 API 服务器进行身份验证。 | 不计分 |
1.2.10 | 确保已设置准许控制插件 EventRateLimit | 不计分 | L1 | 失败 | 未设置 | GKE 不支持事件速率限制准许控制器,因为它是 Kubernetes Alpha 版功能。 | 不计分 |
1.2.12 | 确保已设置准许控制插件 AlwaysPullImages | 不计分 | L1 | 失败 | 未设置 | AlwaysPullImage 准许控制器会为非合作多租户集群中的私有镜像仓库映像提供某些保护,但代价是使容器镜像仓库成为在整个集群中创建新 pod 的单点故障。GKE 不启用 AlwaysPullImage 准许控制器,因此集群管理员负责实施准许政策来自行进行该项权衡。 | 不计分 |
1.2.13 | 确保在未使用 PodSecurityPolicy 的情况下已设置准许控制插件 SecurityContextDeny | 不计分 | L1 | 失败 | 未设置 | 默认情况下,GKE 不会启用安全上下文准许控制器。使用 Pod 安全政策可以实现更多的控制,建议使用此政策。 | 不计分 |
1.2.16 | 确保已设置准许控制插件 PodSecurityPolicy | 计分 | L1 | 失败 | 未设置 | 默认情况下,GKE 不启用 Pod 安全政策准许控制器,因为这需要设置政策。GKE 客户可以启用 PodSecurityPolicy。 | 不计分,另请参阅 6.10.3 |
1.2.21 | 确保将 --profiling 参数设置为 false | 计分 | L1 | 失败 | 未设置 | GKE 使用性能剖析进行调试。 | 不计分 |
1.2.22 | 确保已设置 --audit-log-path 参数 | 计分 | L1 | 等效控制措施 | 未设置 | GKE 捕获审核日志,但不会将这些标志用于审核。如需了解详情,请参阅 GKE 审核政策。 | 不计分 |
1.2.23 | 确保将 --audit-log-maxage 参数设置为 30 或进行适当设置 | 计分 | L1 | 等效控制措施 | 未设置 | GKE 捕获审核日志,但不会将这些标志用于审核。如需了解详情,请参阅 GKE 审核政策。 | 不计分 |
1.2.24 | 确保将 --audit-log-maxbackup 参数设置为 10 或进行适当设置 | 计分 | L1 | 等效控制措施 | 未设置 | GKE 捕获审核日志,但不会将这些标志用于审核。如需了解详情,请参阅 GKE 审核政策。 | 不计分 |
1.2.25 | 确保将 --audit-log-maxsize 参数设置为 100 或进行适当设置 | 计分 | L1 | 等效控制措施 | 未设置 | GKE 捕获审核日志,但不会将这些标志用于审核。如需了解详情,请参阅 GKE 审核政策。 | 不计分 |
1.2.29 | 确保对 --etcd-certfile 和 --etcd-keyfile 参数进行适当设置 | 计分 | L1 | 失败 | 未设置 | GKE 目前不使用 mTLS 来保护 API 服务器到 etcd 之间的连接。请注意,etcd 侦听 localhost。 如需了解详情,请参阅集群信任。 | 不计分 |
1.2.32 | 确保对 --etcd-cafile 参数进行适当设置 | 计分 | L1 | 失败 | 未设置 | GKE 目前不使用 mTLS 来保护 API 服务器到 etcd 之间的连接。请注意,etcd 侦听 localhost。 如需了解详情,请参阅集群信任。 | 不计分 |
1.2.34 | 确保正确配置加密提供程序 | 计分 | L1 | 失败 | identity |
GKE 会默认对客户内容进行静态加密。 要进一步加密 Secret,请使用应用层 Secret 加密。 | 不计分,另请参阅 6.3.1 |
1.3 | 控制器管理器 | ||||||
1.3.2 | 确保将 --profiling 参数设置为 false | 计分 | L1 | 失败 | true |
GKE 使用性能剖析进行调试。 | 不计分 |
1.3.6 | 确保将 RotateKubeletServerCertificate 参数设置为 true | 计分 | L2 | 等效控制措施 | false |
GKE 会轮替 kubelet 证书,但不使用此标志。 | 不计分 |
1.4 | 调度器 | ||||||
1.4.1 | 确保将 --profiling 参数设置为 false | 计分 | L1 | 失败 | true |
GKE 使用性能剖析进行调试。 | 不计分 |
2 | etcd | ||||||
2.1 | 确保对 --cert-file 和 --key-file 参数进行适当设置 | 计分 | L1 | 失败 | 未设置 | GKE 目前不使用 mTLS 来保护 API 服务器到 etcd 之间的连接。请注意,etcd 侦听 localhost。 如需了解详情,请参阅集群信任。 | 不计分 |
2.2 | 确保将 --client-cert-auth 参数设置为 true | 计分 | L1 | 失败 | 未设置 | GKE 目前不使用 mTLS 来保护 API 服务器到 etcd 之间的连接。请注意,etcd 侦听 localhost。 如需了解详情,请参阅集群信任。 | 不计分 |
2.4 | 确保对 --peer-cert-file 和 --peer-key-file 参数进行适当设置 | 计分 | L1 | 等效控制措施 | 未设置 | GKE 对 etcd 各实例之间的对等流量使用 mTLS。这些标志用于区域级集群而不是地区级集群,因为地区级集群中只有一个 etcd 实例。如需了解详情,请参阅集群信任。 | 不计分 |
2.5 | 确保将 --peer-client-cert-auth 参数设置为 true | 计分 | L1 | 等效控制措施 | 未设置 | GKE 对 etcd 各实例之间的对等流量使用 mTLS。这些标志用于区域级集群而不是地区级集群,因为地区级集群中只有一个 etcd 实例。如需了解详情,请参阅集群信任。 | 不计分 |
2.6 | 确保 --peer-auto-tls 参数未设置为 true | 计分 | L1 | 等效控制措施 | 未设置 | GKE 对 etcd 各实例之间的对等流量使用 mTLS。这些标志用于区域级集群而不是地区级集群,因为地区级集群中只有一个 etcd 实例。如需了解详情,请参阅集群信任。 | 不计分 |
4 | 工作器节点 | ||||||
4.2 | Kubelet | ||||||
4.2.4 | 确保将 --read-only-port 参数设置为 0 | 计分 | L1 | 失败 | 10255 |
某些 GKE 监控组件使用 kubelet 只读端口来获取指标。 | 计分 |
4.2.6 | 确保将 --protect-kernel-defaults 参数设置为 true | 计分 | L1 | 失败 | false |
GKE 不会保护 Kubernetes 中的内核默认设置,因为客户工作负载可能需要修改这些默认设置。 | 计分 |
4.2.9 | 确保将 --event-qps 参数设置为 0 或者可确保正确捕获事件的级别 | 不计分 | L2 | 失败 | 5 |
事件是存储在 etcd 中的 Kubernetes 对象。为避免 etcd 过载,事件仅保留一个小时,它们不是合适的安全审核机制。允许此控制措施中建议的无限制的事件将使集群面临不必要的 DoS 风险,并且会与使用准许 EventRateLimits 的建议发生冲突。需要永久性存储的安全相关事件应发送到日志。 | 计分 |
4.2.10 | 确保对 --tls-cert-file 和--tls-private-key-file 参数进行适当设置 | 计分 | L1 | 等效控制措施 | 未设置 | GKE 对 kubelet 到 API 服务器的流量使用 mTLS。 GKE 对 API 服务器到 kubelet 的流量(已通过 GKE v1.12+ 集群的身份验证)使用 TLS。GKE 不使用这些标志,但是这些标志在 kubelet 配置文件中指定。如需了解详情,请参阅集群信任。 | 计分 |
4.2.11 | 确保 --rotate-certificates 参数未设置为 false | 计分 | L1 | 等效控制措施 | 未设置 | GKE 会轮替 GKE v1.12+ 集群的服务器证书。GKE 不使用这些标志,但是这些标志在 kubelet 配置文件中指定。除非已启用安全强化型 GKE 节点,否则 GKE 不会轮替客户端证书。在这种情况下,GKE 不会使用这些标志,而是运行单独的证书轮替进程。如需了解详情,请参阅集群信任。 | 计分 |
4.2.12 | 确保将 RotateKubeletServerCertificate 参数设置为 true | 计分 | L1 | 等效控制措施 | 未设置 | GKE 会轮替 GKE v1.12+ 集群的服务器证书。GKE 不使用这些标志,但是这些标志在 kubelet 配置文件中指定。如需了解详情,请参阅集群信任。 | 计分 |
4.2.13 | 确保 kubelet 仅使用强加密加密方式 | 不计分 | 未通过 | 未设置 | GKE 使用 Go 语言默认的允许加密集,它们是 Go 语言加密专家认为可安全使用的加密集,也是 Kubernetes 的默认加密集。 | 不计分 | |
5 | 政策 | ||||||
5.1 | RBAC 和服务账号 | ||||||
5.1.1 | 确保仅在必要时使用 cluster-admin 角色 | 不计分 | L1 | 取决于环境 | 不适用 | 不计分 | |
5.1.2 | 尽可能缩减对密钥的访问权限 | 不计分 | L1 | 取决于环境 | 不适用 | 不计分 | |
5.1.3 | 尽可能减少通配符在 Roles 和 ClusterRoles 中的使用 | 不计分 | L1 | 取决于环境 | 不适用 | 不计分 | |
5.1.4 | 尽可能缩减用于创建 pod 的访问权限 | 不计分 | L1 | 取决于环境 | 不适用 | 不计分 | |
5.1.5 | 确保未频繁使用默认服务账号 | 计分 | L1 | 取决于环境 | 不适用 | 计分 | |
5.1.6 | 确保仅在必要时装载服务账号令牌 | 不计分 | L1 | 取决于环境 | 不适用 | 不计分 | |
5.2 | Pod 安全政策 | ||||||
5.2.1 | 尽可能减少特权容器的准许 | 不计分 | L1 | 取决于环境 | 不适用 | 默认情况下,未设置 Pod 安全政策。 | 计分 |
5.2.2 | 尽可能减少希望共享主机进程 ID 命名空间的容器的准许 | 计分 | L1 | 取决于环境 | 不适用 | 默认情况下,未设置 Pod 安全政策。 | 计分 |
5.2.3 | 尽可能减少希望共享主机 IPC 命名空间的容器的准许 | 计分 | L1 | 取决于环境 | 不适用 | 默认情况下,未设置 Pod 安全政策。 | 计分 |
5.2.4 | 尽可能减少希望共享主机网络命名空间的容器的准许 | 计分 | L1 | 取决于环境 | 不适用 | 默认情况下,未设置 Pod 安全政策。 | 计分 |
5.2.5 | 尽可能减少具有 allowPrivilegeEscalation 的容器的准许 | 计分 | L1 | 取决于环境 | 不适用 | 默认情况下,未设置 Pod 安全政策。 | 计分 |
5.2.6 | 尽可能减少根容器的准许 | 不计分 | L2 | 取决于环境 | 不适用 | 默认情况下,未设置 Pod 安全政策。 | 计分 |
5.2.7 | 尽可能减少具有 NET_RAW 功能的容器的准许 | 不计分 | L1 | 取决于环境 | 不适用 | 默认情况下,未设置 Pod 安全政策。 | 计分 |
5.2.8 | 尽可能减少具有附加功能的容器的准许 | 不计分 | L1 | 取决于环境 | 不适用 | 默认情况下,未设置 Pod 安全政策。 | 计分 |
5.2.9 | 尽可能减少具有分配的功能的容器的准许 | 不计分 | L2 | 取决于环境 | 不适用 | 默认情况下,未设置 Pod 安全政策。 | 计分 |
5.3 | 网络政策和 CNI | ||||||
5.3.2 | 确保所有命名空间都定义了网络政策 | 计分 | L2 | 取决于环境 | 不适用 | 计分 | |
5.4 | 密文管理 | ||||||
5.4.1 | 优先将密文用作文件而不是用作环境变量 | 不计分 | L1 | 取决于环境 | 不适用 | 不计分 | |
5.4.2 | 考虑外部密文存储 | 不计分 | L2 | 取决于环境 | 不适用 | 不计分 | |
5.5 | 可扩展的准许控制 | ||||||
5.5.1 | 使用 ImagePolicyWebhook 准许控制器配置映像来源 | 不计分 | L2 | 取决于环境 | 未启用 | 默认情况下,GKE 不启用映像政策网络钩子准许控制器。默认情况下,未设置使用 Binary Authorization 的映像来源,因为这需要设置政策。 | 不计分,另请参阅 6.10.5 |
5.6 | 常规政策 | ||||||
5.6.1 | 使用命名空间在各资源之间创建管理边界 | 不计分 | L1 | 取决于环境 | 不适用 | 不计分 | |
5.6.2 | 确保在 pod 定义中将 seccomp 配置文件设置为 docker/default | 不计分 | L2 | 取决于环境 | 不适用 | 默认情况下,未设置 seccomp 配置文件。 | 不计分 |
5.6.3 | 将安全上下文应用到您的 Pod 和容器 | 不计分 | L2 | 取决于环境 | 不适用 | 默认情况下,未设置安全上下文。 | 不计分 |
5.6.4 | 不应使用默认命名空间 | 计分 | L2 | 取决于环境 | 不适用 | 计分 |
CIS GKE 基准
访问基准
您可以通过 CIS 网站获取 CIS GKE 基准:
- 转到完整的 CIS 基准列表。
- 在 Kubernetes 标题下,点击展开查看相关内容 (Expand to see related content)。
- CIS GKE 基准报告已列出,现可供下载。
建议级别
在 CIS GKE 基准中,
级别 | 说明 |
---|---|
第 1 级 | 建议是指广泛适用的建议。这些建议应该应用于几乎所有环境。 |
第 2 级 | 建议可以营造更严格的安全环境,但不一定适用于所有情形。这些建议可能会对性能产生影响,或者无法与其他建议一起应用。在应用这些建议之前,应先对您的环境进行评估。 在某些情况下(例如多租户工作负载),这些建议可能相关性更高。 |
建议评分
在 CIS GKE 基准中,
评分 | 说明 |
---|---|
计分 |
建议可以使用自动化方法轻松进行测试,它们具有可被明确评估的值。 这些建议仅涵盖已正式推出的产品或功能。 |
不计分 |
无法使用自动化方法轻松评估建议,或需要通过评估来确定适合您工作负载的具体实现。这些建议可能使用 Beta 版产品或功能。 例如,Pod 安全政策要求使用专门针对您的工作负载的政策,并且是 Beta 版功能,因此是“不计分”。 |
GKE 上的评估
对于专门针对 GKE 的建议(第 6 部分),由于这些建议都是可配置的,可以在您的环境中配置为“通过”,因此我们使用以下值指定默认值:
状态 | 说明 |
---|---|
默认 | 默认情况下,新集群符合基准建议。 |
非默认 | 默认情况下,新集群不符合基准建议。 |
取决于环境 | GKE 不会配置与此建议相关的项。用户的配置决定其环境是否符合基准建议。 |
GKE 上的默认值
使用指定版本创建新的 GKE 集群时,根据 CIS Kubernetes 基准,这些集群的具体执行方式如下。
默认 GKE 集群的状态:
# | 建议 | 计分/不计分 | 级别 | 默认状态 |
---|---|---|---|---|
6 | 托管式服务 | |||
6.1 | 映像注册表和映像扫描 | |||
6.1.1 | 确保使用 GCR Container Analysis 或第三方提供商扫描映像漏洞 | 计分 | L1 | 非默认 |
6.1.2 | 尽可能缩减用户对 GCR 的访问权限 | 计分 | L1 | 取决于环境 |
6.1.3 | 尽可能缩减集群对 GCR 的只读访问权限 | 计分 | L1 | 非默认 |
6.1.4 | 尽可能将 Container Registry 限制为经过批准的 Container Registry | 不计分 | L2 | 非默认 |
6.2 | 身份和访问权限管理 (IAM) | |||
6.2.1 | 最好不使用 Compute Engine 默认服务账号运行 GKE 集群 | 计分 | L2 | 非默认 |
6.2.2 | 最好使用专用 Google Cloud 服务账号和 Workload Identity | 不计分 | L1 | 非默认 |
6.3 | Cloud Key Management Service (Cloud KMS) | |||
6.3.1 | 考虑使用 Cloud KMS 中托管的密钥加密 Kubernetes Secret | 计分 | L1 | 非默认 |
6.4 | 节点元数据 | |||
6.4.1 | 确保已停用旧版 Compute Engine 实例元数据 API | 计分 | L1 | 默认 |
6.4.2 | 确保已启用 GKE 元数据服务器 | 不计分 | L2 | 非默认 |
6.5 | 节点配置和维护 | |||
6.5.1 | 确保将 Container-Optimized OS (COS) 用于 GKE 节点映像 | 计分 | L2 | 默认 |
6.5.2 | 确保为 GKE 节点启用节点自动修复 | 计分 | L1 | 默认 |
6.5.3 | 确保为 GKE 节点启用节点自动升级 | 计分 | L1 | 默认 |
6.5.4 | 考虑使用发布版本自动管理 GKE 版本 | 不计分 | L1 | 非默认 |
6.5.5 | 确保已启用安全强化型 GKE 节点 | 不计分 | L1 | 非默认 |
6.5.6 | 确保已启用安全强化型 GKE 节点的完整性监控 | 不计分 | L1 | 非默认 |
6.5.7 | 确保已启用安全强化型 GKE 节点的安全启动 | 不计分 | L2 | 非默认 |
6.6 | 集群网络 | |||
6.6.1 | 考虑启用 VPC 流日志和节点内可见性 | 不计分 | L2 | 非默认 |
6.6.2 | 首选 VPC 原生集群 | 计分 | L1 | 非默认 |
6.6.3 | 确保已启用主实例授权网络 | 计分 | L1 | 非默认 |
6.6.4 | 确保已创建集群并启用了专用端点和停用了公共访问权限 | 计分 | L2 | 非默认 |
6.6.5 | 确保使用专用节点创建集群 | 计分 | L1 | 非默认 |
6.6.6 | 考虑为 GKE 工作器节点设置防火墙 | 不计分 | L1 | 非默认 |
6.6.7 | 确保已启用网络政策,并进行适当设置 | 不计分 | L1 | 非默认 |
6.6.8 | 考虑使用 Google 管理的 SSL 证书 | 不计分 | L2 | 取决于环境 |
6.7 | Logging | |||
6.7.1 | 确保已启用 Stackdriver Kubernetes Logging 和 Monitoring | 计分 | L1 | 默认 |
6.7.2 | 考虑启用 Linux auditd 日志记录 | 不计分 | L2 | 非默认 |
6.8 | 身份验证和授权 | |||
6.8.1 | 确保已停用使用静态密码进行基本身份验证 | 计分 | L1 | 默认 |
6.8.2 | 确保已停用使用客户端证书进行身份验证 | 计分 | L1 | 默认 |
6.8.3 | 考虑使用 Google RBAC 群组来管理 Kubernetes RBAC 用户 | 不计分 | L2 | 非默认 |
6.8.4 | 确保已停用旧版授权 (ABAC) | 计分 | L1 | 默认 |
6.9 | 存储 | |||
6.9.1 | 考虑为 GKE 永久性磁盘 (PD) 启用客户管理的加密密钥 (CMEK) | 不计分 | L1 | 非默认 |
6.10 | 其他集群配置 | |||
6.10.1 | 确保已停用 Kubernetes 网页界面 | 计分 | L1 | 默认 |
6.10.2 | 确保 Alpha 版集群未用于生产工作负载 | 计分 | L1 | 默认 |
6.10.3 | 确保已启用 Pod 安全政策,并进行适当设置 | 不计分 | L1 | 非默认 |
6.10.4 | 考虑使用 GKE Sandbox 运行不受信任的工作负载 | 不计分 | L2 | 非默认 |
6.10.5 | 最好视情况启用 Binary Authorization 和配置政策 | 不计分 | L2 | 非默认 |
6.10.6 | 最好启用 Cloud Security Command Center (Cloud SCC) | 不计分 | L1 | 非默认 |
如何审核基准
如需详细了解如何审核每项建议,请参阅相关的 CIS 基准。不过,您可能需要自动执行其中某些检查,以简化您的环境中这些控制措施的验证过程。下面列出的工具可以为您提供帮助。
注意,您无法审核来自 Kubernetes CIS 基准而不可在 GKE 上审核的建议。对于无法直接审核的组件,请参阅默认值以了解 GKE 对您的环境的现有配置。
CIS Kubernetes 基准的自动审核
您可以使用开源工具 kube-bench
根据 CIS Kubernetes 基准测试集群配置。注意,由于您无权直接访问控制层面节点,因此无法对 GKE 工作负载运行 kube-bench master
测试;只能运行 kube-bench node
测试。
请务必指定适当的版本,例如:
kube-bench node --benchmark cis-1.5
CIS GKE 基准的自动审核
Security Health Analytics 可识别您环境中的常见配置错误,例如开放的防火墙或公开存储分区。这包括 GKE 安全建议。启用 Security Health Analytics 后,您将在 Cloud Security Command Center 中收到有关集群配置错误的通知。
Security Health Analytics 中的相应发现结果中涵盖了许多第 1 级计分建议。
# | 建议 | 计分/不计分 | 级别 | Security Health Analytics 发现结果 |
---|---|---|---|---|
6.1 | 映像注册表和映像扫描 | |||
6.1.1 | 确保使用 GCR Container Analysis 或第三方提供商扫描映像漏洞 | 计分 | L1 | 不适用 |
6.1.2 | 尽可能缩减用户对 GCR 的访问权限 | 计分 | L1 | 不适用 |
6.1.3 | 尽可能缩减集群对 GCR 的只读访问权限 | 计分 | L1 | 不适用 |
6.1.4 | 尽可能将 Container Registry 限制为经过批准的 Container Registry | 不计分 | L2 | 不适用 |
6.2 | 身份和访问权限管理 (IAM) | |||
6.2.1 | 最好不使用 Compute Engine 默认服务账号运行 GKE 集群 | 计分 | L2 | OVER_PRIVILEGED_ACCOUNT 和 OVER_PRIVILEGED_SCOPES |
6.2.2 | 最好使用专用 Google Cloud 服务账号和 Workload Identity | 不计分 | L1 | WORKLOAD_IDENTITY_DISABLED |
6.3 | Cloud Key Management Service (Cloud KMS) | |||
6.3.1 | 考虑使用 Cloud KMS 中托管的密钥加密 Kubernetes Secret | 计分 | L1 | 不适用 |
6.4 | 节点元数据 | |||
6.4.1 | 确保已停用旧版 Compute Engine 实例元数据 API | 计分 | L1 | LEGACY_METADATA_ENABLED |
6.4.2 | 确保已启用 GKE 元数据服务器 | 不计分 | L2 | 不适用 |
6.5 | 节点配置和维护 | |||
6.5.1 | 确保将 Container-Optimized OS (COS) 用于 GKE 节点映像 | 计分 | L2 | COS_NOT_USED |
6.5.2 | 确保为 GKE 节点启用节点自动修复 | 计分 | L1 | AUTO_REPAIR_DISABLED |
6.5.3 | 确保为 GKE 节点启用节点自动升级 | 计分 | L1 | AUTO_UPGRADE_DISABLED |
6.5.4 | 考虑使用发布版本自动管理 GKE 版本 | 不计分 | L1 | 不适用 |
6.5.5 | 确保已启用安全强化型 GKE 节点 | 不计分 | L1 | 不适用 |
6.5.6 | 确保已启用安全强化型 GKE 节点的完整性监控 | 不计分 | L1 | 不适用 |
6.5.7 | 确保已启用安全强化型 GKE 节点的安全启动 | 不计分 | L2 | 不适用 |
6.6 | 集群网络 | |||
6.6.1 | 考虑启用 VPC 流日志和节点内可见性 | 不计分 | L2 | FLOW_LOGS_DISABLED |
6.6.2 | 首选 VPC 原生集群 | 计分 | L1 | IP_ALIAS_DISABLED |
6.6.3 | 确保已启用主实例授权网络 | 计分 | L1 | MASTER_AUTHORIZED_NETWORKS_DISABLED |
6.6.4 | 确保已创建集群并启用了专用端点和停用了公共访问权限 | 计分 | L2 | 不适用 |
6.6.5 | 确保使用专用节点创建集群 | 计分 | L1 | PRIVATE_CLUSTER_DISABLED |
6.6.6 | 考虑为 GKE 工作器节点设置防火墙 | 不计分 | L1 | 不适用 |
6.6.7 | 确保已启用网络政策,并进行适当设置 | 不计分 | L1 | NETWORK_POLICY_DISABLED |
6.6.8 | 考虑使用 Google 管理的 SSL 证书 | 不计分 | L2 | 不适用 |
6.7 | Logging | |||
6.7.1 | 确保已启用 Stackdriver Kubernetes Logging 和 Monitoring | 计分 | L1 | CLUSTER_LOGGING_DISABLED 和 CLUSTER_MONITORING_DISABLED |
6.7.2 | 考虑启用 Linux auditd 日志记录 | 不计分 | L2 | 不适用 |
6.8 | 身份验证和授权 | |||
6.8.1 | 确保已停用使用静态密码进行基本身份验证 | 计分 | L1 | 不适用 |
6.8.2 | 确保已停用使用客户端证书进行身份验证 | 计分 | L1 | 不适用 |
6.8.3 | 考虑使用 Google RBAC 群组来管理 Kubernetes RBAC 用户 | 不计分 | L2 | 不适用 |
6.8.4 | 确保已停用旧版授权 (ABAC) | 计分 | L1 | LEGACY_AUTHORIZATION_ENABLED |
6.9 | 存储 | |||
6.9.1 | 考虑为 GKE 永久性磁盘 (PD) 启用客户管理的加密密钥 (CMEK) | 不计分 | L1 | 不适用 |
6.10 | 其他集群配置 | |||
6.10.1 | 确保已停用 Kubernetes 网页界面 | 计分 | L1 | WEB_UI_ENABLED |
6.10.2 | 确保 Alpha 版集群未用于生产工作负载 | 计分 | L1 | 不适用 |
6.10.3 | 确保已启用 Pod 安全政策,并进行适当设置 | 不计分 | L1 | POD_SECURITY_POLICY_DISABLED |
6.10.4 | 考虑使用 GKE Sandbox 运行不受信任的工作负载 | 不计分 | L2 | 不适用 |
6.10.5 | 最好视情况启用 Binary Authorization 和配置政策 | 不计分 | L2 | 不适用 |
6.10.6 | 最好启用 Cloud Security Command Center (Cloud SCC) | 不计分 | L1 | 无 |
后续步骤
- 阅读 GKE 安全概览。
- 遵循 GKE 安全强化指南中的安全最佳做法。
- 详细了解 GKE 中的共担责任模型。