搜索

9.3. 假设您自己的 pod 中的 AWS IAM 角色

download PDF

按照本节中的步骤,启用服务帐户在用户定义的项目中部署的 pod 中假定 AWS Identity and Access Management (IAM)角色。

您可以创建所需资源,包括 AWS IAM 角色、服务帐户、包括 AWS SDK 的容器镜像,以及使用镜像部署的 pod。在示例中,使用了 Python 的 AWS Boto3 SDK。您还可以验证 pod 身份 Webhook 是否将 AWS 环境变量、卷挂载和令牌卷放入 pod。另外,您可以检查服务帐户是否在 pod 中假设 AWS IAM 角色,并可成功运行 AWS SDK 操作。

9.3.1. 为服务帐户设置 AWS IAM 角色

创建一个 AWS Identity and Access Management (IAM)角色,由 Red Hat OpenShift Service on AWS 集群中的服务帐户假定。附加您的服务帐户在 pod 中运行 AWS SDK 操作所需的权限。

先决条件

  • 您有在 AWS 帐户中安装和配置 IAM 角色所需的权限。
  • 您可以访问使用 AWS 安全令牌服务(STS)的 Red Hat OpenShift Service on AWS 集群。不需要 admin 级别用户权限。
  • 您有 OpenID Connect (OIDC)供应商的 Amazon Resource Name (ARN),该供应商被配置为 Red Hat OpenShift Service on AWS 中的服务帐户签发者。

    注意

    在带有 STS 的 AWS 上的 Red Hat OpenShift Service 中,OIDC 供应商会在安装过程中创建,并默认设置为服务帐户签发者。如果您不知道 OIDC 供应商 ARN,请联络您的集群管理员。

  • 已安装 AWS CLI (aws)。

流程

  1. 使用以下 JSON 配置创建一个名为 trust-policy.json 的文件:

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Principal": {
                    "Federated": "<oidc_provider_arn>" 1
                },
                "Action": "sts:AssumeRoleWithWebIdentity",
                "Condition": {
                    "StringEquals": {
                        "<oidc_provider_name>:sub": "system:serviceaccount:<project_name>:<service_account_name>" 2
                    }
                }
            }
        ]
    }
    1
    <oidc_provider_arn > 替换为 OIDC 供应商的 ARN,如 arn:aws:iam::<aws_account_id>:oidc-provider/rh-oidc.s3.us-east-1.amazonaws.com/1v3r0n44npxu4g58so46aeohduomfres
    2
    将角色限制为指定的项目和服务帐户。将 <oidc_provider_name > 替换为 OIDC 供应商的名称,如 rh-oidc.s3.us-east-1.amazonaws.com/1v3r0n44npxu4g58so46aeohduomfres。将 <project_name>:<service_account_name > 替换为您的项目名称和服务帐户名称,如 my-project:test-service-account
    注意

    另外,您可以使用 "< oidc_provider_name>:sub": "system:serviceaccount:<project_name>:*",将角色 限制为指定项目内的任何服务帐户。如果提供 * 通配符,则必须在上一行中将 StringEquals 替换为 StringLike

  2. 创建一个 AWS IAM 角色,它使用 trust-policy.json 文件中定义的信任策略:

    $ aws iam create-role \
        --role-name <aws_iam_role_name> \ 1
        --assume-role-policy-document file://trust-policy.json 2
    1
    <aws_iam_role_name > 替换为 IAM 角色的名称,如 pod-identity-test-role
    2
    引用您在上一步中创建的 trust-policy.json 文件。

    输出示例:

    ROLE    arn:aws:iam::<aws_account_id>:role/<aws_iam_role_name>        2022-09-28T12:03:17+00:00       /       AQWMS3TB4Z2N3SH7675JK   <aws_iam_role_name>
    ASSUMEROLEPOLICYDOCUMENT        2012-10-17
    STATEMENT       sts:AssumeRoleWithWebIdentity   Allow
    STRINGEQUALS    system:serviceaccount:<project_name>:<service_account_name>
    PRINCIPAL       <oidc_provider_arn>

    在输出中为角色保留 ARN。角色 ARN 的格式为 arn:aws:iam::<aws_account_id>:role/<aws_iam_role_name>

  3. 附加服务帐户在 pod 中运行 AWS SDK 操作时所需的受管 AWS 权限:

    $ aws iam attach-role-policy \
        --policy-arn arn:aws:iam::aws:policy/ReadOnlyAccess \ 1
        --role-name <aws_iam_role_name> 2
    1
    本例中的策略为 IAM 角色添加了只读权限。
    2
    将 < aws_iam_role_name > 替换为您在上一步中创建的 IAM 角色的名称。
  4. 可选:在角色中添加自定义属性或权限边界。如需更多信息,请参阅 AWS 文档中的创建角色将权限委派给 AWS 服务

