2.8. 使用短期凭证验证 pod


有些 OpenShift Container Platform 集群 对集群外创建和管理的独立组件使用短期安全凭证。这些集群上的客户工作负载中的应用程序可以使用集群使用的短期身份验证方法进行身份验证。

2.8.1. 为工作负载配置短期身份验证

要在应用程序中使用此验证方法,您必须完成以下步骤:

  1. 在云供应商的 Identity and Access Management (IAM)设置中创建一个联邦身份服务帐户。
  2. 创建 OpenShift Container Platform 服务帐户,用于模拟云供应商的服务帐户。
  3. 配置与应用程序相关的任何工作负载,以使用 OpenShift Container Platform 服务帐户。

2.8.1.1. 环境和用户访问权限要求

要配置这个验证方法,您必须满足以下要求:

  • 集群必须使用 短期安全凭证
  • 您必须可以使用具有 cluster-admin 角色的用户访问 OpenShift CLI (oc)。
  • 在云供应商控制台中,您必须具有具有特权的用户访问,以管理 Identity and Access Management (IAM)和联邦身份配置。

2.8.2. 为 GCP 上的应用程序配置 GCP Workload Identity 身份验证

要将短期身份验证用于使用 GCP Workload Identity 身份验证的 GCP 集群上的应用程序,您必须完成以下步骤:

创建联邦 GCP 服务帐户

您可以使用 Google Cloud 控制台创建工作负载身份池和供应商,并允许 OpenShift Container Platform 服务帐户模拟 GCP 服务帐户。

先决条件

  • 您的 GCP 集群正在运行 OpenShift Container Platform 版本 4.17.4 或更高版本,并使用 GCP Workload Identity。
  • 您可以使用具有管理 Identity and Access Management (IAM)和工作负载身份配置权限的用户访问 Google Cloud 控制台。
  • 您已创建了用于应用程序的 Google Cloud 项目。

流程

  1. 在 Google Cloud 项目的 IAM 配置中,识别集群用于 GCP Workload Identity 身份验证的身份池和供应商。
  2. 为外部身份授予模拟 GCP 服务帐户的权限。通过这些权限,OpenShift Container Platform 服务帐户可以充当联邦工作负载身份。

    如需更多信息,请参阅有关 允许外部工作负载访问 Google Cloud 资源的 GCP 文档。

为 GCP 创建 OpenShift Container Platform 服务帐户

您可以创建一个 OpenShift Container Platform 服务帐户,并注解它来模拟 GCP 服务帐户。

先决条件

  • 您的 GCP 集群正在运行 OpenShift Container Platform 版本 4.17.4 或更高版本,并使用 GCP Workload Identity。
  • 您已创建了一个联邦 GCP 服务帐户。
  • 您可以使用具有 cluster-admin 角色的用户访问 OpenShift CLI (oc)。
  • 您可以使用具有管理 Identity and Access Management (IAM)和工作负载身份配置权限的用户访问 Google Cloud CLI (gcloud)。

流程

  1. 运行以下命令,创建一个 OpenShift Container Platform 服务帐户以用于 GCP Workload Identity pod 身份验证:

    $ oc create serviceaccount <service_account_name>
  2. 运行以下命令,使用身份提供程序和 GCP 服务帐户注解服务帐户:

    $ oc patch serviceaccount <service_account_name> -p '{"metadata": {"annotations": {"cloud.google.com/workload-identity-provider": "projects/<project_number>/locations/global/workloadIdentityPools/<identity_pool>/providers/<identity_provider>"}}}'

    将 & lt;project_number&gt; , < identity_pool &gt ; , 和 <identity_provider > 替换为您的配置的值。

    注意

    对于 <project_number >,请指定 Google Cloud 项目号,而不是项目 ID。

  3. 运行以下命令,使用 GCP 服务帐户的电子邮件地址注解服务帐户:

    $ oc patch serviceaccount <service_account_name> -p '{"metadata": {"annotations": {"cloud.google.com/service-account-email": "<service_account_email>"}}}'

    <service_account_email > 替换为 GCP 服务帐户的电子邮件地址。

    提示

    GCP 服务帐户电子邮件地址通常使用 < service_account_name>@<project_id>.iam.gserviceaccount.com格式

  4. 运行以下命令,注解服务帐户以使用 直接 外部凭证配置注入模式:

    $ oc patch serviceaccount <service_account_name> -p '{"metadata": {"annotations": {"cloud.google.com/injection-mode": "direct"}}}'

    在这个模式中,Workload Identity Federation Webhook 控制器直接生成 GCP 外部凭证配置,并将它们注入 pod。

  5. 运行以下命令,使用 Google Cloud CLI (gcloud)指定工作负载的权限:

    $ gcloud projects add-iam-policy-binding <project_id> --member "<service_account_email>" --role "projects/<project_id>/roles/<role_for_workload_permissions>"

    <role_for_workload_permissions > 替换为工作负载的角色。指定授予工作负载所需的权限的角色。

