为 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. 点击确定
  7. 选择您创建的客户端。
  8. 将客户端 ID 复制到剪贴板。
  9. 按照以下格式将通用重定向网址添加到已获授权的重定向 URI 字段中:
    https://iap.googleapis.com/v1/oauth/clientIds/CLIENT_ID:handleRedirect

    其中,CLIENT_ID 是 OAuth 客户端 ID。

  10. 在页面顶部附近,点击下载 JSON。下一步骤将会用到这些凭据。

设置 IAP 访问权限

  1. 转到 Identity-Aware Proxy 页面
    转到 Identity-Aware Proxy 页面
  2. 选择要使用 IAP 保护的项目。
  3. 选中您要向其添加成员的资源旁边的复选框。
  4. 在右侧面板上,点击添加成员
  5. 在显示的添加成员对话框中,输入群组或个人(应拥有项目的受 IAP 保护的网页应用用户角色)的电子邮件地址。

    可以添加以下种类的帐号作为成员:

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

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

  6. 角色下拉列表中选择 Cloud IAP > 受 IAP 保护的网页应用用户
  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 名称:

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 将仍处于启用状态。

后续步骤