使用 IAP 保护 GKE 应用和资源

本页介绍如何使用 Identity-Aware Proxy (IAP) 保护 Google Kubernetes Engine (GKE) 实例的安全。

要保护非 Google Cloud 的资源,请参阅保护本地应用和资源

概览

在 GKE 上,IAP 通过 Ingress 集成。因此,您无需使用 VPN 即可控制员工的资源级访问权限。

在 GKE 集群中,传入流量由 HTTP(S) 负载平衡服务处理,该服务是 Cloud Load Balancing 的一个组件。HTTP(S) 负载均衡器通常由 Kubernetes Ingress 控制器配置。Ingress 控制器会从与一个或多个 Service 对象关联的 Kubernetes Ingress 对象中获取配置信息。每个 Service 对象包含用于将传入请求定向到特定 Pod 和端口的路由信息。

从 Kubernetes 版本 1.10.5-gke.3 开始,您可以通过将 Service 与 BackendConfig 对象进行关联来添加负载均衡器配置。 BackendConfig 是 kubernetes/ingress-gce 代码库中定义的一个自定义资源定义 (CRD)。

Kubernetes Ingress 控制器会从 BackendConfig 读取配置信息并相应地设置负载均衡器。BackendConfig 包含特定于 Cloud Load Balancing 的配置信息,并可用于为每个 HTTP(S) 负载平衡后端服务定义单独的配置。

准备工作

要为 GKE 启用 IAP,您需要以下各项:

  • 启用了结算功能的 Google Cloud 控制台项目。
  • 由 HTTPS 负载均衡器处理的一个或多个 GKE 实例。当您在 GKE 集群中创建 Ingress 对象时,负载均衡器应自动建立。
  • 已注册到负载均衡器地址的域名。
  • 用于验证所有请求是否都具有身份的应用代码。

启用 IAP

如果您尚未配置项目的 OAuth 同意屏幕,系统会提示您执行此操作。如需配置 OAuth 同意屏幕,请参阅设置 OAuth 同意屏幕

设置 IAP 访问权限

  1. 转到 Identity-Aware Proxy 页面
    转到 Identity-Aware Proxy 页面
  2. 选择要使用 IAP 保护的项目。
  3. 选中您要授予访问权限的资源旁边的复选框。

    如果您没有看到某个资源,请确保该资源已创建完毕并已同步 BackendConfig Compute Engine 入站流量控制器。

    如需验证后端服务是否可用,请运行以下 gcloud 命令:

    gcloud compute backend-services list
  4. 在右侧面板上,点击添加主帐号
  5. 在显示的添加主账号对话框中,输入群组或个人(应拥有项目的 IAP-secured Web App User 角色)的电子邮件地址。

    以下种类的主账号可以具有此角色:

    • Google 账号:user@gmail.com
    • Google 群组:admins@googlegroups.com
    • 服务帐号:<服务器>@<示例>.gserviceaccount.com
    • Google Workspace 网域:example.com

    请务必添加您有权访问的 Google 账号。

  6. 角色下拉列表中选择 Cloud IAP > IAP-secured Web App User
  7. 点击保存

配置 BackendConfig

如需为 IAP 配置 BackendConfig,请创建一个 Kubernetes Secret,然后将 iap 块添加到 BackendConfig。

创建 Kubernetes Secret

BackendConfig 使用 Kubernetes Secret 来封装您之前创建的 OAuth 客户端。如其他 Kubernetes 对象一样,Kubernetes Secret 通过 kubectl 命令行界面 (CLI) 进行管理。如需创建 Secret,请运行以下命令,其中 client_id_keyclient_secret_key 是您在创建 OAuth 凭据时下载的 JSON 文件中的密钥:

kubectl create secret generic my-secret --from-literal=client_id=client_id_key \
    --from-literal=client_secret=client_secret_key

成功创建 Secret 后,上面的命令会显示输出进行确认:

secret "my-secret" created

iap 块添加到 BackendConfig

如需为 IAP 配置 BackendConfig,您需要指定 enabledsecretName 值。如需指定这些值,请确保您具有 compute.backendServices.update 权限,并将 iap 块添加到 BackendConfig。在此块中,my-secret 是您之前创建的 Kubernetes Secret 名称:

对于 GKE 1.16.8-gke.3 及更高版本,请使用“cloud.google.com/v1”API 版本。如果您使用的是早期 GKE 版本,请使用“cloud.google.com/v1beta1”。

apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
  name: config-default
  namespace: my-namespace
spec:
  iap:
    enabled: true
    oauthclientCredentials:
      secretName: my-secret

您还需要将 Service 端口与 BackendConfig 关联以触发启用 IAP。实现此操作的一种方法是将服务的所有端口默认为 BackendConfig,您可以通过向 Service 资源添加以下注解来实现此目的。

metadata:
  annotations:
    beta.cloud.google.com/backend-config: '{"default": "config-default"}'

如需测试配置,请运行 kubectl get event。如果看到消息“no BackendConfig for service port exists”,则说明您已成功将服务端口与 BackendConfig 关联,但是未找到 BackendConfig 资源。如果您没有创建 BackendConfig 资源,或在错误的命名空间中创建了该资源,或在 Service 注解中拼错了引用,则会出现此错误。

如果您引用的 secretName 不存在或结构不正确,则会显示以下错误消息之一:

  • BackendConfig default/config-default is not valid: error retrieving secret "foo": secrets "foo" not found.如需解决此错误,请确保您已按照上一部分中的说明正确创建 Kubernetes Secret
  • BackendConfig default/config-default is not valid: secret "foo" missing client_secret data.如需解决此错误,请确保您已正确创建 OAuth 凭据。此外,请确保您在之前下载的 JSON 中引用了正确的 client_idclient_secret 键。

如果 enabled 标志设置为 true 并且 secretName 已正确设置,系统将为您选择的资源配置 IAP。

关闭 IAP

要关闭 IAP,您必须在 BackendConfig 中将 enabled 设置为 false。如果您从 BackendConfig 中删除 IAP 块,则设置将保持不变。例如,如果在 secretName: my_secret 情况下启用 IAP 并删除该块,则通过 my_secret 中存储的 OAuth 凭据 IAP 将仍处于启用状态。

后续步骤