验证

  • 要验证服务帐户配置,请运行以下命令来检查 ServiceAccount 清单:

    $ oc get serviceaccount <service_account_name>

    在以下示例中,service-a/app-x OpenShift Container Platform 服务帐户可以模拟名为 app-x 的 GCP 服务帐户:

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: app-x
      namespace: service-a
      annotations:
        cloud.google.com/workload-identity-provider: "projects/<project_number>/locations/global/workloadIdentityPools/<identity_pool>/providers/<identity_provider>" 1
        cloud.google.com/service-account-email: "app-x@project.iam.googleapis.com"
        cloud.google.com/audience: "sts.googleapis.com" 2
        cloud.google.com/token-expiration: "86400" 3
        cloud.google.com/gcloud-run-as-user: "1000"
        cloud.google.com/injection-mode: "direct" 4
    1
    集群服务帐户的工作负载身份提供程序。
    2
    工作负载身份提供程序的允许使用者。
    3
    令牌过期时间(以秒为单位)。
    4
    直接 外部凭证配置注入模式。
部署通过 GCP Workload Identity 进行身份验证的客户工作负载

要在应用程序中使用短期身份验证,您必须将其相关的 pod 配置为使用 OpenShift Container Platform 服务帐户。使用 OpenShift Container Platform 服务帐户会触发 Webhook 来模拟 pod,以便它们能够模拟 GCP 服务帐户。

以下示例演示了如何部署使用 OpenShift Container Platform 服务帐户的 pod 并验证配置。

先决条件

  • 您的 GCP 集群正在运行 OpenShift Container Platform 版本 4.17.4 或更高版本,并使用 GCP Workload Identity。
  • 您已创建了一个联邦 GCP 服务帐户。
  • 您已为 GCP 创建了一个 OpenShift Container Platform 服务帐户。

流程

  1. 要创建使用 GCP Workload Identity 验证的 pod,请创建一个类似以下示例的部署 YAML 文件:

    部署示例

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: ubi9
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: ubi9
      template:
        metadata:
          labels:
            app: ubi9
        spec:
          serviceAccountName: "<service_account_name>" 1
          containers:
            - name: ubi
              image: 'registry.access.redhat.com/ubi9/ubi-micro:latest'
              command:
                - /bin/sh
                - '-c'
                - |
                  sleep infinity

    1
    指定 OpenShift Container Platform 服务帐户的名称。
  2. 运行以下命令来应用部署文件:

    $ oc apply -f deployment.yaml

验证

  • 要验证 pod 是否使用短期身份验证,请运行以下命令:

    $ oc get pods -o json | jq -r '.items[0].spec.containers[0].env[] | select(.name=="GOOGLE_APPLICATION_CREDENTIALS")'

    输出示例

    {   "name": "GOOGLE_APPLICATION_CREDENTIALS",   "value": "/var/run/secrets/workload-identity/federation.json" }

    GOOGLE_APPLICATION_CREDENTIALS 环境变量存在表示使用 GCP Workload Identity 进行身份验证的 pod。

  • 要验证其他配置详情,请检查 pod 规格。以下 pod 规格示例显示了 webhook 变异的环境变量和卷字段。

    带有 直接 注入模式的 pod 规格示例:

    apiVersion: v1
    kind: Pod
    metadata:
      name: app-x-pod
      namespace: service-a
    annotations:
      cloud.google.com/skip-containers: "init-first,sidecar"
      cloud.google.com/external-credentials-json: |- 1
        {
          "type": "external_account",
          "audience": "//iam.googleapis.com/projects/<project_number>/locations/global/workloadIdentityPools/on-prem-kubernetes/providers/<identity_provider>",
          "subject_token_type": "urn:ietf:params:oauth:token-type:jwt",
          "token_url": "https://sts.googleapis.com/v1/token",
          "service_account_impersonation_url": "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/app-x@project.iam.gserviceaccount.com:generateAccessToken",
          "credential_source": {
            "file": "/var/run/secrets/sts.googleapis.com/serviceaccount/token",
            "format": {
              "type": "text"
            }
          }
        }
    spec:
      serviceAccountName: app-x
      initContainers:
      - name: init-first
        image: container-image:version
      containers:
      - name: sidecar
        image: container-image:version
      - name: container-name
        image: container-image:version
        env: 2
        - name: GOOGLE_APPLICATION_CREDENTIALS
          value: /var/run/secrets/gcloud/config/federation.json
        - name: CLOUDSDK_COMPUTE_REGION
          value: asia-northeast1
        volumeMounts:
        - name: gcp-iam-token
          readOnly: true
          mountPath: /var/run/secrets/sts.googleapis.com/serviceaccount
        - mountPath: /var/run/secrets/gcloud/config
          name: external-credential-config
          readOnly: true
      volumes:
      - name: gcp-iam-token
        projected:
          sources:
          - serviceAccountToken:
              audience: sts.googleapis.com
              expirationSeconds: 86400
              path: token
      - downwardAPI:
          defaultMode: 288
          items:
          - fieldRef:
              apiVersion: v1
              fieldPath: metadata.annotations['cloud.google.com/external-credentials-json']
            path: federation.json
        name: external-credential-config

    1
    Webhook 控制器生成的外部凭证配置。Kubernetes downwardAPI 卷将配置挂载到容器文件系统中。
    2
    webhook 注入环境变量用于基于令牌的身份验证。
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.