19.5. 带组件的短期凭证的手动模式


在安装过程中,您可以将 Cloud Credential Operator (CCO)配置为以手动模式运行,并使用 CCO 实用程序 (ccoctl) 为在 OpenShift Container Platform 集群外创建和管理的独立组件实施短期安全凭证。

注意

Amazon Web Services (AWS)、Google Cloud Platform (GCP)和全局 Microsoft Azure 支持此凭证策略。必须在安装新的 OpenShift Container Platform 集群时配置策略。您无法重新配置使用不同凭证策略的现有集群,以使用此功能。

云提供商在其实施此身份验证方法时使用不同的术语。

表 19.3. 短期凭证供应商术语
云供应商Provider nomenclature

Amazon Web Services (AWS)

AWS 安全令牌服务(STS)

Google Cloud Platform (GCP)

GCP Workload Identity

Global Microsoft Azure

Microsoft Entra Workload ID

19.5.1. AWS 安全令牌服务

在带有 STS 的手动模式中,各个 OpenShift Container Platform 集群组件使用 AWS 安全令牌服务(STS)来分配提供短期、有限权限安全凭证的组件 IAM 角色。这些凭证与特定于发布 AWS API 调用的每个组件的 IAM 角色关联。

19.5.1.1. AWS 安全令牌服务身份验证过程

AWS 安全令牌服务(STS)和 AssumeRole API 操作允许 pod 检索 IAM 角色策略定义的访问密钥。

OpenShift Container Platform 集群包含一个 Kubernetes 服务帐户签名服务。此服务使用私钥为服务帐户 JSON Web 令牌 (JWT) 签名。需要服务帐户令牌的 pod 通过 pod 规格请求一个。当 pod 创建并分配给节点时,节点会从服务帐户签名服务中检索签名的服务帐户,并将它挂载到 pod。

使用 STS 的集群在其 Kubernetes 配置 secret 中包含一个 IAM 角色 ID。工作负载假定此 IAM 角色 ID 的身份。向工作负载发布的已签名的服务帐户令牌与 AWS 中的配置一致,它允许 AWS STS 为工作负载授予指定 IAM 角色访问密钥。

AWS STS 仅为包含满足以下条件的服务帐户令牌的请求授予访问密钥:

  • 令牌名称和命名空间与服务帐户名称和命名空间匹配。
  • 令牌由与公钥匹配的密钥签名。

集群使用的服务帐户签名密钥的公钥对存储在 AWS S3 存储桶中。AWS STS 联邦验证服务帐户令牌签名是否与 S3 存储桶中存储的公钥一致。

19.5.1.1.1. AWS STS 的身份验证流

下图演示了使用 AWS STS 时 AWS 和 OpenShift Container Platform 集群之间的身份验证流。

  • 令牌签名 是 OpenShift Container Platform 集群上的 Kubernetes 服务帐户签名服务。
  • pod 中的 Kubernetes 服务帐户是签名的服务帐户令牌。

图 19.2. AWS 安全令牌服务身份验证流

使用 AWS STS 时 AWS 和集群间的详细身份验证流

使用适当配置的 AWS IAM OpenID Connect(OIDC)身份提供程序以及 AWS IAM 角色会自动请求新的和刷新的凭证。AWS IAM 信任的服务帐户令牌由 OpenShift Container Platform 签名,并可投射到 pod 中并用于身份验证。

19.5.1.1.2. AWS STS 的令牌刷新

pod 使用签名的服务帐户令牌在一段时间内过期。对于使用 AWS STS 的集群,这个时间段为 3600 秒,或一小时。

分配了 pod 的节点上的 kubelet,以确保刷新令牌。当令牌超过这个值的 80% 时,kubelet 会尝试轮转令牌。

19.5.1.1.3. AWS STS 的 OpenID Connect 要求

您可以在一个公共的或私有的 S3 存储中保存您的 OIDC 配置的密钥的公钥部分。

