

 **帮助改进此页面** 

要帮助改进本用户指南，请选择位于每个页面右侧窗格中的**在 GitHub 上编辑此页面**链接。

# 使用 IRSA 对另一个账户进行身份验证
<a name="cross-account-access"></a>

您可以通过从其它账户的集群创建身份提供者或者使用链接的 `AssumeRole` 操作，配置跨账户 IAM 权限。在以下示例中，*账户 A* 拥有一个支持服务账户的 IAM 角色的 Amazon EKS 集群。在该集群上运行的容器组（pod）需要承担来自*账户 B* 的 IAM 权限。
+  **选项 1** 更简单，但需要账户 B 为账户 A 的集群创建和管理 OIDC 身份提供程序。
+  **选项 2 将** OIDC 管理保留在账户 A 中，但需要通过两次 `AssumeRole` 调用进行角色链式操作。

## 从其它账户的集群创建身份提供程序
<a name="_option_1_create_an_identity_provider_from_another_accounts_cluster"></a>

在此示例中，账户 A 从其集群向账户 B 提供 OpenID Connect（OIDC）颁发者 URL。账户 B 遵循[为集群创建 IAM OIDC 提供者](enable-iam-roles-for-service-accounts.md)和[为 Kubernetes 服务账户分配 IAM 角色](associate-service-account-role.md)中的说明，使用来自账户 A 集群的 OIDC 发布者 URL。然后，集群管理员注释账户 A 的集群中的服务账户以使用来自账户 B 的角色（{{444455556666}}）。

```
apiVersion: v1
kind: ServiceAccount
metadata:
  annotations:
    eks.amazonaws.com/role-arn: arn:aws-cn:iam::444455556666:role/account-b-role
```

## 选项 2：使用链式 `AssumeRole` 操作
<a name="_option_2_use_chained_assumerole_operations"></a>

在此方案中，每个账户创建一个 IAM 角色。账户 B 的角色信任账户 A，账户 A 的角色使用 OIDC 联合身份验证从集群获取凭证。然后，容器组（pod）使用 Amazon CLI 配置文件将这两个角色链接在一起。

### 步骤 1：在账户 B 中创建目标角色
<a name="_step_1_create_the_target_role_in_account_b"></a>

账户 B（{{444455556666}}）创建一个 IAM 角色，该角色具有账户 A 集群中容器组（pod）所需的权限。账户 B 将所需权限策略附加到此角色，然后添加以下信任策略。

 **账户 B 角色的信任策略**–该策略允许账户 A 的特定 IRSA 角色承担此角色。

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::111122223333:root"
      },
      "Action": "sts:AssumeRole",
      "Condition": {}
    }
  ]
}
```

**重要**  
为遵循最低权限原则，请将 `Principal` ARN 替换为账户 A 中的特定角色 ARN，而不是使用账户根（`arn:aws:iam::111122223333:root`）。使用账户根将允许账户 A 中的*任何* IAM 主体承担此角色。

### 步骤 2：在账户 A 中创建 IRSA 角色
<a name="_step_2_create_the_irsa_role_in_account_a"></a>

账户 A （{{111122223333}}）创建具有信任策略的角色，该策略从使用集群的 OIDC 颁发者地址创建的身份提供者处获取凭证。

 **账户 A 角色的信任策略（OIDC 联合联合身份验证）**–该策略允许 EKS 集群的 OIDC 提供程序为此角色颁发凭证。

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "arn:aws:iam::111122223333:oidc-provider/oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringEquals": {
          "oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:aud": "sts.amazonaws.com"
        }
      }
    }
  ]
}
```

**重要**  
为遵循最低权限原则，请为 `sub` 声明添加 `StringEquals` 条件，以将此角色限定给特定的 Kubernetes 服务账户。在没有 `sub` 条件的情况下，集群中的任何服务账号都可以担任此角色。`sub` 值的格式为 `system:serviceaccount:NAMESPACE:SERVICE_ACCOUNT_NAME `。例如，要将范围限定为 `default` 命名空间中名为 `my-service-account` 的服务账户：  

```
"oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:sub": "system:serviceaccount:default:my-service-account"
```

### 步骤 3：将 AssumeRole 权限附加到账户 A 的角色
<a name="_step_3_attach_the_assumerole_permission_to_account_as_role"></a>

账户 A 将为步骤 2 中创建的角色附加一个权限策略。该策略允许该角色承担账户 B 的角色。

 **账户 A 角色的权限策略**–该策略授予对账户 B 目标角色的 `sts:AssumeRole` 权限。

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": "arn:aws:iam::444455556666:role/account-b-role"
        }
    ]
}
```

### 步骤 4：配置容器组（pod）以链式使用角色
<a name="_step_4_configure_the_pod_to_chain_roles"></a>

容器组（pod）的应用程序代码使用两个配置文件担任账户 B 的角色：`account_b_role` 和 `account_a_role`。`account_b_role` 配置文件使用 `account_a_role` 配置文件作为其源。对于 Amazon CLI，`~/.aws/config` 文件类似于以下内容。

```
[profile account_b_role]
source_profile = account_a_role
role_arn=arn:aws-cn:iam::444455556666:role/account-b-role

[profile account_a_role]
web_identity_token_file = /var/run/secrets/eks.amazonaws.com/serviceaccount/token
role_arn=arn:aws-cn:iam::111122223333:role/account-a-role
```

要为其它 Amazon SDK 指定链接的配置文件，请参考所使用 SDK 的文档。有关更多信息，请参阅[用于在 Amazon 上进行构建的工具](https://www.amazonaws.cn/developer/tools/)。