为 GKE 启用 IAP

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

概览

在 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 Console 项目。
  • 由 HTTPS 负载平衡器处理的一个或多个 GKE 实例。当您在 GKE 集群中创建 Ingress 对象时,负载平衡器应自动建立。
  • 已注册到负载均衡器地址的域名。
  • 用于验证所有请求是否都有身份的应用代码。

启用 IAP

配置 OAuth 同意屏幕

如果您尚未配置项目的 OAuth 权限请求页面,则需要配置。需要提供 OAuth 权限请求页面的电子邮件地址和产品名称。

  1. 转到 OAuth 同意屏幕
    配置同意屏幕
  2. 支持电子邮件地址下,选择要显示为公开联系人的电子邮件地址。该电子邮件地址必须属于当前登录的用户帐号,或者属于当前登录的用户所属的 Google 网上论坛。
  3. 输入您要显示的应用名称
  4. 根据需要添加任何可选详细信息。
  5. 点击保存

如需稍后更改 OAuth 同意屏幕上的信息(例如产品名称或电子邮件地址),请重复上述步骤配置同意屏幕。

创建 OAuth 凭据

  1. 转到“凭据”页面
    转到“凭据”页面
  2. 创建凭据下拉菜单中,选择 OAuth 客户端 ID
  3. 应用类型下,选择网页应用
  4. 为您的 OAuth 客户端 ID 添加一个名称
  5. 点击创建

    您的 OAuth 客户端 ID 和客户端密钥已生成,并显示在 OAuth 客户端窗口中。

  6. 已创建 OAuth 客户端对话框中,将客户端 ID 复制到剪贴板。
  7. 点击确定
  8. 点击您刚刚创建的客户端的名称,以将其重新打开以进行修改。
  9. 已获授权的重定向 URI 字段中,输入以下字符串:
    https://iap.googleapis.com/v1/oauth/clientIds/CLIENT_ID:handleRedirect

    其中 CLIENT_ID 是您刚刚复制到剪贴板的 OAuth 客户端 ID。

设置 IAP 访问权限

  1. 转到 Identity-Aware Proxy 页面
    转到 Identity-Aware Proxy 页面
  2. 选择要使用 IAP 保护的项目。
  3. 选中您要授予访问权限的资源旁边的复选框。
  4. 在右侧面板中,点击添加主帐号
  5. 在显示的添加主帐号对话框中,输入群组或个人(应拥有项目的 IAP-secured Web App User 角色)的电子邮件地址。

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

    • Google 帐号:user@gmail.com
    • Google 群组:<管理员>@googlegroups.com
    • 服务帐号:server@example.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 将仍处于启用状态。

后续步骤