OIDC spec 需要使用 HTTPS。AWS 服务需要一个公共端点,以 JSON Web 密钥集 (JWKS) 公钥的形式公开 OIDC 文档。这允许 AWS 服务验证由 Kubernetes 签名的绑定令牌,并确定是否信任证书。因此,S3 存储桶选项都需要一个公共 HTTPS 端点和私有端点。

要使用 AWS STS,AWS STS 服务的公共 AWS 后端必须能够与公共 S3 存储桶或私有 S3 存储桶与公共 CloudFront 端点通信。您可以选择在安装过程中处理 CredentialsRequest 对象时要使用的存储桶类型:

  • 默认情况下,CCO 实用程序 (ccoctl) 将 OIDC 配置文件存储在公共 S3 存储桶中,并使用 S3 URL 作为公共 OIDC 端点。
  • 另外,您可以将 ccoctl 实用程序将 OIDC 配置存储在 IAM 身份提供程序通过一个公共 CloudFront 发行版 URL 访问的专用 S3 存储桶中。

19.5.1.2. AWS 组件 secret 格式

将手动模式与 AWS 安全令牌服务(STS)一起使用会更改提供给各个 OpenShift Container Platform 组件的 AWS 凭证的内容。比较以下 secret 格式:

使用长期凭证的 AWS secret 格式

apiVersion: v1
kind: Secret
metadata:
  namespace: <target_namespace> 1
  name: <target_secret_name> 2
data:
  aws_access_key_id: <base64_encoded_access_key_id>
  aws_secret_access_key: <base64_encoded_secret_access_key>

1
组件的命名空间。
2
组件 secret 的名称。

使用 AWS STS 的 AWS secret 格式

apiVersion: v1
kind: Secret
metadata:
  namespace: <target_namespace> 1
  name: <target_secret_name> 2
stringData:
  credentials: |-
    [default]
    sts_regional_endpoints = regional
    role_name: <operator_role_name> 3
    web_identity_token_file: <path_to_token> 4

1
组件的命名空间。
2
组件 secret 的名称。
3
组件的 IAM 角色。
4
pod 中服务帐户令牌的路径。通常这是 OpenShift Container Platform 组件的 /var/run/secrets/openshift/serviceaccount/token

19.5.1.3. AWS 组件 secret 权限要求

OpenShift Container Platform 组件需要以下权限:这些值位于每个组件的 CredentialsRequest 自定义资源 (CR) 中。

注意

这些权限适用于所有资源。除非指定,否则这些权限中没有请求条件。

组件自定义资源服务所需的权限

Cluster CAPI Operator

openshift-cluster-api-aws

EC2

  • ec2:CreateTags
  • ec2:DescribeAvailabilityZones
  • ec2:DescribeDhcpOptions
  • ec2:DescribeImages
  • ec2:DescribeInstances
  • ec2:DescribeInternetGateways
  • ec2:DescribeSecurityGroups
  • ec2:DescribeSubnets
  • ec2:DescribeVpcs
  • ec2:DescribeNetworkInterfaces
  • ec2:DescribeNetworkInterfaceAttribute
  • ec2:ModifyNetworkInterfaceAttribute
  • ec2:RunInstances
  • ec2:TerminateInstances

Elastic load balancing

  • elasticloadbalancing:DescribeLoadBalancers
  • elasticloadbalancing:DescribeTargetGroups
  • elasticloadbalancing:DescribeTargetHealth
  • elasticloadbalancing:RegisterInstancesWithLoadBalancer
  • elasticloadbalancing:RegisterTargets
  • elasticloadbalancing:DeregisterTargets

Identity and Access Management (IAM)

  • iam:PassRole
  • iam:CreateServiceLinkedRole

密钥管理服务(KMS)

  • kms:Decrypt
  • kms:Encrypt
  • kms:GenerateDataKey
  • kms:GenerateDataKeyWithoutPlainText
  • kms:DescribeKey
  • kms:RevokeGrant[1]
  • kms:CreateGrant [1]
  • kms:ListGrants [1]

Machine API Operator

openshift-machine-api-aws

