

 **協助改進此頁面** 

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

若要為本使用者指南貢獻內容，請點選每個頁面右側面板中的**在 GitHub 上編輯此頁面**連結。

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 設定 ACK 許可
<a name="ack-permissions"></a>

ACK 需要 IAM 許可，才能代表您建立和管理 AWS 資源。本主題說明 IAM 如何與 ACK 搭配使用，並提供設定不同使用案例許可的指引。

## IAM 如何與 ACK 搭配使用
<a name="_how_iam_works_with_ack"></a>

ACK 使用 IAM 角色對 資源進行身分驗證 AWS 和執行動作。提供許可給 ACK 的方式有兩種：

 **功能角色**：您在建立 ACK 功能時提供的 IAM 角色。根據預設，所有 ACK 操作都會使用此角色。

 **IAM 角色選取器**：可映射至特定命名空間或資源的其他 IAM 角色。這些角色會覆寫其範圍內資源的功能角色。

當 ACK 需要建立或管理資源時，它會決定要使用的 IAM 角色：

1. 檢查 IAMRoleSelector 是否符合資源的命名空間

1. 如果找到相符項目，請擔任該 IAM 角色

1. 否則，請使用 功能角色

此方法可實現從簡單的單一角色設定到複雜多帳戶、多團隊組態的彈性許可管理。

## 入門：簡易許可設定
<a name="_getting_started_simple_permission_setup"></a>

對於開發、測試或簡單使用案例，您可以將所有必要的服務許可直接新增至功能角色。

此方法在下列情況下運作良好：
+ 您即將開始使用 ACK
+ 所有資源都在同一個 AWS 帳戶中
+ 單一團隊管理所有 ACK 資源
+ 您信任所有 ACK 使用者都具有相同的許可

## 生產最佳實務：IAM 角色選取器
<a name="_production_best_practice_iam_role_selectors"></a>

對於生產環境，請使用 IAM 角色選取器實作最低權限存取和命名空間層級隔離。

使用 IAM 角色選取器時，功能角色只需要 `sts:AssumeRole`和 `sts:TagSession`許可，即可擔任服務特定的角色。您不需要將任何 AWS 服務許可 （例如 S3 或 RDS) 新增至功能角色本身，這些許可會授予功能角色擔任的個別 IAM 角色。

 **在許可模型之間進行選擇**：

在下列情況下使用**直接許可** （將服務許可新增至功能角色）：
+ 您正在開始使用，並想要最簡單的設定
+ 所有資源都與您的叢集位於相同的帳戶
+ 您有全叢集的管理許可要求
+ 所有團隊都可以共用相同的許可

在下列情況下使用 **IAM 角色選取器**：
+ 跨多個 AWS 帳戶管理資源
+ 不同的團隊或命名空間需要不同的許可
+ 您需要每個命名空間的精細存取控制
+ 您想要遵循最低權限的安全實務

您可以從直接許可開始，並在需求增加之後遷移至 IAM 角色選取器。

 **為什麼要在生產環境中使用 IAM 角色選取器：**
+  **最低權限**：每個命名空間只會取得所需的許可
+  **團隊隔離**：團隊 A 不會意外使用團隊 B 的許可
+  **更容易稽核**：明確映射命名空間使用哪個角色
+  **跨帳戶支援**：管理多個帳戶中的資源時需要
+  **問題分離**：不同的服務或環境使用不同的角色

### 基本 IAM 角色選取器設定
<a name="_basic_iam_role_selector_setup"></a>

 **步驟 1：建立服務特定的 IAM 角色** 

建立具有特定 AWS 服務許可的 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 角色選取器來管理多個 AWS 帳戶的資源。

 **步驟 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 功能會自動在所有 AWS API 請求上設定工作階段標籤。這些標籤透過識別每個請求的來源來啟用精細存取控制和稽核。

### 可用的工作階段標籤
<a name="_available_session_tags"></a>

ACK 所做的每個 AWS API 呼叫都會包含下列工作階段標籤：


| 標籤索引鍵 | Description | 
| --- | --- | 
|   `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) - 了解 功能的安全最佳實務