本页面介绍了 Google Kubernetes Engine (GKE) Autopilot 中的安全功能、配置和设置。GKE Autopilot 集群会为您实现许多安全配置,因此建议您使用 Autopilot 运行 GKE。
本页面适用于希望了解 Google 专门应用于 Autopilot 集群的安全限制,以及可在 Autopilot 中使用的安全功能的安全专家。如需详细了解我们在 Google Cloud 内容中提及的常见角色和示例任务,请参阅常见的 GKE 用户角色和任务。
在阅读本页面之前,请确保您熟悉以下内容:
Autopilot 中的安全措施
Autopilot 集群默认启用并应用安全最佳实践和设置,包括安全概览以及强化集群安全性中的许多建议。
如果您想要获取适合自己应用场景的推荐资源,请跳转至按应用场景划分的安全资源。 以下部分介绍了 Autopilot 为您应用的安全政策。
强制执行 Kubernetes Pod 安全标准
Kubernetes 项目有一组安全准则,名为 Pod 安全标准,它们定义了以下政策:
- 特权:无访问权限限制。在 Autopilot 中不使用。
- 基准:阻止已知的权限提升途径。允许大多数工作负载无需进行重大更改即可运行。
- 受限:最高安全级别。需要对大多数工作负载进行重大更改。
在 Autopilot 模式下,GKE 使用准入控制器来强制执行 Pod 安全限制条件。我们强制执行一项默认安全政策,其中包含 Pod 安全标准基准级别中的所有建议,并进行了一些修改以确保易用性。此外,Autopilot 的默认准入政策会强制执行 Pod 安全标准受限级别中的许多限制条件,但会避免执行阻止大多数工作负载运行的限制。
如果您需要应用其他限制来遵守完整的受限政策,可以选择在特定命名空间中使用 PodSecurity 准入控制器。
下表介绍了默认 Autopilot 准入政策中的控制措施与 Pod 安全标准基准级别和受限级别中的控制措施的比较。有关此表中每种控制措施的说明,请参阅 Pod 安全标准中的相应条目。
在评估合规性时,我们会考虑这些限制条件如何应用于您自己的工作负载。这不包括经过验证的 Google Cloud 合作伙伴工作负载以及需要特定特权才能正常运行的系统工作负载。
控制措施 | 基准政策合规性 | 受限政策合规性 | 其他信息 |
---|---|---|---|
HostProcess | Autopilot 会阻止 HostProcess。 | ||
主机命名空间 | Autopilot 会阻止主机命名空间。经过验证的合作伙伴提供的部分容器可以使用主机命名空间。 | ||
特权容器 | 默认情况下,Autopilot 会阻止特权容器。为了某些目的(例如运行安全和监控工具),Autopilot 允许使用经过验证的合作伙伴提供的特权容器。 | ||
Linux 功能 | 默认情况下,Autopilot 工作负载只能访问基准 Pod 安全标准中指定的功能。 您可以手动启用以下功能:
Autopilot 还允许某些经过验证的合作伙伴工作负载设置已丢弃的功能。 |
||
hostPath 卷 | 部分合规 | 部分合规 | Autopilot 允许容器请求只读权限来访问用于调试的 /var/log ,但会拒绝所有其他读写权限。 |
HostPorts | 不允许设置特定的主机端口,这样可以减少一些调度问题,并防止意外或有意地直接公开服务网络。您可以通过已知范围手动设置随机主机端口分配,以支持直接连接网络应用(例如游戏服务器)。 | ||
AppArmor | 默认情况下,AppArmor docker 安全配置文件自动应用于 Container-Optimized OS。 | ||
SELinux | 未应用 SELinux,因为已应用 AppArmor。SELinux 在 Pod 安全标准中也不是强制性要求。 | ||
/proc 装载类型 |
GKE 未设置 ProcMountType 功能标志。如果 Pod securityContext 将 procMount 设置为“Unmasked”,则 GKE 会自动将其替换为“Default”。 |
||
seccomp 配置文件 | Autopilot 将RuntimeDefault seccomp 配置文件应用于所有工作负载。您可以通过在 Pod 规范中将配置文件设置为 Unconfined ,为特定工作负载手动替换此设置。 |
||
sysctls | GKE 不会设置 --allowed-unsafe-sysctls kubelet 标志,因此具有不安全 sysctl 的 Pod 无法调度。为了提供额外的保护,从 2023 年 7 月 11 日起,1.27 及更高版本的新集群还有一个政策规则,用于强制执行 securityContext 设置并拒绝那些使用不安全 sysctl 的 Pod。 | ||
卷类型 | Autopilot 仅允许受限政策中的卷类型,但添加了以下内容:HostPath 卷(具有用于调试的 /var/log 的只读权限)、gcePersistentDisk(用于 Compute Engine 永久性磁盘)和 nfs(用于网络文件系统卷)。 |
||
提升权限 | 此设置只能为未以根用户身份运行的容器提供保护。行业调查显示,76% 的容器以根用户身份运行,因此 Autopilot 允许以根用户身份运行,以支持大多数工作负载。此设置目前还允许使用文件系统功能来解决 Kubernetes 根功能处理存在的缺陷,在将工作负载权限分离到非根用户的过程中也很有用。 | ||
以非根用户身份运行 | 行业调查显示,76% 的容器以根用户身份运行,因此 Autopilot 允许以根用户身份运行,以支持大多数工作负载。 | ||
以非根用户身份运行 | 容器可以将 runAsUser 设置为 0 。
行业调查显示,76% 的容器以根用户身份运行,因此 Autopilot 允许以根用户身份运行,以支持大多数工作负载 |
内置安全配置
根据行业最佳实践和我们的专业知识,Google 将许多内置安全设置应用于 Autopilot 集群。下表介绍了 Autopilot 为您应用的一些安全配置:
配置 | 说明 |
---|---|
主机选项 |
|
Linux 功能 | 您可以使用以下 Linux 功能: "SETPCAP", "MKNOD", "AUDIT_WRITE", "CHOWN", "DAC_OVERRIDE", "FOWNER", "FSETID", "KILL", "SETGID", "SETUID", "NET_BIND_SERVICE", "SYS_CHROOT", "SETFCAP", "SYS_PTRACE" 您还可以手动启用以下功能:
在 1.21 之前的 GKE 版本中,不支持 |
特权容器 | 除非容器由 Google Cloud 合作伙伴部署,否则容器无法在特权模式下运行。特权容器可以更改底层节点,例如更改 kubelet。此访问权限可能会增加 Pod 被破解的影响。 |
GKE 管理的命名空间 | 为安全起见,Autopilot 不允许在 GKE 管理的命名空间(如 kube-system )中部署工作负载。 |
容器隔离 | Autopilot 对容器实施以下限制,以限制容器逃逸漏洞的影响: Linux 功能和内核安全
|
Pod 级层安全政策强制执行 | Autopilot 支持为 Pod 级安全政策使用强制执行机制,例如 PodSecurity 准入控制器、Gatekeeper 或 Policy Controller。
但是,如果本页面中介绍的内置安全配置已经满足您的要求,您可能就不需要使用以上任何机制。 |
通过 SSH 连接到节点 | Autopilot 会阻止对节点的 SSH 访问。GKE 会处理节点的所有操作方面,包括节点运行状况和节点上运行的所有 Kubernetes 组件。 您仍然可以使用 Kubernetes |
用户模拟 | GKE 1.22.4-gke.1501 及更高版本支持针对所有用户定义的用户和群组的用户模拟。无法模拟系统用户和群组(例如 kube-apiserver 用户和 system:masters 群组)。 |
变更动态准入 webhook | Autopilot 会修改变更 webhook,以防止代管式命名空间中的资源(例如 Autopilot 还会拒绝可指定以下一项或多项资源以及这些资源的任何子资源的 webhook。 - group: "" resource: nodes - group: "" resource: persistentVolumes - group: certificates.k8s.io resource: certificatesigningrequests - group: authentication.k8s.io resource: tokenreviews 您不能对资源或群组使用 |
ValidatingAdmissionPolicies | Autopilot 会修改 Autopilot 还会拒绝可指定以下一项或多项资源以及这些资源的任何子资源的 - group: "" resource: nodes - group: "" resource: persistentVolumes - group: certificates.k8s.io resource: certificatesigningrequests - group: authentication.k8s.io resource: tokenreviews 您不能对资源或群组使用 |
证书签名请求 | 您可以在 Autopilot 中创建 CertificateSigningRequests,以创建由集群证书授权机构签名的证书。为了防止对系统组件造成干扰,Autopilot 会拒绝已知特权身份(例如系统群组、系统代理或 Google 管理的 IAM 服务代理)的 CertificateSigningRequests。 |
GKE 安全功能 | Autopilot 集群可为您启用推荐的 GKE 安全功能。如需查看已启用和可选的安全功能的列表,请参阅 Autopilot 中的安全功能。 |
节点操作系统 | Autopilot 集群使用 containerd 作为节点操作系统的 Container-Optimized OS。Container-Optimized OS 由 Google 创建和管理。 |
GKE 版本升级 | Autopilot 集群在创建后会在 GKE 发布渠道中注册,并且始终启用自动升级。Google 会在一段时间内自动将控制平面和节点升级到发布渠道中的最新合格版本。 |
Autopilot 中的安全边界
Autopilot 提供对 Kubernetes API 的访问权限,但移除了使用某些高权限 Kubernetes 功能(例如特权 Pod)的权限。目标是为了限制访问、修改或直接控制节点虚拟机。Autopilot 通过实施这些限制来限制工作负载对节点虚拟机进行低级层访问,从而使Google Cloud 能够完全管理节点以及 Pod 级SLA。
这样做的目的是防止意外访问节点虚拟机。我们接受出于此目的通过 Google 的漏洞奖励计划 (VRP) 提交的报告内容,并将根据 Google VRP 奖励小组的决定对提交的报告进行奖励。
从设计上讲,特权用户(例如集群管理员)拥有对任何 GKE 集群的完全控制权。为保证安全性,我们建议您避免广泛授予强大的 GKE 或 Kubernetes 特权,而是尽可能使用命名空间管理员委任,如多租户指南中所述。
Autopilot 可以在您的项目中预配单租户虚拟机,专供您使用。在每个虚拟机上,您的 Autopilot 工作负载可能会一起运行,它们共用一个安全强化型内核。由于共享核心表示单个安全边界,因此我们建议您在要求高度隔离(例如高风险或不受信任的工作负载)的情况下,在可提供多层安全保护的 GKE Sandbox Pod 上运行工作负载。
基于应用场景的安全建议
以下部分提供了相关链接和建议,供您根据自己的应用场景规划、实现和管理 Autopilot 集群的安全性。
规划集群安全
使用场景 | 资源 |
---|---|
了解 GKE 作为平台如何保障安全性 | |
了解您在强化环境安全方面发挥的作用 | 了解责任共担模型。 |
查看 Google 关于安全强化措施和突发事件响应的建议 |
|
了解 GKE 如何启用审核日志 |
|
身份验证和授权
设置 Autopilot 集群后,您可能需要对用户和应用进行身份验证才能使用 Kubernetes API 或 Google Cloud API 等资源。
使用场景 | 资源 |
---|---|
向集群 API 服务器验证用户或应用 | |
向 Google Cloud API 和服务验证应用的身份 | Autopilot 集群让您可以使用 Workload Identity Federation for GKE 将 Kubernetes 服务账号配置为充当 IAM 服务账号,从而安全地向 Google Cloud API 验证工作负载的身份。如需查看相关说明,请参阅将应用配置为使用 Workload Identity Federation for GKE。 |
在项目级授权操作 | 如需在项目级跨集群授权操作,请使用 IAM。您可以使用 IAM 角色和权限授予或拒绝对特定 GKE 和 Kubernetes API 资源的访问权限。如需了解相关说明,请参阅创建 IAM 政策。 |
在集群级层授权操作 | 如需授权操作特定集群中的 Kubernetes API 资源,请使用内置的 Kubernetes 基于角色的访问控制 (RBAC) 机制。 如需了解相关说明,请参阅使用 RBAC 授权集群中的操作。 |
在组织级层授权操作 | 您可以使用 Google Cloud 组织政策服务对 Google Cloud组织中 GKE 资源上的特定操作强制实施限制条件。如需查看相关说明,请参阅使用自定义组织政策限制对 GKE 资源的操作。 |
强化集群和工作负载的安全
除了预先配置的 Autopilot 措施之外,如果您还有专门的隔离或安全强化要求,请考虑以下资源:
使用场景 | 资源 |
---|---|
限制对集群端点的公共访问权限 | 配置 Autopilot 集群的网络隔离,并停用集群控制平面的外部端点。如需查看相关说明,请参阅配置控制平面访问权限。 |
仅限特定网络访问集群 | 使用控制平面授权的网络指定可以访问集群的 IP 地址范围。 |
将敏感信息存储在集群外部 | 将敏感数据存储在启用了版本控制的外部加密存储空间服务中是一种常见的合规性要求和最佳做法。 使用 Secret Manager 存储数据,并使用适用于 GKE 的工作负载身份联合从 Autopilot 集群访问这些数据。如需了解相关说明,请参阅使用适用于 GKE 的工作负载身份联合访问存储在 GKE 集群外部的 Secret。 |
在部署到集群之前验证容器映像 | 使用 Binary Authorization 在部署时检查 Pod 清单中引用的容器映像的完整性。如需了解相关说明,请参阅使用 Binary Authorization 在部署时验证容器映像。 |
监控安全状况
设置集群并部署工作负载后,您应该设置并配置监控和日志记录,以便对集群安全状况进行监测。我们建议您执行以下所有操作:
- 在 GKE 安全状况信息中心中注册集群,以审核工作负载是否存在问题(例如,安全配置有问题或容器操作系统软件包存在漏洞)并获得切实可行的缓解措施信息。
- 使用集群通知接收有关新安全公告和升级事件的通知。
- 您可以使用 Cloud Monitoring 中的 GKE 信息中心或 GKE 中的“可观测性”标签页观察集群。
- 了解如何在 Cloud Logging 中查看和管理 GKE 审核日志。
后续步骤
- 阅读 GKE 安全概览。
- 阅读 GKE 安全加固指南。
- 订阅安全公告和版本说明。