EC2

  • ec2:CreateTags
  • ec2:DescribeAvailabilityZones
  • ec2:DescribeDhcpOptions
  • ec2:DescribeImages
  • ec2:DescribeInstances
  • ec2:DescribeInstanceTypes
  • ec2:DescribeInternetGateways
  • ec2:DescribeSecurityGroups
  • ec2:DescribeRegions
  • ec2:DescribeSubnets
  • ec2:DescribeVpcs
  • ec2:RunInstances
  • ec2:TerminateInstances

Elastic load balancing

  • elasticloadbalancing:DescribeLoadBalancers
  • elasticloadbalancing:DescribeTargetGroups
  • elasticloadbalancing:DescribeTargetHealth
  • elasticloadbalancing:RegisterInstancesWithLoadBalancer
  • elasticloadbalancing:RegisterTargets
  • elasticloadbalancing:DeregisterTargets

Identity and Access Management (IAM)

  • iam:PassRole
  • iam:CreateServiceLinkedRole

密钥管理服务(KMS)

  • kms:Decrypt
  • kms:Encrypt
  • kms:GenerateDataKey
  • kms:GenerateDataKeyWithoutPlainText
  • kms:DescribeKey
  • kms:RevokeGrant[1]
  • kms:CreateGrant [1]
  • kms:ListGrants [1]

Cloud Credential Operator

cloud-credential-operator-iam-ro

Identity and Access Management (IAM)

  • iam:GetUser
  • iam:GetUserPolicy
  • iam:ListAccessKeys

Cluster Image Registry Operator

openshift-image-registry

S3

  • s3:CreateBucket
  • s3:DeleteBucket
  • s3:PutBucketTagging
  • s3:GetBucketTagging
  • s3:PutBucketPublicAccessBlock
  • s3:GetBucketPublicAccessBlock
  • s3:PutEncryptionConfiguration
  • s3:GetEncryptionConfiguration
  • s3:PutLifecycleConfiguration
  • s3:GetLifecycleConfiguration
  • s3:GetBucketLocation
  • s3:ListBucket
  • s3:GetObject
  • s3:PutObject
  • s3:DeleteObject
  • s3:ListBucketMultipartUploads
  • s3:AbortMultipartUpload
  • s3:ListMultipartUploadParts

Ingress Operator

openshift-ingress

Elastic load balancing

  • elasticloadbalancing:DescribeLoadBalancers

Route 53

  • route53:ListHostedZones
  • route53:ListTagsForResources
  • route53:ChangeResourceRecordSets

标签

  • tag:GetResources

安全令牌服务(STS)

  • sts:AssumeRole

Cluster Network Operator

openshift-cloud-network-config-controller-aws

EC2

  • ec2:DescribeInstances
  • ec2:DescribeInstanceStatus
  • ec2:DescribeInstanceTypes
  • ec2:UnassignPrivateIpAddresses
  • ec2:AssignPrivateIpAddresses
  • ec2:UnassignIpv6Addresses
  • ec2:AssignIpv6Addresses
  • ec2:DescribeSubnets
  • ec2:DescribeNetworkInterfaces

AWS Elastic Block Store CSI Driver Operator

aws-ebs-csi-driver-operator

EC2

  • ec2:AttachVolume
  • ec2:CreateSnapshot
  • ec2:CreateTags
  • ec2:CreateVolume
  • ec2:DeleteSnapshot
  • ec2:DeleteTags
  • ec2:DeleteVolume
  • ec2:DescribeInstances
  • ec2:DescribeSnapshots
  • ec2:DescribeTags
  • ec2:DescribeVolumes
  • ec2:DescribeVolumesModifications
  • ec2:DetachVolume
  • ec2:ModifyVolume
  • ec2:DescribeAvailabilityZones
  • ec2:EnableFastSnapshotRestores

密钥管理服务(KMS)

  • kms:ReEncrypt*
  • kms:Decrypt
  • kms:Encrypt
  • kms:GenerateDataKey
  • kms:GenerateDataKeyWithoutPlainText
  • kms:DescribeKey
  • kms:RevokeGrant[1]
  • kms:CreateGrant [1]
  • kms:ListGrants [1]
  1. 请求条件:kms:GrantIsForAWSResource: true

