为第三方租户准备 GKE 集群

本文档介绍了一些控制措施,可用于帮助配置和保护 Google Kubernetes Engine (GKE) 集群,这些集群托管由第三方租户分发的自定义应用。该文档属于蓝图解决方案的一部分,后者包含以下内容:

  • 有关您实施的控制措施的指南(本文档)。
  • 包含以下目录的 GitHub 代码库
    • terraform:包含用于创建项目级基础架构和资源的 Terraform 代码。此代码还会将 Anthos 组件安装到集群中。
    • configsync:包含应用于 GKE 集群的集群级资源和配置。
    • tenant-config-pkg:一个 kpt 软件包,可用作模板在 GKE 集群中配置新租户。

本文档适用于管理 GKE 集群的团队。本文假定您熟悉 GKE 和 Kubernetes

本文档假定您已配置一组基础安全控制措施来保护您的云基础架构,例如 Google Cloud 安全基础指南中描述的控制措施。此蓝图可帮助您在现有安全控制措施上额外增加一层控制措施,以帮助保护 GKE 集群。

架构

下图描述了您使用此蓝图创建的架构:

蓝图的基础架构组件。

如上图所示,此蓝图可帮助您创建和配置以下基础架构组件:

  • Virtual Private Cloud (VPC) 网络和子网。
  • 专用 GKE 集群。集群节点与互联网隔离。
  • 两个 GKE 节点池。创建专用节点池以专门托管租户应用和资源。其他集群资源托管在默认节点池中。
  • VPC 防火墙规则。创建适用于集群中所有节点的基准规则。您可以创建仅应用于租户节点池中的节点的其他规则。这些防火墙规则限制来自租户节点的出站流量。
  • Cloud NAT:允许从集群节点到互联网的出站流量。
  • 配置为启用专用 Google 访问通道Cloud DNS 规则,使得集群中的应用无需遍历互联网即可访问 Google API。
  • 集群节点和应用使用的服务帐号

应用

下图显示了您使用蓝图创建和配置的集群级资源。

集群级层的资源。

如上图所示,在蓝图中,您使用以下内容创建和配置集群级资源:

  • Anthos Config Management Config Sync,用于同步 Git 代码库中的集群配置和政策。
  • Anthos Config Management 政策控制器,用于对集群中的资源强制执行政策。
  • Anthos Service Mesh,用于控制和帮助保护网络流量。
  • 用于租户应用资源的专用命名空间。
  • 应用于租户命名空间的政策和控制措施,包括网络政策和服务网格政策。

了解您需要的安全控制措施

本部分讨论通过蓝图应用的可帮助您保护 GKE 集群的控制措施。

增强 GKE 集群的安全性

根据安全最佳做法创建集群。

此蓝图可帮助您创建实现以下安全设置的 GKE 集群:

如需详细了解 GKE 安全设置,请参阅强化集群的安全性

VPC 防火墙规则

限制虚拟机之间的流量

Virtual Private Cloud (VPC) 防火墙规则决定允许哪些流量进出 Compute Engine 虚拟机。这些规则让您可以根据第 4 层属性,在虚拟机粒度级别过滤流量。

您可以使用默认 GKE 集群防火墙规则创建 GKE 集群。这些防火墙规则支持集群节点与 GKE 控制平面之间的通信,以及集群中节点与 Pod 之间的通信。

您可以对租户节点池中的节点应用其他防火墙规则。这些防火墙规则限制来自租户节点的出站流量。通过此方法,您可以增强租户节点的隔离性。默认情况下,系统会拒绝来自租户节点的所有出站流量。必须明确配置任何必需的出站流量。例如,您可使用蓝图创建防火墙规则,以允许从租户节点流向 GKE 控制平面的出站流量,以及使用专用 Google 访问通道流向 Google API 的出站流量。防火墙规则使用租户节点池服务帐号面向租户节点。

命名空间

为应使用相同政策的资源加标签

借助命名空间,您可以为集群内的相关资源(例如 Pod、Service 和副本控制器)提供范围。通过使用命名空间,您可以将相关资源的管理责任作为一个单元进行委派。因此,命名空间是大多数安全模式不可或缺的一部分。

命名空间是控制平面隔离的一项重要功能。不过,它们不提供节点隔离、数据平面隔离和网络隔离。

一种常用的方法是为各个应用创建命名空间。例如,您可以为应用的界面组件创建命名空间 myapp-frontend

此蓝图可帮助您创建专用命名空间来托管联邦学习应用。命名空间及其资源被视为集群中的租户。您可将政策和控制措施应用于命名空间,以限制命名空间中的资源范围。

网络政策

强制控制集群内网络流量的流动

网络政策使用 Pod 级防火墙规则强制控制第 4 层网络流量的流动。网络政策的范围限定为命名空间

在此蓝图中,您将网络政策应用于托管第三方应用的租户命名空间。默认情况下,网络政策会拒绝进出命名空间中 pod 的所有流量。任何必需的流量都必须明确列入许可名单。例如,此蓝图中的网络政策明确允许流量传输到所需的集群服务,例如集群内部 DNS 和 Anthos Service Mesh 控制平面。

配置同步

将配置应用于您的 GKE 集群

Config Sync 使您的 GKE 集群与存储在 Git 代码库中的配置保持同步。Git 代码库充当您的集群配置和政策的单一数据源。Config Sync 以声明式方法运作。它会持续检查集群状态,并应用配置文件中声明的状态来强制实施政策,这有助于防止配置偏移