9.3.2. 在项目中创建服务帐户

在用户定义的项目中添加服务帐户。在服务帐户配置中包含 eks.amazonaws.com/role-arn 注解,该注解引用 AWS Identity and Access Management (IAM)角色的 Amazon Resource Name (ARN)角色。

先决条件

  • 您已为您的服务帐户创建 AWS IAM 角色。如需更多信息,请参阅为服务帐户设置 AWS IAM 角色
  • 您可以使用 AWS 安全令牌服务(STS)集群访问 Red Hat OpenShift Service on AWS。不需要 admin 级别用户权限。
  • 已安装 OpenShift CLI(oc)。

流程

  1. 在 Red Hat OpenShift Service on AWS 集群中,创建一个项目:

    $ oc new-project <project_name> 1
    1
    <project_name > 替换为项目的名称。名称必须与您在 AWS IAM 角色配置中指定的项目名称匹配。
    注意

    在创建时,您将自动切换到项目。

  2. 使用以下服务帐户配置,创建名为 test-service-account.yaml 的文件:

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: <service_account_name> 1
      namespace: <project_name> 2
      annotations:
        eks.amazonaws.com/role-arn: "<aws_iam_role_arn>" 3
    1
    <service_account_name > 替换为服务帐户的名称。名称必须与您在 AWS IAM 角色配置中指定的服务帐户名称匹配。
    2
    <project_name > 替换为项目的名称。名称必须与您在 AWS IAM 角色配置中指定的项目名称匹配。
    3
    指定服务帐户在 pod 中使用的 AWS IAM 角色的 ARN。将 <aws_iam_role_arn > 替换为您为服务帐户创建的 AWS IAM 角色的 ARN。角色 ARN 的格式为 arn:aws:iam::<aws_account_id>:role/<aws_iam_role_name>
  3. 在项目中创建服务帐户:

    $ oc create -f test-service-account.yaml

    输出示例:

    serviceaccount/<service_account_name> created

  4. 查看服务帐户的详情:

    $ oc describe serviceaccount <service_account_name> 1
    1
    <service_account_name > 替换为服务帐户的名称。

    输出示例:

    Name:                <service_account_name> 1
    Namespace:           <project_name> 2
    Labels:              <none>
    Annotations:         eks.amazonaws.com/role-arn: <aws_iam_role_arn> 3
    Image pull secrets:  <service_account_name>-dockercfg-rnjkq
    Mountable secrets:   <service_account_name>-dockercfg-rnjkq
    Tokens:              <service_account_name>-token-4gbjp
    Events:              <none>

    1
    指定服务帐户的名称。
    2
    指定包含服务帐户的项目。
    3
    列出服务帐户假定的 AWS IAM 角色的 ARN 注解。

9.3.3. 创建 AWS SDK 容器镜像示例

此流程中的步骤提供了创建包含 AWS SDK 的容器镜像的示例方法。

示例步骤使用 Podman 创建容器镜像和 Quay.io 来托管该镜像。有关 Quay.io 的更多信息,请参阅 Quay.io 入门。容器镜像可用于部署可运行 AWS SDK 操作的 pod。

注意

在本例中,Python 的 AWS Boto3 SDK 安装到容器镜像中。有关安装和使用 AWS Boto3 SDK 的更多信息,请参阅 AWS Boto3 文档。有关其他 AWS SDK 的详情,请参阅 AWS 文档中的 AWS SDK 和工具参考指南

先决条件

  • 您已在安装主机上安装了 Podman。
  • 您有一个 Quay.io 用户帐户。

流程

  1. 将以下配置添加到名为 Containerfile 的文件中:

    FROM ubi9/ubi 1
    RUN dnf makecache && dnf install -y python3-pip && dnf clean all && pip3 install boto3>=1.15.0 2
    1
    指定 Red Hat Universal Base Image 版本 9。
    2
    使用 pip 软件包管理系统安装 AWS Boto3 SDK。在本例中,安装了 AWS Boto3 SDK 版本 1.15.0 或更高版本。
  2. 在包含文件的目录中,构建名为 awsboto3sdk 的容器镜像:

    $ podman build -t awsboto3sdk .
  3. 登录到 Quay.io:

    $ podman login quay.io
  4. 标记镜像以准备上传到 Quay.io:

    $ podman tag localhost/awsboto3sdk quay.io/<quay_username>/awsboto3sdk:latest 1
    1
    <quay_username& gt; 替换为您的 Quay.io 用户名。
  5. 将标记的容器镜像推送到 Quay.io:

    $ podman push quay.io/<quay_username>/awsboto3sdk:latest 1
    1
    <quay_username& gt; 替换为您的 Quay.io 用户名。
  6. 创建包含镜像 public 的 Quay.io 存储库。这会发布镜像,以便使用它来在 Red Hat OpenShift Service on AWS 集群中部署 pod:

    1. https://quay.io/ 上,导航到包含该镜像的存储库的 Repository Settings 页面。
    2. 单击 Make Public,使存储库公开可用。