19.5.1.4. OLM 管理的 Operator 支持使用 AWS STS 进行身份验证

除了 OpenShift Container Platform 集群组件外,AWS 集群上的 Operator Lifecycle Manager (OLM) 管理的一些 Operator 也可以使用带有 STS 的手动模式。这些 Operator 使用在集群外管理的有限权限短期凭证进行身份验证。要确定 Operator 支持 AWS STS 进行身份验证,请参阅 OperatorHub 中的 Operator 描述。

19.5.2. GCP Workload Identity

在 GCP Workload Identity 的手动模式中,独立的 OpenShift Container Platform 集群组件使用 GCP 工作负载身份提供程序来允许组件使用短期、有限权限的凭证模拟 GCP 服务帐户。

19.5.2.1. GCP Workload Identity 验证过程

使用正确配置的 OpenID Connect (OIDC) 身份提供程序以及 IAM 服务帐户来自动请求新的和刷新的凭证。GCP 信任的服务帐户令牌由 OpenShift Container Platform 签名,并可投射到 pod 中并用于身份验证。令牌会在一小时后刷新。

下图显示了在使用 GCP Workload Identity 时 GCP 和 OpenShift Container Platform 集群之间的身份验证流。

图 19.3. GCP Workload Identity 身份验证流

使用 GCP Workload Identity 时 GCP 和集群间的详细身份验证流

19.5.2.2. GCP 组件 secret 格式

在 GCP Workload Identity 中使用手动模式会更改提供给各个 OpenShift Container Platform 组件的 GCP 凭证的内容。比较以下 secret 内容:

GCP secret 格式

apiVersion: v1
kind: Secret
metadata:
  namespace: <target_namespace> 1
  name: <target_secret_name> 2
data:
  service_account.json: <service_account> 3

1
组件的命名空间。
2
组件 secret 的名称。
3
Base64 编码的服务帐户。

使用长期凭证的 Base64 编码 service_account.json 文件的内容

{
   "type": "service_account", 1
   "project_id": "<project_id>",
   "private_key_id": "<private_key_id>",
   "private_key": "<private_key>", 2
   "client_email": "<client_email_address>",
   "client_id": "<client_id>",
   "auth_uri": "https://accounts.google.com/o/oauth2/auth",
   "token_uri": "https://oauth2.googleapis.com/token",
   "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
   "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/<client_email_address>"
}

1
凭据类型是 service_account
2
用于向 GCP 验证的专用 RSA 密钥。这个密钥必须保持安全,且不会被轮转。

使用 GCP Workload Identity 的 Base64 编码 service_account.json 文件的内容

{
   "type": "external_account", 1
   "audience": "//iam.googleapis.com/projects/123456789/locations/global/workloadIdentityPools/test-pool/providers/test-provider", 2
   "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/<client_email_address>:generateAccessToken", 3
   "credential_source": {
      "file": "<path_to_token>", 4
      "format": {
         "type": "text"
      }
   }
}

1
凭证类型是 external_account
2
目标受众是 GCP Workload Identity provider。
3
可以通过这些凭据模拟的服务帐户的资源 URL。
4
pod 中服务帐户令牌的路径。通常这是 OpenShift Container Platform 组件的 /var/run/secrets/openshift/serviceaccount/token

19.5.3. Microsoft Entra Workload ID

在 Microsoft Entra Workload ID 的手动模式中,独立的 OpenShift Container Platform 集群组件使用 Workload ID 提供程序来分配组件短期安全凭证。

19.5.3.1. Microsoft Entra Workload ID 身份验证过程

下图显示了在使用 Microsoft Entra Workload ID 时 Azure 和 OpenShift Container Platform 集群之间的身份验证流。

图 19.4. Workload ID 身份验证流

使用 Workload ID 时 Azure 和集群间的详细身份验证流

19.5.3.2. Azure 组件 secret 格式

在 Microsoft Entra Workload ID 中使用手动模式会更改提供给各个 OpenShift Container Platform 组件的 Azure 凭证的内容。比较以下 secret 格式:

使用长期凭证的 Azure secret 格式

