使用 Identity Service for GKE 进行身份验证


本页面介绍如何配置外部身份提供商以向 Google Kubernetes Engine (GKE) 集群进行身份验证。

概览

Identity Service for GKE 可将现有身份验证解决方案扩展到 GKE 集群。借助 OpenID Connect (OIDC) 支持,您可以按照组织中创建、启用和停用用户帐号的标准程序来管理对 Kubernetes 集群的访问权限。Identity Service for GKE 仅限于 OIDC 身份提供商。

准备工作

  • 本主题假定您熟悉以下身份验证和 OpenID 概念:

  • 不支持无头系统。基于浏览器的身份验证流程用于提示您同意并授权您的用户帐号。

在开始之前,请确保您已执行以下任务:

使用以下任一方法设定默认的 gcloud 设置:

  • 使用 gcloud init(如果您想要在系统引导下完成默认设置)。
  • 使用 gcloud config(如果您想单独设置项目 ID、区域和地区)。

使用 gcloud init

如果您收到 One of [--zone, --region] must be supplied: Please specify location 错误,请完成本部分。

  1. 运行 gcloud init 并按照说明操作:

    gcloud init

    如果您要在远程服务器上使用 SSH,请使用 --console-only 标志来防止命令启动浏览器:

    gcloud init --console-only
  2. 按照说明授权 gcloud 使用您的 Google Cloud 帐号。
  3. 创建新配置或选择现有配置。
  4. 选择 Google Cloud 项目。
  5. 为可用区级集群选择默认 Compute Engine 可用区,或为区域级集群或 Autopilot 集群选择区域。

使用 gcloud config

  • 设置默认项目 ID
    gcloud config set project PROJECT_ID
  • 如果您使用的是可用区级集群,请设置默认计算可用区
    gcloud config set compute/zone COMPUTE_ZONE
  • 如果您使用的是 Autopilot 集群或区域级集群,请设置默认计算区域
    gcloud config set compute/region COMPUTE_REGION
  • gcloud 更新到最新版本:
    gcloud components update

角色

本主题涉及两个角色:

  • 集群管理员:此角色创建一个或多个用户集群,并为使用这些集群的开发者创建身份验证配置文件。

  • 开发者:此角色在一个或多个集群上运行工作负载,并使用 OIDC 进行身份验证。

在新集群上启用 Identity Service for GKE

本部分面向集群管理员

默认情况下,Identity and Access Management 配置为集群身份验证的身份提供商。如果要将 OIDC 与第三方身份提供商搭配使用,则可以使用 gcloud 命令行工具在集群创建期间启用 Identity Service for GKE。

如需使用 gcloud 工具创建启用了 Identity Service for GKE 的集群,请运行以下命令:

gcloud beta container clusters create CLUSTER_NAME \
    --enable-identity-service

CLUSTER_NAME 替换为新集群的名称。

在现有集群上启用 Identity Service for GKE

本部分面向集群管理员

您可以使用 gcloud 命令行工具在现有集群中启用 Identity Service for GKE。

更新集群时,请指定 --enable-identity-service 选项:

gcloud beta container clusters update CLUSTER_NAME \
    --enable-identity-service

CLUSTER_NAME 替换为您的集群名称。

在集群上为 GKE 配置 Identity Service

本部分面向集群管理员

GKE 身份提供商配置通过 Kubernetes CRD(自定义资源定义)进行处理,该配置包含身份提供商配置、首选身份验证方法以及用户和组声明映射等信息。

