本页介绍如何使用 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 控制台项目。
- 由 HTTPS 负载平衡器处理的一个或多个 GKE 实例。当您在 GKE 集群中创建 Ingress 对象时,负载平衡器应自动建立。
- 已注册到负载平衡器地址的域名。
- 用于验证所有请求都拥有一个身份的应用代码。
- 了解如何获取用户的身份。
启用 IAP
如果您尚未配置项目的 OAuth 同意屏幕,系统会提示您执行此操作。如需配置 OAuth 同意屏幕,请参阅设置 OAuth 同意屏幕。
设置 IAP 访问权限
-
转到 Identity-Aware Proxy 页面。
转到 Identity-Aware Proxy 页面 - 选择要使用 IAP 保护的项目。
-
选中您要授予访问权限的资源旁边的复选框。
如果您没有看到资源,请确保已创建资源,并且 BackendConfig Compute Engine Ingress 控制器已同步。
如需验证后端服务是否可用,请运行以下 gcloud 命令:
gcloud compute backend-services list
- 在右侧面板上,点击添加主账号。
-
在显示的添加主账号对话框中,输入群组或个人(应拥有项目的 IAP-secured Web App User 角色)的电子邮件地址。
以下种类的主账号可以具有此角色:
- Google 账号:user@gmail.com
- Google 网站论坛:admins@googlegroups.com
- 服务账号:server@example.gserviceaccount.com
- Google Workspace 网域:example.com
请务必添加您有权访问的 Google 账号。
- 从角色下拉列表中选择 Cloud IAP > 受 IAP 保护的网页应用用户。
- 点击保存。
配置 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 将仍处于启用状态。