apiVersion: v1
kind: Secret
metadata:
  namespace: <target_namespace> 1
  name: <target_secret_name> 2
data:
  azure_client_id: <client_id> 3
  azure_client_secret: <client_secret> 4
  azure_region: <region>
  azure_resource_prefix: <resource_group_prefix> 5
  azure_resourcegroup: <resource_group_prefix>-rg 6
  azure_subscription_id: <subscription_id>
  azure_tenant_id: <tenant_id>
type: Opaque

1
组件的命名空间。
2
组件 secret 的名称。
3
组件用来进行身份验证的 Microsoft Entra ID 身份的客户端 ID。
4
用于与 Microsoft Entra ID 进行身份验证用于 <client_id> 身份的组件 secret。
5
资源组前缀。
6
资源组。这个值由 <resource_group_prefix> 和后缀 -rg 组成。

使用 Microsoft Entra Workload ID 的 Azure secret 格式

apiVersion: v1
kind: Secret
metadata:
  namespace: <target_namespace> 1
  name: <target_secret_name> 2
data:
  azure_client_id: <client_id> 3
  azure_federated_token_file: <path_to_token_file> 4
  azure_region: <region>
  azure_subscription_id: <subscription_id>
  azure_tenant_id: <tenant_id>
type: Opaque

1
组件的命名空间。
2
组件 secret 的名称。
3
组件用来进行身份验证的用户分配的受管身份的客户端 ID。
4
挂载的服务帐户令牌文件的路径。

19.5.3.3. Azure 组件 secret 权限要求

OpenShift Container Platform 组件需要以下权限:这些值位于每个组件的 CredentialsRequest 自定义资源 (CR) 中。

组件自定义资源服务所需的权限

Cloud Controller Manager Operator

openshift-azure-cloud-controller-manager

  • Microsoft.Compute/virtualMachines/read
  • Microsoft.Network/loadBalancers/read
  • Microsoft.Network/loadBalancers/write
  • Microsoft.Network/networkInterfaces/read
  • Microsoft.Network/networkSecurityGroups/read
  • Microsoft.Network/networkSecurityGroups/write
  • Microsoft.Network/publicIPAddresses/join/action
  • Microsoft.Network/publicIPAddresses/read
  • Microsoft.Network/publicIPAddresses/write

Cluster CAPI Operator

openshift-cluster-api-azure

角色:Contributor [1]

Machine API Operator

openshift-machine-api-azure

  • Microsoft.Compute/availabilitySets/delete
  • Microsoft.Compute/availabilitySets/read
  • Microsoft.Compute/availabilitySets/write
  • Microsoft.Compute/diskEncryptionSets/read
  • Microsoft.Compute/disks/delete
  • Microsoft.Compute/galleries/images/versions/read
  • Microsoft.Compute/skus/read
  • Microsoft.Compute/virtualMachines/delete
  • Microsoft.Compute/virtualMachines/extensions/delete
  • Microsoft.Compute/virtualMachines/extensions/read
  • Microsoft.Compute/virtualMachines/extensions/write
  • Microsoft.Compute/virtualMachines/read
  • Microsoft.Compute/virtualMachines/write
  • Microsoft.ManagedIdentity/userAssignedIdentities/assign/action
  • Microsoft.Network/applicationSecurityGroups/read
  • Microsoft.Network/loadBalancers/backendAddressPools/join/action
  • Microsoft.Network/loadBalancers/read
  • Microsoft.Network/loadBalancers/write
  • Microsoft.Network/networkInterfaces/delete
  • Microsoft.Network/networkInterfaces/join/action
  • Microsoft.Network/networkInterfaces/loadBalancers/read
  • Microsoft.Network/networkInterfaces/read
  • Microsoft.Network/networkInterfaces/write
  • Microsoft.Network/networkSecurityGroups/read
  • Microsoft.Network/networkSecurityGroups/write
  • Microsoft.Network/publicIPAddresses/delete
  • Microsoft.Network/publicIPAddresses/join/action
  • Microsoft.Network/publicIPAddresses/read
  • Microsoft.Network/publicIPAddresses/write
  • Microsoft.Network/routeTables/read
  • Microsoft.Network/virtualNetworks/delete
  • Microsoft.Network/virtualNetworks/read
  • Microsoft.Network/virtualNetworks/subnets/join/action
  • Microsoft.Network/virtualNetworks/subnets/read
  • Microsoft.Resources/subscriptions/resourceGroups/read