系统会自动为 kube-public 命名空间中的集群生成名为 defaultClientConfig 配置文件。

  1. 通过运行以下命令下载此配置文件:

    kubectl get clientconfig default -n kube-public -o yaml > login-config.yaml
    
  2. 使用 Spec.authentication 部分中的 OIDC 设置更新下载的 ClientConfig 配置文件。

    apiVersion: authentication.gke.io/v2alpha1
    kind: ClientConfig
    metadata:
    annotations:
      controller-gen.kubebuilder.io/version: v0.2.4
    name: default
    namespace: kube-public
    Spec:
      name: cluster-name
      server: https://192.168.0.1:6443
      authentication:
      - name: oidc
        oidc:
         clientID: CLIENT_ID
         certificateAuthorityData: OIDC_PROVIDER_CERTIFICATE
         extraParams: EXTRA_PARAMS
         issuerURI:  ISSUER_URI
         cloudConsoleRedirectURI: CLOUD_CONSOLE_REDIRECT_URI
         kubectlRedirectURI: KUBECTL_REDIRECT_URL
         Scopes: SCOPES
         userClaim: USER
         groupsClaim: GROUPS
         userPrefix: USER_PREFIX
         groupPrefix: GROUP_PREFIX
    

    替换以下内容:

    • CLIENT_ID:向 OpenID 提供商发出身份验证请求的客户端应用的 ID。
    • OIDC_PROVIDER_CERTIFICATE:(可选)OIDC 提供商的 base64 编码的 PEM 编码证书。如果您的 OIDC 提供商使用自签名证书,则此字段可能有用。默认情况下,适用于 GKE 的 Identity Service 包含一组公共根目录。
      • 如需创建字符串,请对证书(包括标头)进行 base64 编码。
      • 将生成的字符串作为单独的一行添加到 certificateAuthorityData 中。 示例:certificateAuthorityData: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tC...k1JSUN2RENDQWFT==
    • EXTRA_PARAMS:要发送到 OpenID 提供商的其他键值对参数。如果您要向群组授权,请传入 resource=token-groups-claim。如果您的授权服务器提示是否同意,则对于使用 Microsoft Azure 和 Okta 进行的身份验证,请将 extraParams 设置为 prompt=consent。对于 Cloud Identity,请将 extraParams 设置为 prompt=consent,access_type=offline
    • ISSUER_URI:用于向 OpenID 发送授权请求的网址,例如 https://example.com/adfs。Kubernetes API 服务器使用此网址来发现用于验证令牌的公钥。URI 必须使用 HTTPS。
    • CLOUD_CONSOLE_REDIRECT_URI:Cloud Console 的重定向网址,例如 https://console.cloud.google.com/kubernetes/oidc
    • KUBECTL_REDIRECT_URL:kubectl 用于授权的重定向网址。
    • SCOPES:要发送到 OpenID 提供商的其他范围。Microsoft Azure 和 Okta 需要 offline_access 范围。
    • USER_PREFIX:附加到用户声明的前缀,以防止与现有名称冲突。默认情况下,颁发者前缀会附加到提供给 Kubernetes API 服务器的 userID(除非用户声明为 email)。生成的用户标识符为 ISSUER_URI#USER。例如:https://example.com/adfs#123123123,其中 https://example.com/adfsISSUER_URI,而 123123123 是 JWT 中的用户声明。Google 建议您使用前缀,但如果您想停用前缀功能,则可以将 USER_PREFIX 设置为 -
    • GROUP_PREFIX:附加到群组声明的前缀,以防止与现有名称冲突。例如,如果您有两个名为 foobar 的群组,请添加前缀 gid-。生成的群组为 gid-foobar
  3. 完成配置后,运行以下命令以应用配置:

    kubectl apply -f login-config.yaml
    

    应用此配置后,Identity Service for GKE 会在集群内部运行,并通过 Google Cloud 负载平衡器处理请求。如果您的集群配置了专用端点,则表示负载平衡器是内部的。否则,负载平衡器是外部的,可通过公共互联网访问。

  4. 使用 Spec.authentication.oidc 部分中的 clientSecret 设置,再次更新 login-config.yaml 配置文件。

    clientSecret: CLIENT_SECRET
    

    CLIENT_SECRET 替换为 OIDC 客户端应用和 OIDC 提供商之间的共享密钥。为避免将客户端密钥上传到 kube-apiserver,请勿再次运行 kubectl apply 命令来应用配置。

  5. 将更新的 login-config.yaml 文件分发给开发者,并指示他们将配置文件放在其平台的适当位置。

为您的集群创建 RBAC 政策

本部分面向集群管理员

管理员使用 Kubernetes 基于角色的访问权限控制 (RBAC) 向经过身份验证的集群用户授予访问权限。如需为集群配置 RBAC,管理员必须为每个开发者授予 RBAC 角色。要授予对特定命名空间中的资源的访问权限,请创建 RoleRoleBinding要授予对整个集群的资源的访问权限,请创建 ClusterRoleClusterRoleBinding

例如,假设您希望用户能够查看集群中的所有 Secret 对象。

以下是名为 secret-viewer 的 ClusterRole 的清单。被授予此角色的人可以获取、查看和列出集群中的任何 Secret。

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: secret-viewer
rules:
- apiGroups: [""]
  # The resource type for which access is granted
  resources: ["secrets"]
  # The permissions granted by the ClusterRole
  verbs: ["get", "watch", "list"]

以下是名为 people-who-view-secrets 的 ClusterRoleBinding 的清单。绑定会将 secret-viewer 角色授予客户端配置文件中定义的用户名。

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name:  people-who-view-secrets
subjects:
- kind: User
  name: ISSUER_URI#USER
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: secret-viewer
  apiGroup: rbac.authorization.k8s.io
  1. ISSUER_URI 替换为客户端配置文件的 spec.authentication.oidc.issuerURI 中的颁发者 URI。将 USER 替换为令牌中的用户标识符,该令牌位于客户端配置文件的 spec.authentication.oidc.userClaim 中配置的声明名称之下。例如 https://example.com/adfs#123123123,其中 https://example.com/adfsISSUER_URI123123123 是您的用户标识符。

  2. 要创建 ClusterRole,请将清单保存到名为 secret-viewer-cluster-role.yaml 的文件中,然后运行以下命令:

    kubectl apply -f secret-viewer-cluster-role.yaml
    
  3. 要创建 ClusterRoleBinding,请将清单保存到名为 secret-viewer-cluster-role-binding.yaml 的文件中,然后运行以下命令:

    kubectl --kubeconfig USER_CLUSTER_KUBECONFIG apply -f secret-viewer-cluster-role-binding.yaml
    

登录集群并进行身份验证

本部分面向开发者

现在您已经从管理员中获得身份验证配置文件,接下来可以向您的集群进行身份验证了。

  1. 下载管理员提供的 login-config.yaml 文件,并将其放置在适合您平台的正确位置。

  2. 安装 Cloud SDK SDK,它提供单独的 OIDC 组件。您可以通过运行以下指令来安装此组件:

    gcloud components install kubectl-oidc
    
  3. 运行以下命令以向您的集群进行身份验证:

    kubectl oidc login --cluster=CLUSTER_NAME --login-config=login-config.yaml
    

    系统会打开网络浏览器以完成身份验证过程。

  4. 完成身份验证后,您可以运行 kubectl 命令,例如:

    kubectl get pods
    

停用 Identity Service for GKE

本部分面向集群管理员

您可以使用 gcloud 命令行工具停用 Identity Service for GKE。如需停用 Identity Service for GKE,请指定 --no-enable-identity-service 选项:

gcloud beta container clusters update CLUSTER_NAME --no-enable-identity-service

后续步骤