

 **協助改進此頁面** 

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

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

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

# 透過 ConfigMap 授予 IAM 使用者存取 Kubernetes 的權限
<a name="auth-configmap"></a>

**重要**  
`aws-auth ConfigMap` 已棄用。如需管理 Kubernetes API 存取權的建議方法，請參閱 [使用 EKS 存取項目授予 IAM 使用者 Kubernetes 的存取權](access-entries.md)。

[適用於 Kubernetes 的AWS IAM 驗證器](https://github.com/kubernetes-sigs/aws-iam-authenticator#readme)在 Amazon EKS 控制平面上執行，可以使用 [IAM 主體](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html#iam-term-principal)啟用對叢集的存取權。驗證器會從 `aws-auth` `ConfigMap` 獲得其組態資訊。如需所有 `aws-auth` `ConfigMap` 設定的詳細資訊，請參閱 GitHub 上的[完整組態格式](https://github.com/kubernetes-sigs/aws-iam-authenticator#full-configuration-format)。

## 將 IAM 主體新增至 Amazon EKS 叢集
<a name="aws-auth-users"></a>

當您建立 Amazon EKS 叢集時，建立該叢集的 [IAM 主體](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html#iam-term-principal)會由 Amazon EKS 控制平面中叢集的角色型存取控制 (RBAC) 組態來自動授予 `system:masters` 許可。此主體不會出現在任何可見的組態中，因此請務必記下最初建立叢集的主體。若要賦予其他 IAM 主體與叢集互動的能力，您必須編輯 Kubernetes 中的 `aws-auth ConfigMap` 並用 `group` 的名稱建立一個 Kubernetes `rolebinding` 或 `clusterrolebinding`，其名稱是您在 `aws-auth ConfigMap` 中指定的名稱。

**注意**  
如需有關 Kubernetes 角色型存取控制 (RBAC) 組態的詳細資訊，請參閱 Kubernetes 文件中的[使用 RBAC 授權](https://kubernetes.io/docs/reference/access-authn-authz/rbac/)。

1. 判斷 `kubectl` 正使用哪些憑證來存取叢集。您可以在電腦上透過一下命令查看 `kubectl` 正在使用的憑證。如果不使用預設路徑，則使用 `kubeconfig` 檔案的路徑取代 *\$1/.kube/config–*。

   ```
   cat ~/.kube/config
   ```

   範例輸出如下。

   ```
   [...]
   contexts:
   - context:
       cluster: my-cluster.region-code.eksctl.io
       user: admin@my-cluster.region-code.eksctl.io
     name: admin@my-cluster.region-code.eksctl.io
   current-context: admin@my-cluster.region-code.eksctl.io
   [...]
   ```

   在前述範例輸出中，已針對名為 *my-cluster* 的叢集設定名為 *admin* 的使用者的憑證。若該叢集是由這名使用者建立，則其已擁有您叢集的存取權。若叢集不是由此使用者建立，則您需要完成剩餘的步驟，才能為其他 IAM 主體啟用叢集存取權。[IAM 最佳實務](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users.html)建議您將許可授予角色而非使用者。您可以使用以下命令查看目前哪些其他主體可以存取您的叢集：

   ```
   kubectl describe -n kube-system configmap/aws-auth
   ```

   範例輸出如下。

   ```
   Name:         aws-auth
   Namespace:    kube-system
   Labels:       <none>
   Annotations:  <none>
   
   Data
   ====
   mapRoles:
   ----
   - groups:
     - system:bootstrappers
     - system:nodes
     rolearn: arn:aws: iam::111122223333:role/my-node-role
     username: system:node:{{EC2PrivateDNSName}}
   
   
   BinaryData
   ====
   
   Events:  <none>
   ```

   上一個範例是預設的 `aws-auth` `ConfigMap`。只有節點執行個體角色有權存取叢集。

1. 請確定您現有的 Kubernetes `roles` 和 `rolebindings` 或 `clusterroles` 和 `clusterrolebindings` (您可以將 IAM 主體映射至此)。如需有關這些資源的詳細資訊，請參閱 Kubernetes 文件中的[使用 RBAC 授權](https://kubernetes.io/docs/reference/access-authn-authz/rbac/)。

   1. 檢視您現有的 Kubernetes `roles` 或 `clusterroles`。`Roles` 的作用域為 `namespace`，但 `clusterroles` 的作用域限定為叢集。

      ```
      kubectl get roles -A
      ```

      ```
      kubectl get clusterroles
      ```

   1. 檢視先前輸出中傳回的任何 `role` 或 `clusterrole` 的詳細資訊，並確認其具有您希望 IAM 主體在叢集中擁有的許可 (`rules`)。

      將 *role-name* 取代為上一個命令的輸出中傳回的 `role` 名稱。將 *kube-system* 取代為 `role` 的命名空間。

      ```
      kubectl describe role role-name -n kube-system
      ```

      將 *cluster-role-name* 取代為上一個命令的輸出中傳回的 `clusterrole` 名稱。

      ```
      kubectl describe clusterrole cluster-role-name
      ```

   1. 檢視您現有的 Kubernetes `rolebindings` 或 `clusterrolebindings`。`Rolebindings` 的作用域為 `namespace`，但 `clusterrolebindings` 的作用域限定為叢集。

      ```
      kubectl get rolebindings -A
      ```

      ```
      kubectl get clusterrolebindings
      ```

   1. 檢視任何 `rolebinding` 或 `clusterrolebinding` 的詳細資訊，並確認其具有上一步中列為 `roleRef` 的 `role` 或 `clusterrole`，以及為 `subjects` 列出的群組名稱。

      將 *role-binding-name* 取代為上一個命令的輸出中傳回的 `rolebinding` 名稱。將 *kube-system* 取代為 `rolebinding` 的 `namespace`。

      ```
      kubectl describe rolebinding role-binding-name -n kube-system
      ```

      範例輸出如下。

      ```
      apiVersion: rbac.authorization.k8s.io/v1
      kind: RoleBinding
      metadata:
        name: eks-console-dashboard-restricted-access-role-binding
        namespace: default
      subjects:
      - kind: Group
        name: eks-console-dashboard-restricted-access-group
        apiGroup: rbac.authorization.k8s.io
      roleRef:
        kind: Role
        name: eks-console-dashboard-restricted-access-role
        apiGroup: rbac.authorization.k8s.io
      ```

      將 *cluster-role-binding-name* 取代為上一個命令的輸出中傳回的 `clusterrolebinding` 名稱。

      ```
      kubectl describe clusterrolebinding cluster-role-binding-name
      ```

      範例輸出如下。

      ```
      apiVersion: rbac.authorization.k8s.io/v1
      kind: ClusterRoleBinding
      metadata:
        name: eks-console-dashboard-full-access-binding
      subjects:
      - kind: Group
        name: eks-console-dashboard-full-access-group
        apiGroup: rbac.authorization.k8s.io
      roleRef:
        kind: ClusterRole
        name: eks-console-dashboard-full-access-clusterrole
        apiGroup: rbac.authorization.k8s.io
      ```

1. 編輯 `aws-auth` `ConfigMap`。您可以使用例如 `eksctl` 的工具來更新 `ConfigMap`，或者您可以透過編輯來手動更新它。
**重要**  
我們建議您使用 `eksctl` 或其他工具來編輯 `ConfigMap`。如需有關您可使用的其他工具的資訊，請參閱《Amazon EKS 最佳實務指南》中的[使用工具對 aws-authConfigMap 進行變更](https://aws.github.io/aws-eks-best-practices/security/docs/iam/#use-tools-to-make-changes-to-the-aws-auth-configmap)。格式錯誤的 `aws-auth` `ConfigMap`可能會導致您失去叢集存取權。
   + 檢視[使用 eksctl 編輯 configmap](#configmap-eksctl) 的步驟。
   + 檢視[手動編輯 configmap ma](#configmap-manual) 的步驟。

### 使用 Eksctl 編輯 Configmap
<a name="configmap-eksctl"></a>

1. 您需要在裝置`0.215.0`或 AWS CloudShell 上安裝版本 或更新版本的`eksctl`命令列工具。如需有關安裝或更新 `eksctl` 的指示，請參閱 `eksctl` 文件中的[安裝](https://eksctl.io/installation)一節。

1. 在 `ConfigMap` 檢視目前的映射項目。使用您叢集的名稱取代 *my-cluster*。將 *region-code* 取代為您的叢集所在的 AWS 區域。

   ```
   eksctl get iamidentitymapping --cluster my-cluster --region=region-code
   ```

   範例輸出如下。

   ```
   ARN                                                                                             USERNAME                                GROUPS                          ACCOUNT
   arn:aws: iam::111122223333:role/eksctl-my-cluster-my-nodegroup-NodeInstanceRole-1XLS7754U3ZPA    system:node:{{EC2PrivateDNSName}}       system:bootstrappers,system:nodes
   ```

1. 為角色新增映射項目。將 *my-group* 取代為您的角色名稱。將 *eks-console-dashboard-full-access-group* 取代為您的 Kubernetes `RoleBinding` 或 `ClusterRoleBinding` 物件中指定的群組名稱。使用您的帳戶 ID 取代 *111122223333*。您可以將 *admin* 取代為您選擇的任何名稱。

   ```
   eksctl create iamidentitymapping --cluster my-cluster --region=region-code \
       --arn arn:aws: iam::111122223333:role/my-role --username admin --group eks-console-dashboard-full-access-group \
       --no-duplicate-arns
   ```
**重要**  
角色 ARN 不能包含例如 `role/my-team/developers/my-role` 的路徑。ARN 的格式必須是 ` arn:aws: iam::111122223333:role/my-role `。在此範例中，需移除 `my-team/developers/`。

   範例輸出如下。

   ```
   [...]
   2022-05-09 14:51:20 [ℹ]  adding identity "{arn-aws}iam::111122223333:role/my-role" to auth ConfigMap
   ```

1. 為使用者新增映射項目。[IAM 最佳實務](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users.html)建議您將許可授予角色而非使用者。將 *my-user* 取代為您的使用者名稱。將 *eks-console-dashboard-restricted-access-group* 取代為您的 Kubernetes `RoleBinding` 或 `ClusterRoleBinding` 物件中指定的群組名稱。使用您的帳戶 ID 取代 *111122223333*。您可以將 *my-user* 取代為您選擇的任何名稱。

   ```
   eksctl create iamidentitymapping --cluster my-cluster --region=region-code \
       --arn arn:aws: iam::111122223333:user/my-user --username my-user --group eks-console-dashboard-restricted-access-group \
       --no-duplicate-arns
   ```

   範例輸出如下。

   ```
   [...]
   2022-05-09 14:53:48 [ℹ]  adding identity "arn:aws: iam::111122223333:user/my-user" to auth ConfigMap
   ```

1. 再次檢視 `ConfigMap` 中的映射項目。

   ```
   eksctl get iamidentitymapping --cluster my-cluster --region=region-code
   ```

   範例輸出如下。

   ```
   ARN                                                                                             USERNAME                                GROUPS                                  ACCOUNT
   arn:aws: iam::111122223333:role/eksctl-my-cluster-my-nodegroup-NodeInstanceRole-1XLS7754U3ZPA    system:node:{{EC2PrivateDNSName}}       system:bootstrappers,system:nodes
   arn:aws: iam::111122223333:role/admin                                                            my-role                                 eks-console-dashboard-full-access-group
   arn:aws: iam::111122223333:user/my-user                                                          my-user                                 eks-console-dashboard-restricted-access-group
   ```

### 手動編輯 Configmap
<a name="configmap-manual"></a>

1. 開啟 `ConfigMap` 進行編輯。

   ```
   kubectl edit -n kube-system configmap/aws-auth
   ```
**注意**  
若您收到錯誤訊息，指出「`Error from server (NotFound): configmaps "aws-auth" not found`」，請使用[將 aws-auth   ConfigMap 套用至您的叢集](#aws-auth-configmap)中的程序套用庫存 `ConfigMap`。

1. 將您的 IAM 主體新增至 `ConfigMap`。IAM 群組不是 IAM 主體，因此無法新增至 `ConfigMap`。
   +  **新增 IAM 角色 (例如：為[聯合身分使用者](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers.html))**：在 `data` 下位於 `ConfigMap` 中的 `mapRoles` 區段新增角色詳細資訊。若此區段在檔案不存在，則將其新增。每個項目支援以下參數：
     +  **rolearn**：要新增的 IAM 角色之 ARN。此值不能包含路徑。例如，您無法指定 ARN (如 ` arn:aws: iam::111122223333:role/my-team/developers/role-name `)。ARN 需要改為 ` arn:aws: iam::111122223333:role/role-name `。
     +  **username**：Kubernetes 內映射至 IAM 角色的使用者名稱。
     +  **群組**：要將角色映射到的 Kubernetes 群組的群組或清單。群組可以是預設群組，也可以是 `clusterrolebinding` 或 `rolebinding` 中指定的群組。如需詳細資訊，請參閱 Kubernetes 文件中的[預設角色和角色連結](https://kubernetes.io/docs/reference/access-authn-authz/rbac/#default-roles-and-role-bindings)。
   +  **若要新增 IAM 使用者：**[IAM 最佳實務](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users.html)建議您將許可授予角色而非使用者。將使用者詳細資訊新增至 `ConfigMap` 的 `mapUsers` 區段 (在 `data` 下方)。若此區段在檔案不存在，則將其新增。每個項目支援以下參數：
     +  **userarn**：要新增之 IAM 使用者的 ARN。
     +  **username**：Kubernetes 內應設至 IAM 使用者的使用者名稱。
     +  **群組**：要將使用者映射到的 Kubernetes 群組的群組或清單。群組可以是預設群組，也可以是 `clusterrolebinding` 或 `rolebinding` 中指定的群組。如需詳細資訊，請參閱 Kubernetes 文件中的[預設角色和角色連結](https://kubernetes.io/docs/reference/access-authn-authz/rbac/#default-roles-and-role-bindings)。

1. 例如，下列的 YAML 區塊包含：
   + `mapRoles` 區段，將 IAM 節點執行個體映射至 Kubernetes 群組，讓節點可以將自己註冊到叢集，以及 `my-console-viewer-role` IAM 角色，映射至 Kubernetes 群組，可以檢視所有叢集的所有 Kubernetes 資源。如需 `my-console-viewer-role` IAM 角色所需的 IAM 和 Kubernetes 群組許可的清單，請參閱 [所需的許可](view-kubernetes-resources.md#view-kubernetes-resources-permissions)。
   + 將 `admin` IAM 使用者從預設 AWS 帳戶映射至 `system:masters` Kubernetes 群組，以及將`my-user`使用者從映射至可檢視特定命名空間 Kubernetes 資源之 Kubernetes 群組的不同 AWS 帳戶映射的`mapUsers`區段。如需 `my-user` IAM 使用者所需的 IAM 和 Kubernetes 群組許可的清單，請參閱 [所需的許可](view-kubernetes-resources.md#view-kubernetes-resources-permissions)。

     根據需要新增或移除行，並將所有範例值取代為您自己的值。

     ```
     # Please edit the object below. Lines beginning with a '#' will be ignored,
     # and an empty file will abort the edit. If an error occurs while saving this file will be
     # reopened with the relevant failures.
     #
     apiVersion: v1
     data:
       mapRoles: |
         - groups:
           - system:bootstrappers
           - system:nodes
           rolearn: arn:aws: iam::111122223333:role/my-role
           username: system:node:{{EC2PrivateDNSName}}
         - groups:
           - eks-console-dashboard-full-access-group
           rolearn: arn:aws: iam::111122223333:role/my-console-viewer-role
           username: my-console-viewer-role
       mapUsers: |
         - groups:
           - system:masters
           userarn: arn:aws: iam::111122223333:user/admin
           username: admin
         - groups:
           - eks-console-dashboard-restricted-access-group
           userarn: arn:aws: iam::444455556666:user/my-user
           username: my-user
     ```

1. 儲存檔案並結束您的文字編輯器。

## 將 `aws-auth` `ConfigMap` 套用至您的叢集
<a name="aws-auth-configmap"></a>

在建立受管節點群組或以 `eksctl` 建立節點群組時，便會自動建立並套用 `aws-auth` `ConfigMap` 至您的叢集。最初建立的目的是要允許將節點加入您的叢集，但您也可以使用此 `ConfigMap` 來新增角色型存取控制 (RBAC) 以存取 IAM 主體。若尚未啟動自我管理節點且尚未套用 `aws-auth` `ConfigMap` 至叢集，則您可以使用以下程序來完成此操作。

1. 檢查您是否已套用 `aws-auth` `ConfigMap`。

   ```
   kubectl describe configmap -n kube-system aws-auth
   ```

   若您收到錯誤訊息，指出 "`Error from server (NotFound): configmaps "aws-auth" not found`"，請使用以下步驟的程序來套用儲存的 `ConfigMap`。

1. 下載、編輯和套用 AWS 驗證器組態映射。

   1. 下載組態對應。

      ```
      curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/cloudformation/2020-10-29/aws-auth-cm.yaml
      ```

   1. 在 `aws-auth-cm.yaml` 檔案中，將 `rolearn` 設定至與您節點關聯的 IAM 角色之 Amazon Resource Name (ARN)。您可以使用文字編輯器來完成此操作，或者透過取代 *my-node-instance-role* 並執行下列命令：

      ```
      sed -i.bak -e 's|<ARN of instance role (not instance profile)>|my-node-instance-role|' aws-auth-cm.yaml
      ```

      請勿修改此檔案中的任何其他行。
**重要**  
角色 ARN 不能包含例如 `role/my-team/developers/my-role` 的路徑。ARN 的格式必須是 ` arn:aws: iam::111122223333:role/my-role `。在此範例中，需移除 `my-team/developers/`。

      您可以檢查節點群組的 AWS CloudFormation 堆疊輸出，並尋找下列值：
      +  **InstanceRoleARN**：適用於以 `eksctl` 建立的節點群組 
      +  **NodeInstanceRole** – 適用於使用 中的 Amazon EKS vended AWS CloudFormation 範本建立的節點群組 AWS 管理主控台 

   1. 套用組態。此命令可能需要幾分鐘的時間來完成。

      ```
      kubectl apply -f aws-auth-cm.yaml
      ```
**注意**  
如果您收到任何授權或資源類型錯誤，請參閱故障診斷主題中的[未經授權或存取遭拒 (`kubectl`)](troubleshooting.md#unauthorized)。

1. 查看節點的狀態，並等待他們到達 `Ready` 狀態。

   ```
   kubectl get nodes --watch
   ```

   輸入 `Ctrl`\$1`C` 傳回 Shell 提示。