Cluster Image Registry Operator

openshift-image-registry-azure

数据权限

  • Microsoft.Storage/storageAccounts/blobServices/containers/blobs/delete
  • Microsoft.Storage/storageAccounts/blobServices/containers/blobs/write
  • Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read
  • Microsoft.Storage/storageAccounts/blobServices/containers/blobs/add/action
  • Microsoft.Storage/storageAccounts/blobServices/containers/blobs/move/action

常规权限

  • Microsoft.Storage/storageAccounts/blobServices/read
  • Microsoft.Storage/storageAccounts/blobServices/containers/read
  • Microsoft.Storage/storageAccounts/blobServices/containers/write
  • Microsoft.Storage/storageAccounts/blobServices/generateUserDelegationKey/action
  • Microsoft.Storage/storageAccounts/read
  • Microsoft.Storage/storageAccounts/write
  • Microsoft.Storage/storageAccounts/delete
  • Microsoft.Storage/storageAccounts/listKeys/action
  • Microsoft.Resources/tags/write

Ingress Operator

openshift-ingress-azure

  • Microsoft.Network/dnsZones/A/delete
  • Microsoft.Network/dnsZones/A/write
  • Microsoft.Network/privateDnsZones/A/delete
  • Microsoft.Network/privateDnsZones/A/write

Cluster Network Operator

openshift-cloud-network-config-controller-azure

  • Microsoft.Network/networkInterfaces/read
  • Microsoft.Network/networkInterfaces/write
  • Microsoft.Compute/virtualMachines/read
  • Microsoft.Network/virtualNetworks/read
  • Microsoft.Network/virtualNetworks/subnets/join/action
  • Microsoft.Network/loadBalancers/backendAddressPools/join/action

Azure File CSI Driver Operator

azure-file-csi-driver-operator

  • Microsoft.Network/networkSecurityGroups/join/action
  • Microsoft.Network/virtualNetworks/subnets/read
  • Microsoft.Network/virtualNetworks/subnets/write
  • Microsoft.Storage/storageAccounts/delete
  • Microsoft.Storage/storageAccounts/fileServices/read
  • Microsoft.Storage/storageAccounts/fileServices/shares/delete
  • Microsoft.Storage/storageAccounts/fileServices/shares/read
  • Microsoft.Storage/storageAccounts/fileServices/shares/write
  • Microsoft.Storage/storageAccounts/listKeys/action
  • Microsoft.Storage/storageAccounts/read
  • Microsoft.Storage/storageAccounts/write

Azure Disk CSI Driver Operator

azure-disk-csi-driver-operator

  • Microsoft.Compute/disks/*
  • Microsoft.Compute/snapshots/*
  • Microsoft.Compute/virtualMachineScaleSets/*/read
  • Microsoft.Compute/virtualMachineScaleSets/read
  • Microsoft.Compute/virtualMachineScaleSets/virtualMachines/write
  • Microsoft.Compute/virtualMachines/*/read
  • Microsoft.Compute/virtualMachines/write
  • Microsoft.Resources/subscriptions/resourceGroups/read
  1. 此组件需要角色而不是一组权限。

19.5.3.4. OLM 管理的 Operator 支持使用 Microsoft Entra Workload ID 进行身份验证

除了 OpenShift Container Platform 集群组件外,Azure 集群上的 Operator Lifecycle Manager (OLM) 管理的一些 Operator 可以在 Microsoft Entra Workload ID 中使用手动模式。这些 Operator 使用在集群外管理的短期凭证进行身份验证。要确定 Operator 是否支持使用 Workload ID 进行身份验证,请参阅 OperatorHub 中的 Operator 描述。

19.5.4. 其他资源

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.