Google Kubernetes Engine (GKE) 使用实例元数据配置节点虚拟机 (VM),但此元数据的一部分可能比较敏感,应该受到保护,以免受到集群上运行的工作负载的影响
准备工作
在开始之前,请确保您已执行以下任务:
- 启用 Google Kubernetes Engine API。 启用 Google Kubernetes Engine API
- 如果您要使用 Google Cloud CLI 执行此任务,请安装并初始化 gcloud CLI。 如果您之前安装了 gcloud CLI,请运行
gcloud components update
以获取最新版本。
配置节点服务账号
每个节点的服务账号凭据将继续向工作负载公开。默认情况下,您的节点使用 Compute Engine 默认服务账号。您应该配置具有最低权限的服务账号,供节点而不是 Compute Engine 默认服务账号使用。然后,将此服务账号附加到节点,这样攻击者就无法通过使用 Compute Engine API 直接访问底层虚拟机实例来绕开 GKE 的元数据保护。
如需了解详情,请参阅使用最小权限节点服务账号。
如需创建最小权限节点服务账号,请执行以下步骤:
创建新的 Identity and Access Management (IAM) 服务账号并将电子邮件地址保存在环境变量中:
gcloud iam service-accounts create NODE_SA_NAME \ --display-name="DISPLAY_NAME" export NODE_SA_EMAIL=$(gcloud iam service-accounts list --format='value(email)' \ --filter='displayName:DISPLAY_NAME')
替换以下内容:
NODE_SA_NAME
:新节点服务账号的名称。DISPLAY_NAME
:新服务账号的显示名称。
节点服务账号电子邮件地址的格式为
NODE_SA_NAME@PROJECT_ID.iam.gserviceaccount.com
。为您的服务账号配置运行 GKE 节点所需的最小角色和权限:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:$NODE_SA_EMAIL \ --role=roles/monitoring.metricWriter gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:$NODE_SA_EMAIL \ --role=roles/monitoring.viewer gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:$NODE_SA_EMAIL \ --role=roles/logging.logWriter
请将
PROJECT_ID
替换为您的 Google Cloud 项目 ID。此外,如果您的集群从 Artifact Registry 中拉取私有映像,请添加
roles/artifactregistry.reader
角色:gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:$NODE_SA_EMAIL \ --role=roles/artifactregistry.reader
元数据隐藏
GKE 元数据隐藏功能可防止用户 Pod 访问 kube-env
(包含 kubelet 凭据)和虚拟机的实例身份令牌。
元数据隐藏使用防火墙阻隔从用户 Pod(未在 HostNetwork
上运行的 Pod)到集群元数据服务器的流量,仅允许安全查询。防火墙阻止用户 Pod 使用 kubelet 凭据进行提升权限攻击,或使用虚拟机身份进行实例升级攻击。
Workload Identity Federation for GKE 不再要求使用元数据隐藏,并扩展了元数据隐藏提供的保护。在所有情况下,您都应使用 Workload Identity Federation for GKE,而不是元数据隐藏。如需了解详情,请参阅 Workload Identity Federation for GKE 简介。
如需启用元数据隐藏,请在 gcloud beta container clusters create
命令或 gcloud beta container node-pools create
命令中使用已弃用的 --workload-metadata=SECURE
选项。
限制
元数据隐藏功能存在以下限制:
- 元数据隐藏只能为
kube-env
和节点的实例身份令牌提供访问保护。 - 元数据隐藏不限制对节点服务账号的访问。
- 元数据隐藏不限制对其他相关实例元数据的访问。
- 元数据隐藏不限制对其他旧版元数据 API 的访问。
- 元数据隐藏不限制来自主机网络(Pod 规范中的
hostNetwork: true
)上运行的 Pod 的流量。
停用旧版元数据 API 并从其转换到新版
v0.1
和 v1beta1
Compute Engine 元数据服务器端点已被弃用,并已于 2020 年 9 月 30 日关停。
如需了解关停时间表,请参阅 v0.1
和 v1beta1
元数据服务器端点弃用。