9.3.4. 部署包含 AWS SDK 的 pod

从包含 AWS SDK 的容器镜像,在用户定义的项目中部署 pod。在 pod 配置中,指定包含 eks.amazonaws.com/role-arn 注解的服务帐户。

随着服务帐户引用 pod,pod 身份 Webhook 会将 AWS 环境变量、卷挂载和令牌卷注入 pod。pod 变异可让服务帐户在 pod 中自动假设 AWS IAM 角色。

先决条件

  • 您已为服务帐户创建了 AWS Identity and Access Management (IAM)角色。如需更多信息,请参阅为服务帐户设置 AWS IAM 角色
  • 您可以访问使用 AWS 安全令牌服务(STS)的 Red Hat OpenShift Service on AWS 集群。不需要 admin 级别用户权限。
  • 已安装 OpenShift CLI(oc)。
  • 您已在项目中创建了一个服务帐户,其中包含一个 eks.amazonaws.com/role-arn 注解,该注解引用您想要服务帐户的 IAM 角色的 Amazon Resource Name (ARN)。
  • 您有一个包含 AWS SDK 的容器镜像,且镜像可供集群使用。具体步骤请参阅创建示例 AWS SDK 容器镜像

    注意

    在这个示例中使用 Python 的 AWS Boto3 SDK。有关安装和使用 AWS Boto3 SDK 的更多信息,请参阅 AWS Boto3 文档。有关其他 AWS SDK 的详情,请参阅 AWS 文档中的 AWS SDK 和工具参考指南

流程

  1. 使用以下 pod 配置创建一个名为 awsboto3sdk-pod.yaml 的文件:

    apiVersion: v1
    kind: Pod
    metadata:
      namespace: <project_name> 1
      name: awsboto3sdk 2
    spec:
      securityContext:
        runAsNonRoot: true
        seccompProfile:
          type: RuntimeDefault
      serviceAccountName: <service_account_name> 3
      containers:
      - name: awsboto3sdk
        image: quay.io/<quay_username>/awsboto3sdk:latest 4
        command:
        - /bin/bash
        - "-c"
        - "sleep 100000" 5
        securityContext:
          allowPrivilegeEscalation: false
          capabilities:
            drop: [ALL]
      terminationGracePeriodSeconds: 0
      restartPolicy: Never
    1
    <project_name > 替换为项目的名称。名称必须与您在 AWS IAM 角色配置中指定的项目名称匹配。
    2
    指定 pod 的名称。
    3
    将 < service_account_name > 替换为配置为假定 AWS IAM 角色的服务帐户的名称。名称必须与您在 AWS IAM 角色配置中指定的服务帐户名称匹配。
    4
    指定 awsboto3sdk 容器镜像的位置。将 <quay_username& gt; 替换为您的 Quay.io 用户名。
    5
    在本例中,此行使 pod 保持运行 100000 秒,以便在 pod 中直接启用验证测试。如需详细的验证步骤,请参阅 pod 中验证假定的 IAM 角色
  2. 部署 awsboto3sdk pod:

    $ oc create -f awsboto3sdk-pod.yaml

    输出示例:

    pod/awsboto3sdk created

9.3.5. 在 pod 中验证假定的 IAM 角色

在项目中部署 awsboto3sdk pod 后,验证 pod 身份 Webhook 是否已修改 pod。检查 pod 中是否存在所需的 AWS 环境变量、卷挂载和 OIDC 令牌卷。

您还可以在 pod 中运行 AWS SDK 操作时,验证服务帐户是否假定 AWS 帐户的 AWS Identity and Access Management (IAM)角色。

先决条件

  • 您已为您的服务帐户创建 AWS IAM 角色。如需更多信息,请参阅为服务帐户设置 AWS IAM 角色
  • 您可以访问使用 AWS 安全令牌服务(STS)的 Red Hat OpenShift Service on AWS 集群。不需要 admin 级别用户权限。
  • 已安装 OpenShift CLI(oc)。
  • 您已在项目中创建了一个服务帐户,其中包含一个 eks.amazonaws.com/role-arn 注解,该注解引用您想要服务帐户的 IAM 角色的 Amazon Resource Name (ARN)。
  • 您已在包含 AWS SDK 的用户定义的项目中部署了 pod。pod 引用了使用 pod 身份 Webhook 的服务帐户,以假设运行 AWS SDK 操作所需的 AWS IAM 角色。具体步骤请参阅部署包含 AWS SDK 的 pod

    注意

    在本例中,使用包括 Python 的 AWS Boto3 SDK 的 pod。有关安装和使用 AWS Boto3 SDK 的更多信息,请参阅 AWS Boto3 文档。有关其他 AWS SDK 的详情,请参阅 AWS 文档中的 AWS SDK 和工具参考指南

