

 **帮助改进此页面** 

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

# 配置 ACK 权限
<a name="ack-permissions"></a>

ACK 需要 IAM 权限才能代表您创建和管理 Amazon 资源。本主题将介绍 IAM 如何与 ACK 结合使用，并提供有关为不同使用案例配置权限的指导。

## IAM 如何与 ACK 结合使用
<a name="_how_iam_works_with_ack"></a>

ACK 使用 IAM 角色向 Amazon 进行身份验证并对资源执行操作。向 ACK 提供权限有两种方式：

 **功能角色**：您在创建 ACK 功能时提供的 IAM 角色。默认情况下，所有 ACK 操作都使用此角色。

 **IAM 角色选择器**：可映射到特定命名空间或资源的其他 IAM 角色。这些角色会覆盖其作用域内资源的功能角色。

当 ACK 需要创建或管理资源时，它会决定使用哪个 IAM 角色：

1. 检查 IAMRoleSelector 是否与资源所在的命名空间相匹配

1. 如果找到匹配项，则代入该 IAM 角色

1. 否则，请使用功能角色

这种方式可以实现灵活的权限管理，从简单的单角色设置到复杂的多账户、多团队配置均适用。

## 入门：简单权限设置
<a name="_getting_started_simple_permission_setup"></a>

适用于开发、测试或简单使用案例，您可以将所有必要的服务权限直接添加到功能角色。

此方式适用于以下情况：
+ 您刚开始使用 ACK
+ 所有资源都在同一 Amazon 账户中
+ 由单个团队管理所有 ACK 资源
+ 您信任所有 ACK 用户拥有相同的权限

## 生产最佳实践：IAM 角色选择器
<a name="_production_best_practice_iam_role_selectors"></a>

对于生产环境，请使用 IAM 角色选择器来实现最低权限访问和命名空间级隔离。

使用 IAM 角色选择器时，功能角色只需要 `sts:AssumeRole` 和 `sts:TagSession` 权限即可代入服务特定角色。您无需向功能角色本身添加任何 Amazon 服务权限（如 S3 或 RDS），系统会向功能角色所代入的各个 IAM 角色授予这些权限。

 **选择权限模式**：

在以下情况下，使用**直接权限**（将服务权限添加到功能角色）：
+ 您刚开始使用并希望最简单的设置
+ 所有资源与集群位于同一账户
+ 您有集群范围的管理权限要求
+ 所有团队都可以共享相同的权限

在以下情况下，使用 **IAM 角色选择器**：
+ 跨多个 Amazon 账户管理资源
+ 不同的团队或命名空间需要不同的权限
+ 您需要按命名空间进行精细访问控制
+ 您希望遵循最低权限安全实践

您可以从直接权限开始，随着需求的增长，再迁移到 IAM 角色选择器。

 **为什么要在生产环境中使用 IAM 角色选择器：**
+  **最低权限**：每个命名空间仅获得其所需的权限
+  **团队隔离**：团队 A 不会意外使用团队 B 的权限
+  **更易审计**：清晰映射哪个命名空间使用哪个角色
+  **跨账户支持**：在多个账户中管理资源所必需的功能
+  **关注点分离**：不同的服务或环境使用不同的角色

### 基本 IAM 角色选择器设置
<a name="_basic_iam_role_selector_setup"></a>

 **步骤 1：创建服务特定的 IAM 角色** 

创建具有特定 Amazon 服务权限的 IAM 角色：

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:*"
      ],
      "Resource": "*"
    }
  ]
}
```

配置信任策略，以允许功能角色代入该策略：

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

 **步骤 2：向功能角色授予 AssumeRole 权限** 

向功能角色添加代入该服务特定角色的权限：

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["sts:AssumeRole", "sts:TagSession"],
      "Resource": "arn:aws:iam::111122223333:role/ACK-S3-Role"
    }
  ]
}
```

 **步骤 3：创建 IAMRoleSelector** 

将 IAM 角色映射到命名空间：