将 Config Sync 安装到 GKE 集群中。您可以配置 Config Sync 以同步与蓝图关联的 GitHub 代码库中的集群配置和政策。同步的资源包括以下内容:

  • 集群级的 Anthos Service Mesh 配置
  • 集群级安全政策
  • 租户命名空间级配置和政策,包括网络政策、服务帐号、RBAC 规则和 Anthos Service Mesh 配置

政策控制器

强制要求遵守政策

Anthos 政策控制器是一个 Kubernetes 动态准入控制器,用于强制实施由 Open Policy Agent (OPA) 执行的基于 CustomResourceDefinition(基于 CRD)的政策。

准入控制器是 Kubernetes 插件,用于在对象持久保留之前,但在请求经过身份验证和授权之后拦截对 Kubernetes API 服务器的请求。您可以使用准入控制器来限制集群的使用方式。

您将政策控制器安装到 GKE 集群中。此蓝图包含有助于保护集群的示例政策。您可以使用 Config Sync 将政策自动应用到集群。您应用以下政策:

Anthos Service Mesh

管理服务之间的安全通信

Anthos Service Mesh 可帮助您监控和管理基于 Istio 的服务网格。服务网格是一个基础架构层,可在您的服务之间创建托管、可观察且安全的通信。

Anthos Service Mesh 从以下方面帮助您简化对跨服务安全通信的管理:

  • 对流量的身份验证和加密进行管理(采用相互传输层通信 (mTLS) 的集群内的支持协议)。Anthos Service Mesh 管理 Anthos 工作负载的 mTLS 密钥和证书的预配和轮替,且不会中断通信。定期轮替 mTLS 密钥是安全性方面的一种最佳做法,有助于在发生攻击时降低泄露风险。
  • 允许您根据服务身份而不是网络上的对等方的 IP 地址来配置网络安全政策。Anthos Service Mesh 用于配置身份感知访问权限控制(防火墙)政策,以便您创建与工作负载的网络位置无关的安全政策。此方法简化了设置服务间通信政策的过程。
  • 允许您配置政策以许可来自特定客户端的访问。

此蓝图将指导您在集群中安装 Anthos Service Mesh。您可配置租户命名空间以进行自动边车代理注入。此方法可确保租户命名空间中的应用属于网格。您可以使用 Config Sync 自动配置 Anthos Service Mesh。您可将网格配置为执行以下操作:

  • 强制在网格中的服务之间执行 mTLS 通信
  • 将来自网格的出站流量限制到已知主机上。
  • 限制网格中服务之间的授权通信。例如,租户命名空间中的应用只能与同一命名空间或一组已知外部主机中的应用通信。
  • 通过网格网关路由所有出站流量,您可以在该网关中应用进一步的流量控制。

节点污点和亲和性

控制工作负载调度

节点污点节点亲和性是 Kubernetes 机制,可让您影响 pod 被安排到集群节点上的方式。

污点节点会逐出 pod。Kubernetes 不会将 pod 调度到污点节点上,除非 pod 对污点有容忍。您可以使用节点污点来保留节点,以便仅供某些工作负载或租户使用。多租户集群通常使用污点和容忍。如需了解详情,请参阅具有污点和容忍功能的专用节点文档。

通过节点亲和性,您可以将 pod 限制为具有特定标签的节点。如果 pod 具有节点亲和性要求,Kubernetes 不会将 pod 调度到节点上,除非该节点的标签与亲和性要求一致。您可以使用节点亲和性来确保将 pod 调度到适当的节点上。

您可以将节点污点和节点亲和性结合使用,以确保租户工作负载 pod 专门调度到为租户预留的节点上。

此蓝图可帮助您通过以下方式控制租户应用的调度:

  • 创建专用于租户的 GKE 节点池。池中的每个节点都有一个与租户名称相关的污点。
  • 自动将适当的容忍和节点亲和性应用于以租户命名空间为目标的任何 pod。您可以使用 PolicyController 变更来应用容忍和亲和性。

最低权限

限制对集群和项目资源的访问权限

为您的 Google Cloud 项目和资源(如 GKE 集群)采用最小权限原则是安全方面的一种最佳做法。这样,在集群内运行的应用以及使用集群的开发者和运营商仅具有所需的一组最低权限。

此蓝图可帮助您通过以下方式使用最小权限服务帐号:

  • 每个 GKE 节点池都会收到自己的服务帐号。例如,租户节点池中的节点会使用专用于这些节点的服务帐号。节点服务帐号配置了所需的最低权限
  • 集群使用 Workload Identity 将 Kubernetes 服务帐号与 Google 服务帐号相关联。这样,租户应用便可以获得对任何所需 Google API 的有限访问权限,而无需下载和存储服务帐号密钥。例如,您可以向服务帐号授予从 Cloud Storage 存储桶读取数据的权限。

此蓝图可帮助您通过以下方式限制对集群资源的访问权限

  • 您可以创建具有有限权限来管理应用的示例 Kubernetes RBAC 角色。您可以向在租户命名空间中运行应用的用户和群组授予此角色。这样,这些用户仅有权修改租户命名空间中的应用资源。他们无权修改集群级资源或敏感安全设置(例如 Anthos Service Mesh 政策)。

综合应用

如需实现本文档中所述的架构,请执行以下操作:

  1. 确定是在部署安全基础蓝图的同时部署此蓝图,还是不同时部署此蓝图。如果您选择不部署安全基础蓝图,请确保您的环境部署了类似的安全基准。
  2. 查看有关蓝图的自述文件,并确保满足所有前提条件。
  3. 在测试环境中,部署此架构的一个实例。在测试过程中,请执行以下操作:
    1. 部署示例租户服务并验证集群配置
    2. 将其他租户添加到集群
  4. 将蓝图部署到生产环境中。
  5. 向集群添加更多租户。

后续步骤