流程

  1. 验证 AWS 环境变量、卷挂载和 OIDC 令牌卷是否在部署的 awsboto3sdk pod 的描述中列出:

    $ oc describe pod awsboto3sdk

    输出示例:

    Name:         awsboto3sdk
    Namespace:    <project_name>
    ...
    Containers:
      awsboto3sdk:
        ...
        Environment:
          AWS_ROLE_ARN:                 <aws_iam_role_arn> 1
          AWS_WEB_IDENTITY_TOKEN_FILE:  /var/run/secrets/eks.amazonaws.com/serviceaccount/token 2
        Mounts:
          /var/run/secrets/eks.amazonaws.com/serviceaccount from aws-iam-token (ro) 3
    ...
    Volumes:
      aws-iam-token: 4
        Type:                    Projected (a volume that contains injected data from multiple sources)
        TokenExpirationSeconds:  86400
    ...

    1
    列出由 pod 身份 webhook 注入 pod 的 AWS_ROLE_ARN 环境变量。变量包含服务帐户假定的 AWS IAM 角色的 ARN。
    2
    列出由 pod 身份 Webhook 注入的 AWS_WEB_IDENTITY_TOKEN_FILE 环境变量。变量包含用于验证服务帐户身份的 OIDC 令牌的完整路径。
    3
    列出 Pod 身份 Webhook 注入 pod 的卷挂载。
    4
    列出挂载到 /var/run/secrets/eks.amazonaws.com/serviceaccount 挂载点的 aws-iam-token 卷。卷包含用于验证服务帐户的 OIDC 令牌,以假定 AWS IAM 角色。
  2. awsboto3sdk pod 中启动一个交互式终端:

    $ oc exec -ti awsboto3sdk -- /bin/sh
  3. 在 pod 的交互式终端中,验证 pod 身份 webhook 是否将 $AWS_ROLE_ARN 环境变量放入 pod 中:

    $ echo $AWS_ROLE_ARN

    输出示例:

    arn:aws:iam::<aws_account_id>:role/<aws_iam_role_name> 1

    1
    输出必须指定 AWS IAM 角色的 ARN,该角色具有运行 AWS SDK 操作所需的权限。
  4. 在 pod 的交互式终端中,验证 $AWS_WEB_IDENTITY_TOKEN_FILE 环境变量是否被 pod 身份 webhook 放入 pod 中:

    $ echo $AWS_WEB_IDENTITY_TOKEN_FILE

    输出示例:

    /var/run/secrets/eks.amazonaws.com/serviceaccount/token 1

    1
    输出必须为服务帐户指定 pod 中到 OIDC 令牌的完整路径。
  5. 在 pod 的交互式终端中,验证包含 OIDC 令牌文件的 aws-iam-token 卷挂载是否由 pod 身份 webhook 挂载:

    $ mount | grep -is 'eks.amazonaws.com'

    输出示例:

    tmpfs on /run/secrets/eks.amazonaws.com/serviceaccount type tmpfs (ro,relatime,seclabel,size=13376888k)

  6. 在 pod 的交互式终端中,验证 /var/run/secrets/eks.amazonaws.com/serviceaccount/ 挂载点中是否存在名为 token 的 OIDC 令牌文件:

    $ ls /var/run/secrets/eks.amazonaws.com/serviceaccount/token

    输出示例:

    /var/run/secrets/eks.amazonaws.com/serviceaccount/token 1

    1
    aws-iam-token 卷中的 OIDC 令牌文件,它由 pod 身份 Webhook 挂载到 pod 中。令牌用于验证 AWS 中服务帐户的身份。
  7. 在 pod 中,验证 AWS Boto3 SDK 操作是否已成功运行:

    1. 在 pod 的交互式终端中,启动一个 Python 3 shell:

      $ python3
    2. 在 Python 3 shell 中导入 boto3 模块:

      >>> import boto3
    3. 创建包含 Boto3 s3 服务资源的变量:

      >>> s3 = boto3.resource('s3')
    4. 打印 AWS 帐户中的所有 S3 存储桶的名称:

      >>> for bucket in s3.buckets.all():
      ...     print(bucket.name)
      ...

      输出示例:

      <bucket_name>
      <bucket_name>
      <bucket_name>
      ...

      如果服务帐户成功假定 AWS IAM 角色,则输出会列出 AWS 帐户中提供的所有 S3 存储桶。

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.