19.5. 在 Amazon Web Services Security Token Service 中使用手动模式


Amazon Web Services(AWS)支持使用 STS 的手动模式。

注意

此凭证策略只支持新的 OpenShift Container Platform 集群,且必须在安装过程中进行配置。您无法重新配置使用不同凭证策略的现有集群,以使用此功能。

19.5.1. 关于 AWS 安全令牌服务的手动模式

在带有 STS 的手动模式中,各个 OpenShift Container Platform 集群组件使用 AWS Security Token Service(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.2. 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.3. AWS STS 的令牌刷新

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

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

19.5.1.4. 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.5. AWS 组件 secret 格式

使用带有 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 的名称。

使用 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.2. 使用 STS 为手动模式安装 OpenShift Container Platform 集群

要安装配置为在带有 STS 的手动模式中使用 Cloud Credential Operator(CCO)的集群:

注意

因为在使用 STS 时集群以手动模式运行,所以无法使用所需的权限为组件创建新凭证。当升级到不同版本的 OpenShift Container Platform 时,通常会有新的 AWS 权限要求。在升级使用 STS 的集群前,集群管理员必须手动确保 AWS 权限足以用于现有组件,并可供任何新组件使用。

19.5.2.1. 配置 Cloud Credential Operator 工具

当 Cloud Credential Operator(CCO)以手动模式运行时,要从集群外部创建和管理云凭证,提取并准备 CCO 实用程序(ccoctl)二进制文件。

注意

ccoctl 工具是在 Linux 环境中运行的 Linux 二进制文件。

先决条件

  • 您可以访问具有集群管理员权限的 OpenShift Container Platform 帐户。
  • 已安装 OpenShift CLI(oc)。
  • 您已为 ccoctl 工具创建了用于以下权限的 AWS 帐户:

    表 19.3. 所需的 AWS 权限
    权限类型所需权限

    iam 权限

    • iam:CreateOpenIDConnectProvider
    • iam:CreateRole
    • iam:DeleteOpenIDConnectProvider
    • iam:DeleteRole
    • iam:DeleteRolePolicy
    • iam:GetOpenIDConnectProvider
    • iam:GetRole
    • iam:GetUser
    • iam:ListOpenIDConnectProviders
    • iam:ListRolePolicies
    • iam:ListRoles
    • iam:PutRolePolicy
    • iam:TagOpenIDConnectProvider
    • iam:TagRole

    s3 权限

    • s3:CreateBucket
    • s3:DeleteBucket
    • s3:DeleteObject
    • s3:GetBucketAcl
    • s3:GetBucketTagging
    • s3:GetObject
    • s3:GetObjectAcl
    • s3:GetObjectTagging
    • s3:ListBucket
    • s3:PutBucketAcl
    • s3:PutBucketPolicy
    • s3:PutBucketPublicAccessBlock
    • s3:PutBucketTagging
    • s3:PutObject
    • s3:PutObjectAcl
    • s3:PutObjectTagging

    cloudfront 权限

    • cloudfront:ListCloudFrontOriginAccessIdentities
    • cloudfront:ListDistributions
    • cloudfront:ListTagsForResource

    如果您计划通过公共 CloudFront 发行版 URL 将 OIDC 配置存储在 IAM 身份提供程序访问的私有 S3 存储桶中,则运行 ccoctl 工具的 AWS 帐户需要以下额外权限:

    • cloudfront:CreateCloudFrontOriginAccessIdentity
    • cloudfront:CreateDistribution
    • cloudfront:DeleteCloudFrontOriginAccessIdentity
    • cloudfront:DeleteDistribution
    • cloudfront:GetCloudFrontOriginAccessIdentity
    • cloudfront:GetCloudFrontOriginAccessIdentityConfig
    • cloudfront:GetDistribution
    • cloudfront:TagResource
    • cloudfront:UpdateDistribution
    注意

    在使用 ccoctl aws create-all 命令处理凭证请求时,这些额外权限支持使用 --create-private-s3-bucket 选项。

流程

  1. 运行以下命令来获取 OpenShift Container Platform 发行镜像:

    $ RELEASE_IMAGE=$(./openshift-install version | awk '/release image/ {print $3}')
  2. 运行以下命令,从 OpenShift Container Platform 发行镜像获取 CCO 容器镜像:

    $ CCO_IMAGE=$(oc adm release info --image-for='cloud-credential-operator' $RELEASE_IMAGE -a ~/.pull-secret)
    注意

    确保 $RELEASE_IMAGE 的架构与将使用 ccoctl 工具的环境架构相匹配。

  3. 运行以下命令,将 CCO 容器镜像中的 ccoctl 二进制文件提取到 OpenShift Container Platform 发行镜像中:

    $ oc image extract $CCO_IMAGE --file="/usr/bin/ccoctl" -a ~/.pull-secret
  4. 运行以下命令更改权限以使 ccoctl 可执行:

    $ chmod 775 ccoctl

验证

  • 要验证 ccoctl 是否准备就绪,可以尝试显示帮助文件。运行命令时使用相对文件名,例如:

    $ ./ccoctl.rhel9

    输出示例

    OpenShift credentials provisioning tool
    
    Usage:
      ccoctl [command]
    
    Available Commands:
      alibabacloud Manage credentials objects for alibaba cloud
      aws          Manage credentials objects for AWS cloud
      gcp          Manage credentials objects for Google cloud
      help         Help about any command
      ibmcloud     Manage credentials objects for IBM Cloud
      nutanix      Manage credentials objects for Nutanix
    
    Flags:
      -h, --help   help for ccoctl
    
    Use "ccoctl [command] --help" for more information about a command.

19.5.2.2. 使用 Cloud Credential Operator 实用程序创建 AWS 资源

您可以使用 CCO 实用程序(ccoctl单独创建所需的 AWS 资源,或使用单个命令来创建。

19.5.2.2.1. 单独创建 AWS 资源

如果您需要在修改 AWS 资源前查看 ccoctl 工具创建的 JSON 文件,或者 ccoctl 工具用于创建 AWS 资源的过程无法自动满足组织的要求,您可以单独创建 AWS 资源。例如,此选项对于在不同用户或部门之间共享创建这些资源的组织可能有用。

否则,您可以使用 ccoctl aws create-all 命令自动创建 AWS 资源。

注意

默认情况下,ccoctl 在运行命令的目录中创建对象。要在其他目录中创建对象,请使用 --output-dir 标志。此流程使用 <path_to_ccoctl_output_dir> 来引用这个目录。

有些 ccoctl 命令会发出 AWS API 调用来创建或修改 AWS 资源。您可以使用 --dry-run 标志来避免 API 调用。使用此标志可在本地文件系统中创建 JSON 文件。您可以使用 --cli-input-json 参数查看和修改 JSON 文件,然后使用 AWS CLI 工具应用它们。

先决条件

  • 提取并准备 ccoctl 二进制文件。

流程

  1. 生成用于为集群设置 OpenID Connect 供应商的公共和私有 RSA 密钥文件:

    $ ccoctl aws create-key-pair

    输出示例:

    2021/04/13 11:01:02 Generating RSA keypair
    2021/04/13 11:01:03 Writing private key to /<path_to_ccoctl_output_dir>/serviceaccount-signer.private
    2021/04/13 11:01:03 Writing public key to /<path_to_ccoctl_output_dir>/serviceaccount-signer.public
    2021/04/13 11:01:03 Copying signing key for use by installer

    其中 serviceaccount-signer.privateserviceaccount-signer.public 是生成的密钥文件。

    此命令还会在 /<path_to_ccoctl_output_dir>/tls/bound-service-account-signing-key.key 中创建集群在安装过程中所需的私钥。

  2. 在 AWS 上创建 OpenID Connect 身份提供程序和 S3 存储桶:

    $ ccoctl aws create-identity-provider \
      --name=<name> \
      --region=<aws_region> \
      --public-key-file=<path_to_ccoctl_output_dir>/serviceaccount-signer.public

    其中:

    • <name> 是用于标记为跟踪而创建的云资源的名称。
    • <aws-region> 是将要在其中创建云资源的 AWS 区域。
    • <path_to_ccoctl_output_dir>ccoctl aws create-key-pair 命令生成的公钥文件的路径。

    输出示例:

    2021/04/13 11:16:09 Bucket <name>-oidc created
    2021/04/13 11:16:10 OpenID Connect discovery document in the S3 bucket <name>-oidc at .well-known/openid-configuration updated
    2021/04/13 11:16:10 Reading public key
    2021/04/13 11:16:10 JSON web key set (JWKS) in the S3 bucket <name>-oidc at keys.json updated
    2021/04/13 11:16:18 Identity Provider created with ARN: arn:aws:iam::<aws_account_id>:oidc-provider/<name>-oidc.s3.<aws_region>.amazonaws.com

    其中 openid-configuration 是发现文档和 key.json 是一个 JSON Web 密钥集文件。

    此命令还会在 /<path_to_ccoctl_output_dir>/manifests/cluster-authentication-02-config.yaml 中创建 YAML 配置文件。此文件为集群生成的服务帐户令牌设置签发者 URL 字段,以便 AWS IAM 身份提供程序信任令牌。

  3. 为集群中的每个组件创建 IAM 角色。

    1. 从 OpenShift Container Platform 发行镜像中提取 CredentialsRequest 对象列表:

      $ oc adm release extract \
        --from=$RELEASE_IMAGE \
        --credentials-requests \
        --cloud=aws \
        --to=<path_to_directory_with_list_of_credentials_requests>/credrequests 1
      1
      credrequests 是存储 CredentialsRequest 对象列表的目录。如果该目录不存在,此命令就会创建该目录。
    2. 如果您的集群使用集群功能禁用一个或多个可选组件,请删除任何禁用组件的 CredentialsRequest 自定义资源。

      AWS 上 OpenShift Container Platform 4.13 的 credrequests 目录的内容示例

      0000_30_cluster-api_00_credentials-request.yaml 1
      0000_30_machine-api-operator_00_credentials-request.yaml 2
      0000_50_cloud-credential-operator_05-iam-ro-credentialsrequest.yaml 3
      0000_50_cluster-image-registry-operator_01-registry-credentials-request.yaml 4
      0000_50_cluster-ingress-operator_00-ingress-credentials-request.yaml 5
      0000_50_cluster-network-operator_02-cncc-credentials.yaml 6
      0000_50_cluster-storage-operator_03_credentials_request_aws.yaml 7

      1
      对于使用 TechPreviewNoUpgrade 功能集的集群,需要 Cluster API Operator CR。
      2
      Machine API Operator CR 是必需的。
      3
      需要 Cloud Credential Operator CR。
      4
      Image Registry Operator CR 是必需的。
      5
      Ingress Operator CR 是必需的。
      6
      Network Operator CR 是必需的。
      7
      Storage Operator CR 是一个可选组件,可能会在集群中禁用。
    3. 使用 ccoctl 工具处理 credrequests 目录中的所有 CredentialsRequest 对象:

      $ ccoctl aws create-iam-roles \
        --name=<name> \
        --region=<aws_region> \
        --credentials-requests-dir=<path_to_directory_with_list_of_credentials_requests>/credrequests \
        --identity-provider-arn=arn:aws:iam::<aws_account_id>:oidc-provider/<name>-oidc.s3.<aws_region>.amazonaws.com
      注意

      对于使用其他 IAM API 端点的 AWS 环境(如 GovCloud),还必须使用 --region 参数指定您的区域。

      如果您的集群使用 TechPreviewNoUpgrade 功能集启用的技术预览功能,则必须包含 --enable-tech-preview 参数。

      对于每个 CredentialsRequest 对象,ccoctl 创建一个带有信任策略的 IAM 角色,该角色与指定的 OIDC 身份提供程序相关联,以及来自 OpenShift Container Platform 发行镜像的每个 CredentialsRequest 对象中定义的权限策略。

验证

  • 要验证 OpenShift Container Platform secret 是否已创建,列出 <path_to_ccoctl_output_dir>/manifests 目录中的文件:

    $ ls <path_to_ccoctl_output_dir>/manifests

    输出示例:

    cluster-authentication-02-config.yaml
    openshift-cloud-credential-operator-cloud-credential-operator-iam-ro-creds-credentials.yaml
    openshift-cloud-network-config-controller-cloud-credentials-credentials.yaml
    openshift-cluster-api-capa-manager-bootstrap-credentials-credentials.yaml
    openshift-cluster-csi-drivers-ebs-cloud-credentials-credentials.yaml
    openshift-image-registry-installer-cloud-credentials-credentials.yaml
    openshift-ingress-operator-cloud-credentials-credentials.yaml
    openshift-machine-api-aws-cloud-credentials-credentials.yaml

    您可以通过查询 AWS 来验证是否已创建 IAM 角色。如需更多信息,请参阅有关列出 IAM 角色的 AWS 文档。

19.5.2.2.2. 使用单个命令创建 AWS 资源

如果您不需要在修改 AWS 资源前查看 ccoctl 工具创建的 JSON 文件,并且如果 ccoctl 工具用于创建 AWS 资源的过程会自动满足您的要求,则可以使用 ccoctl aws create-all 命令自动创建 AWS 资源。

否则,您可以单独创建 AWS 资源。

注意

默认情况下,ccoctl 在运行命令的目录中创建对象。要在其他目录中创建对象,请使用 --output-dir 标志。此流程使用 <path_to_ccoctl_output_dir> 来引用这个目录。

先决条件

您必须:

  • 提取并准备好 ccoctl 二进制文件。

流程

  1. 运行以下命令设置 $RELEASE_IMAGE 变量:

    $ RELEASE_IMAGE=$(./openshift-install version | awk '/release image/ {print $3}')
  2. 运行以下命令,从 OpenShift Container Platform 发行镜像中提取 CredentialsRequest 对象列表:

    $ oc adm release extract \
      --from=$RELEASE_IMAGE \
      --credentials-requests \
      --cloud=aws \
      --to=<path_to_directory_with_list_of_credentials_requests>/credrequests 1
    1
    credrequests 是存储 CredentialsRequest 对象列表的目录。如果该目录不存在,此命令就会创建该目录。
    注意

    运行此命令可能需要一些时间。

  3. 如果您的集群使用集群功能禁用一个或多个可选组件,请删除任何禁用组件的 CredentialsRequest 自定义资源。

    AWS 上 OpenShift Container Platform 4.13 的 credrequests 目录的内容示例

    0000_30_cluster-api_00_credentials-request.yaml 1
    0000_30_machine-api-operator_00_credentials-request.yaml 2
    0000_50_cloud-credential-operator_05-iam-ro-credentialsrequest.yaml 3
    0000_50_cluster-image-registry-operator_01-registry-credentials-request.yaml 4
    0000_50_cluster-ingress-operator_00-ingress-credentials-request.yaml 5
    0000_50_cluster-network-operator_02-cncc-credentials.yaml 6
    0000_50_cluster-storage-operator_03_credentials_request_aws.yaml 7

    1
    对于使用 TechPreviewNoUpgrade 功能集的集群,需要 Cluster API Operator CR。
    2
    Machine API Operator CR 是必需的。
    3
    需要 Cloud Credential Operator CR。
    4
    Image Registry Operator CR 是必需的。
    5
    Ingress Operator CR 是必需的。
    6
    Network Operator CR 是必需的。
    7
    Storage Operator CR 是一个可选组件,可能会在集群中禁用。
  4. 使用 ccoctl 工具处理 credrequests 目录中的所有 CredentialsRequest 对象:

    $ ccoctl aws create-all \
      --name=<name> \1
      --region=<aws_region> \2
      --credentials-requests-dir=<path_to_directory_with_list_of_credentials_requests>/credrequests \3
      --output-dir=<path_to_ccoctl_output_dir> \4
      --create-private-s3-bucket 5
    1
    指定用于标记创建用于跟踪的任何云资源的名称。
    2
    指定在其中创建云资源的 AWS 区域。
    3
    指定包含组件 CredentialsRequest 对象文件的目录。
    4
    可选:指定您希望 ccoctl 实用程序在其中创建对象的目录。默认情况下,实用程序在运行命令的目录中创建对象。
    5
    可选:默认情况下,ccoctl 实用程序将 OpenID Connect (OIDC) 配置文件存储在公共 S3 存储桶中,并使用 S3 URL 作为公共 OIDC 端点。要将 OIDC 配置存储在 IAM 身份提供程序通过公共 CloudFront 发行版 URL 访问的专用 S3 存储桶中,请使用 --create-private-s3-bucket 参数。
    注意

    如果您的集群使用 TechPreviewNoUpgrade 功能集启用的技术预览功能,则必须包含 --enable-tech-preview 参数。

验证

  • 要验证 OpenShift Container Platform secret 是否已创建,列出 <path_to_ccoctl_output_dir>/manifests 目录中的文件:

    $ ls <path_to_ccoctl_output_dir>/manifests

    输出示例:

    cluster-authentication-02-config.yaml
    openshift-cloud-credential-operator-cloud-credential-operator-iam-ro-creds-credentials.yaml
    openshift-cloud-network-config-controller-cloud-credentials-credentials.yaml
    openshift-cluster-api-capa-manager-bootstrap-credentials-credentials.yaml
    openshift-cluster-csi-drivers-ebs-cloud-credentials-credentials.yaml
    openshift-image-registry-installer-cloud-credentials-credentials.yaml
    openshift-ingress-operator-cloud-credentials-credentials.yaml
    openshift-machine-api-aws-cloud-credentials-credentials.yaml

    您可以通过查询 AWS 来验证是否已创建 IAM 角色。如需更多信息,请参阅有关列出 IAM 角色的 AWS 文档。

19.5.2.3. 运行安装程序

先决条件

  • 使用托管集群的云平台配置帐户。
  • 获取 OpenShift Container Platform 发行镜像。

流程

  1. 进入包含安装程序的目录并创建 install-config.yaml 文件:

    $ openshift-install create install-config --dir <installation_directory>

    其中 <installation_directory> 是安装程序在其中创建文件的目录。

  2. 编辑 install-config.yaml 配置文件,使其包含将 credentialsMode 参数设置为 Manual

    install-config.yaml 配置文件示例

    apiVersion: v1
    baseDomain: cluster1.example.com
    credentialsMode: Manual 1
    compute:
    - architecture: amd64
      hyperthreading: Enabled

    1
    添加这一行将 credentialsMode 参数设置为 Manual
  3. 创建所需的 OpenShift Container Platform 安装清单:

    $ openshift-install create manifests
  4. ccoctl 生成的清单复制到安装程序创建的 manifests 目录中:

    $ cp /<path_to_ccoctl_output_dir>/manifests/* ./manifests/
  5. ccoctltls 目录中生成的私钥复制到安装目录中:

    $ cp -a /<path_to_ccoctl_output_dir>/tls .
  6. 运行 OpenShift Container Platform 安装程序:

    $ ./openshift-install create cluster

19.5.2.4. 验证安装

  1. 连接到 OpenShift Container Platform 集群。
  2. 验证集群没有 root 凭证:

    $ oc get secrets -n kube-system aws-creds

    输出应类似于:

    Error from server (NotFound): secrets "aws-creds" not found
  3. 验证组件是否假定 secret 清单中指定的 IAM 角色,而不是使用由 CCO 创建的凭证:

    带有 Image Registry Operator 的命令示例

    $ oc get secrets -n openshift-image-registry installer-cloud-credentials -o json | jq -r .data.credentials | base64 --decode

    输出应显示组件使用的角色和 Web 身份令牌,如下所示:

    带有 Image Registry Operator 的输出示例

    [default]
    role_arn = arn:aws:iam::123456789:role/openshift-image-registry-installer-cloud-credentials
    web_identity_token_file = /var/run/secrets/openshift/serviceaccount/token

19.5.3. 其他资源

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.