本页介绍如何使用 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 对象时,负载平衡器应自动建立。
- 了解如何为 HTTPS 创建 Ingress。 注意:内部 Ingress 需要 BeyondCorp Enterprise 订阅。
- 已注册到负载均衡器地址的域名。
- 用于验证所有请求是否都有身份的应用代码。
- 了解如何获取用户的身份。
启用 IAP
配置 OAuth 同意屏幕
如果您尚未配置项目的 OAuth 权限请求页面,则需要配置。需要提供 OAuth 权限请求页面的电子邮件地址和产品名称。
-
转到 OAuth 同意屏幕。
配置同意屏幕 - 在支持电子邮件地址下,选择要显示为公开联系人的电子邮件地址。该电子邮件地址必须属于当前登录的用户帐号,或者属于当前登录的用户所属的 Google 网上论坛。
- 输入您要显示的应用名称。
- 根据需要添加任何可选详细信息。
- 点击保存。
如需稍后更改 OAuth 同意屏幕上的信息(例如产品名称或电子邮件地址),请重复上述步骤配置同意屏幕。
创建 OAuth 凭据
-
转到“凭据”页面。
转到“凭据”页面 - 在创建凭据下拉菜单中,选择 OAuth 客户端 ID。
- 在应用类型下,选择网页应用。
- 为您的 OAuth 客户端 ID 添加一个名称。
-
点击创建。
您的 OAuth 客户端 ID 和客户端密钥已生成,并显示在 OAuth 客户端窗口中。
- 在已创建 OAuth 客户端对话框中,将客户端 ID 复制到剪贴板。
- 点击确定。
- 点击您刚刚创建的客户端的名称,以将其重新打开以进行修改。
-
在已获授权的重定向 URI 字段中,输入以下字符串:
https://iap.googleapis.com/v1/oauth/clientIds/CLIENT_ID:handleRedirect
其中
CLIENT_ID
是您刚刚复制到剪贴板的 OAuth 客户端 ID。
设置 IAP 访问权限
-
转到 Identity-Aware Proxy 页面。
转到 Identity-Aware Proxy 页面 - 选择要使用 IAP 保护的项目。
- 选中您要授予访问权限的资源旁边的复选框。
- 在右侧面板中,点击添加主帐号。
-
在显示的添加主帐号对话框中,输入群组或个人(应拥有项目的 IAP-secured Web App User 角色)的电子邮件地址。
以下种类的主帐号可以具有此角色:
- Google 帐号:user@gmail.com
- Google 群组:<管理员>@googlegroups.com
- 服务帐号:server@example.gserviceaccount.com
- Google Workspace 网域:example.com
请务必添加您有权访问的 Google 帐号。
- 从角色下拉列表中选择 Cloud IAP > IAP-secured Web App User。
- 点击保存。
配置 BackendConfig
如需为 IAP 配置 BackendConfig,请创建一个 Kubernetes Secret,然后将 iap
块添加到 BackendConfig。
创建 Kubernetes Secret
BackendConfig 使用 Kubernetes Secret 来封装您之前创建的 OAuth 客户端。如其他 Kubernetes 对象一样,Kubernetes Secret 通过 kubectl
命令行界面 (CLI) 进行管理。如需创建 Secret,请运行以下命令,其中 client_id_key 和 client_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,您需要指定 enabled
和 secretName
值。如需指定这些值,请确保您具有 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_id
和client_secret
键。
当 enabled
标志设置为 true
并且正确设置了 secretName
时,系统将为您选择的资源配置 IAP。
关闭 IAP
要关闭 IAP,您必须在 BackendConfig 中将 enabled
设置为 false
。如果您从 BackendConfig 中删除 IAP 块,则设置将保持不变。例如,如果在 secretName: my_secret
情况下启用 IAP 并删除该块,则通过 my_secret
中存储的 OAuth 凭据 IAP 将仍处于启用状态。