```
apiVersion: services.k8s.aws/v1alpha1
kind: IAMRoleSelector
metadata:
  name: s3-namespace-config
spec:
  arn: arn:aws:iam::111122223333:role/ACK-S3-Role
  namespaceSelector:
    names:
      - s3-resources
```

 **步骤 4：在映射的命名空间中创建资源** 

`s3-resources` 命名空间中的资源会自动使用指定的角色：

```
apiVersion: s3.services.k8s.aws/v1alpha1
kind: Bucket
metadata:
  name: my-bucket
  namespace: s3-resources
spec:
  name: my-production-bucket
```

## 多账户管理
<a name="_multi_account_management"></a>

使用 IAM 角色选择器跨多个 Amazon 账户管理资源。

 **步骤 1：创建跨账户 IAM 角色** 

在目标账户（444455556666）中，创建一个信任源账户功能角色的角色：

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

将服务特定权限附加到此角色。

 **步骤 2：授予 AssumeRole 权限** 

在源账户（111122223333）中，允许功能角色代入目标账户角色：

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

 **步骤 3：创建 IAMRoleSelector** 

将跨账户角色映射到命名空间：

```
apiVersion: services.k8s.aws/v1alpha1
kind: IAMRoleSelector
metadata:
  name: production-account-config
spec:
  arn: arn:aws:iam::444455556666:role/ACKTargetAccountRole
  namespaceSelector:
    names:
      - production
```

 **步骤 4：创建资源** 

`production` 命名空间中的资源将在目标账户中创建：

```
apiVersion: s3.services.k8s.aws/v1alpha1
kind: Bucket
metadata:
  name: my-bucket
  namespace: production
spec:
  name: my-cross-account-bucket
```

## 会话标签
<a name="_session_tags"></a>

EKS ACK 功能会自动为所有 Amazon API 请求设置会话标签。这些标签能够通过识别每个请求的来源来实现精细的访问控制和审计。

### 可用的会话标签
<a name="_available_session_tags"></a>

ACK 发出的每个 Amazon API 调用都包含以下会话标签：


| 标签密钥 | 说明 | 
| --- | --- | 
|   `eks:eks-capability-arn`   |  发出请求的 EKS 功能的 ARN  | 
|   `eks:kubernetes-namespace`   |  正在管理的资源的 Kubernetes 命名空间  | 
|   `eks:kubernetes-api-group`   |  资源的 Kubernetes API 组（例如 `s3.services.k8s.aws`）  | 

### 使用会话标签进行访问控制
<a name="_using_session_tags_for_access_control"></a>

您可以在 IAM 策略条件中使用这些会话标签来限制 ACK 可以管理的资源。此操作在基于命名空间的 IAM 角色选择器之外提供了额外的安全层。

 **示例：按命名空间进行限制** 

仅当请求来自 `production` 命名空间时，才允许 ACK 创建 S3 存储桶：

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "s3:CreateBucket",
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "aws:PrincipalTag/eks:kubernetes-namespace": "production"
        }
      }
    }
  ]
}
```

 **示例：按功能进行限制** 

仅允许来自特定 ACK 功能的操作：

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "s3:*",
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "aws:PrincipalTag/eks:eks-capability-arn": "arn:aws:eks:us-west-2:111122223333:capability/my-cluster/ack/my-ack"
        }
      }
    }
  ]
}
```

**注意**  
会话标签与自主管理的 ACK 有所不同，后者默认不设置这些标签。这样便可通过托管功能实现更精细的访问控制。

## 高级 IAM 角色选择器模式
<a name="_advanced_iam_role_selector_patterns"></a>

有关高级配置，例如标签选择器、资源特定角色映射及其他示例，请参阅 [ACK IRSA 文档](https://aws-controllers-k8s.github.io/community/docs/user-docs/irsa/)。

## 后续步骤
<a name="_next_steps"></a>
+  [ACK 概念](ack-concepts.md)：了解 ACK 概念和资源生命周期
+  [ACK 概念](ack-concepts.md)：了解资源接管和删除策略
+  [EKS 功能的安全注意事项](capabilities-security.md)：了解针对功能的安全最佳实践