GKE Autopilot 安全功能


本页面介绍运行 GKE 时建议采用的 Google Kubernetes Engine (GKE) Autopilot 中的安全功能、配置和设置。

哪些人应使用此页面?

本页面适用于希望了解 Google 专门应用于 Autopilot 集群的安全限制,以及可在 Autopilot 中使用的安全功能的安全管理员。

您还应该阅读 GKE 安全概览,其中介绍了适用于所有 GKE 集群、网络配置和工作负载的安全强化选项、措施和建议。

Autopilot 中的安全措施

Autopilot 集群默认启用并应用安全最佳实践和设置,包括安全概览以及强化集群安全性中的许多建议。

如果您想要获取适合自己应用场景的推荐资源,请跳转至按应用场景划分的安全资源。 以下部分介绍了 Autopilot 为您应用的安全政策。

Autopilot 和 Kubernetes Pod 安全标准

Kubernetes 项目有一组安全准则,名为 Pod 安全标准,它们定义了以下政策:

  • 特权:无访问权限限制。在 Autopilot 中不使用。
  • 基准:阻止已知的权限提升途径。允许大多数工作负载在不进行重大更改的情况下运行。
  • 受限:最高级别的安全防护。需要对大多数工作负载进行重大更改。

Autopilot 会应用基准政策并进行某些修改,以确保可用性。Autopilot 还应用受限政策中的许多限制条件,但避免了阻止大多数工作负载运行的限制。Autopilot 使用 Google 控制的准入控制器在集群级层应用这些限制条件。如果您需要应用其他限制以符合完整的受限政策,则可以选择在特定命名空间中使用 PodSecurity 准入控制器

下表介绍了 Autopilot 集群如何实现基准和受限政策。有关此表中每个控件的说明,请参阅 Pod 安全标准中的相应条目。

在评估合规性时,我们考虑了限制条件如何应用于您自己的工作负载。这不包括经过验证的 Google Cloud 合作伙伴工作负载和需要特定权限才能正常运行的系统工作负载。

控件 基准政策合规性 受限政策合规性 更多信息
HostProcess Autopilot 会阻止 HostProcess。
主机命名空间 Autopilot 会阻止主机命名空间。经过验证的合作伙伴的某些容器可以使用主机命名空间。
特权容器 默认情况下,Autopilot 会阻止特权容器。为了某些目的(例如运行安全和监控工具),Autopilot 允许使用经过验证的合作伙伴提供的特权容器。
Linux 功能

默认情况下,Autopilot 工作负载只能访问基准 Pod 安全标准中指定的功能。

您可以手动启用以下功能:

  • NET_RAW(用于 ping 操作)和 SYS_PTRACE(用于调试):添加到 Pod SecurityContext
  • NET_ADMIN(用于 Istio 等服务网格):在集群创建命令中指定 --workload-policies=allow-net-admin。适用于运行 GKE 1.27 及更高版本的新集群和升级的现有集群。

Autopilot 还允许某些经过验证的合作伙伴工作负载设置已丢弃的功能。

hostPath 卷 部分符合 部分符合 Autopilot 允许容器请求只读权限来访问用于调试的 /var/log,但会拒绝所有其他读写权限。
hostPort 不允许设置特定的主机端口,这样可以减少一些调度问题,并防止意外或有意地直接公开服务网络。您可以手动设置已知范围内的随机主机端口分配,以支持游戏服务器等直接连接网络应用。
AppArmor 默认情况下,AppArmor docker 安全配置文件自动应用于 Container-Optimized OS
SELinux 未应用 SELinux,因为已应用 AppArmor。Pod 安全标准也不要求使用 SELinux。
/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"

您还可以手动启用以下功能:

  • NET_RAW(用于 ping 操作):添加到 Pod SecurityContext
  • SYS_PTRACE(用于调试):添加到 Pod SecurityContext
  • NET_ADMIN(用于 Istio 等服务网格):创建集群或更新现有集群时使用 --workload-policies=allow-net-admin。之后,向 Pod SecurityContext 添加该功能。适用于 GKE 1.27 版及更高版本。

在 1.21 之前的 GKE 版本中,不支持 "SYS_PTRACE" 功能。

特权容器 除非容器由 Google Cloud 合作伙伴部署,否则容器无法在特权模式下运行。 特权容器可以更改底层节点,例如更改 kubelet。此访问权限可能会增加 Pod 被破解的影响。
GKE 管理的命名空间 为安全起见,Autopilot 不允许在 GKE 管理的命名空间(如 kube-system)中部署工作负载。
容器隔离

Autopilot 对容器实施以下限制,以限制容器逃逸漏洞的影响:

Linux 功能和内核安全

  • Autopilot 将 RuntimeDefault seccomp 配置文件应用于集群中的所有 Pod,除非 Pod 使用 GKE Sandbox。 GKE Sandbox 会强制执行主机隔离,并忽略 Pod 清单中指定的 seccomp 规则。沙盒被视为 GKE Sandbox Pod 的安全边界。
  • Autopilot 会丢弃所有容器的 CAP_NET_RAW Linux 功能。此权限并不常用,一直是多种转义漏洞的主题。ping 命令可能会在容器内失败,因为此功能已被丢弃。 您可以通过在 Pod SecurityContext 中进行设置,手动重新启用此功能。
  • Autopilot 会丢弃所有容器的 CAP_NET_ADMIN Linux 功能。如需重新启用此功能,请在集群创建或更新命令中指定 --workload-policies=allow-net-admin 标志。某些工作负载(例如 Istio)需要 NET_ADMIN
  • Autopilot 会启用适用于 GKE 的工作负载身份联合,以防 Pod 访问节点上的敏感元数据。
  • Autopilot 会阻止设置 spec.externalIPs 字段的 Kubernetes 服务,以防范 CVE-2020-8554
  • Autopilot 仅允许使用以下卷类型

    
    "configMap", "csi", "downwardAPI", "emptyDir", "gcePersistentDisk",
      "nfs", "persistentVolumeClaim", "projected", "secret"

    其他类型的卷会被阻止,因为它们需要节点特权。默认情况下,HostPath 卷会被阻止,但容器可以请求只读权限来访问用于调试的 /var/log 路径。

Pod 级层安全政策强制执行 Autopilot 支持为 Pod 级安全政策使用强制执行机制,例如 PodSecurity 准入控制器GatekeeperPolicy Controller。 但是,如果本页面中介绍的内置安全配置已经满足您的要求,您可能就不需要使用以上任何机制。
通过 SSH 连接到节点

Autopilot 会阻止对节点的 SSH 访问。GKE 会处理节点的所有操作方面,包括节点运行状况和节点上运行的所有 Kubernetes 组件。

您仍然可以使用 Kubernetes exec 功能远程连接到正在运行的容器,以在容器中执行调试命令,包括连接到交互式 shell(例如使用 kubectl exec -it deploy/YOUR_DEPLOYMENT -- sh)。

用户模拟 GKE 1.22.4-gke.1501 及更高版本支持针对所有用户定义的用户和群组的用户模拟。无法模拟系统用户和群组(例如 kube-apiserver 用户和 system:masters 群组)。
变更动态准入 webhook

Autopilot 会修改变更 webhook,以防止代管式命名空间中的资源(例如 kube-system)被拦截。

Autopilot 还会拒绝可指定以下一项或多项资源以及这些资源的任何子资源的 webhook。

- 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 集群让您可以使用适用于 GKE 的工作负载身份联合将 Kubernetes 服务账号配置为充当 IAM 服务账号,从而安全地向 Google Cloud API 验证工作负载。如需了解相关说明,请参阅将应用配置为使用适用于 GKE 的工作负载身份联合
在项目级授权操作 如需在项目级跨集群授权操作,请使用 IAM。您可以使用 IAM 角色和权限授予或拒绝对特定 GKE 和 Kubernetes API 资源的访问权限。如需了解相关说明,请参阅创建 IAM 政策
在集群级层授权操作 如需授权操作特定集群中的 Kubernetes API 资源,请使用内置的 Kubernetes 基于角色的访问权限控制 (RBAC) 机制。 如需了解相关说明,请参阅使用 RBAC 授权集群中的操作
在组织级层授权操作 您可以使用 Google Cloud 组织政策服务对 Google Cloud 组织中 GKE 资源上的特定操作强制实施限制条件。如需了解相关说明,请参阅使用自定义组织政策限制对 GKE 资源的操作

强化集群和工作负载的安全

除了预先配置的 Autopilot 措施之外,如果您还有专门的隔离或安全强化要求,请考虑以下资源:

应用场景 资源
限制对集群端点的公共访问权限 将 Autopilot 集群创建为专用集群,这样可停用集群控制层面的公共 IP 地址。如需了解相关说明,请参阅专用集群
仅限特定网络访问集群 使用控制层面授权的网络指定可以访问集群的 IP 地址范围。
将敏感信息存储在集群外部 将敏感数据存储在启用了版本控制的外部加密存储空间服务中是一种常见的合规性要求和最佳做法。 使用 Secret Manager 存储数据,并使用适用于 GKE 的工作负载身份联合从 Autopilot 集群访问这些数据。如需了解相关说明,请参阅使用适用于 GKE 的工作负载身份联合访问存储在 GKE 集群外部的 Secret
在部署到集群之前验证容器映像 使用 Binary Authorization 在部署时检查 Pod 清单中引用的容器映像的完整性。如需了解相关说明,请参阅使用 Binary Authorization 在部署时验证容器映像

监控安全状况

设置集群并部署工作负载后,您应该设置并配置监控和日志记录,以便对集群安全状况进行监测。我们建议您执行以下所有操作:

后续步骤