

 **帮助改进此页面** 

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

# 向 IAM 用户授予使用 ConfigMap 访问 Kubernetes 的权限
<a name="auth-configmap"></a>

**重要**  
`aws-auth ConfigMap` 已弃用。有关管理 Kubernetes API 访问权限的推荐方法，请参阅[使用 EKS 访问条目向 IAM 用户授予 Kubernetes 访问权限](access-entries.md)。

在 Amazon EKS 控制面板上运行的 [AWS IAM Authenticator for Kubernetes](https://github.com/kubernetes-sigs/aws-iam-authenticator#readme) 支持使用 [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`，创建 Kubernetes `rolebinding` 或 `clusterrolebinding`，名为 `aws-auth ConfigMap` 中指定的 `group`。

**注意**  
有关 Kubernetes 基于角色的访问控制（RBAC）配置的更多信息，请参阅 Kubernetes 文档中的[使用 RBAC 鉴权](https://kubernetes.io/docs/reference/access-authn-authz/rbac/)。

1. 确定 `kubectl` 用来访问集群的凭据。可以在计算机上使用下面的命令查看 `kubectl` 使用的凭据。如果不使用默认路径，请将 *\$1/.kube/config* 替换为 `kubeconfig` 文件的路径。

   ```
   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`，或者可将 IAM 主体映射到其中的 `clusterroles` 和 `clusterrolebindings`。有关这些资源的更多信息，请参阅 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](#configmap-manual) 的步骤。

### 使用 Eksctl 编辑 Configmap
<a name="configmap-eksctl"></a>

1. 您需要在设备或 AWS CloudShell 上安装 `0.215.0` 版或更高版本的 `eksctl` 命令行工具。要安装或更新 `eksctl`，请参阅 `eksctl` 文档中的 [Installation](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-role* 替换为您的角色名称。将 *eks-console-dashboard-full-access-group* 替换为在 Kubernetes `RoleBinding` 或 `ClusterRoleBinding` 对象中指定的组名称。请将 *111122223333* 替换为您的账户 ID。您可以将 *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` 对象中指定的组名称。请将 *111122223333* 替换为您的账户 ID。您可以将 *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)建议您向角色而不是用户授予权限。将用户详细信息添加到 `data` 下 `ConfigMap` 的 `mapUsers` 部分。如果此部分在文件中尚不存在，请添加它。每个条目支持以下参数：
     +  **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 组，以便节点可以自行注册到集群，和映射到可以查看所有集群的所有 Kubernetes 资源的 Kubernetes 组的 `my-console-viewer-role` IAM 角色。有关 `my-console-viewer-role` IAM 角色所需的 IAM 和 Kubernetes 组权限的列表，请参阅 [所需的权限](view-kubernetes-resources.md#view-kubernetes-resources-permissions)。
   + 一个 `mapUsers` 部分，此部分将默认 AWS 账户中的 `admin` IAM 用户映射到 `system:masters` Kubernetes 组，以及映射到可以查看特定命名空间的 Kubernetes 资源的 Kubernetes 组的另一个 AWS 账户的 `my-user` 用户。有关 `my-user` IAM 用户所需的 IAM 和 Kubernetes 组权限的列表，请参阅 [所需的权限](view-kubernetes-resources.md#view-kubernetes-resources-permissions)。

     根据需要添加或删除行并将所有 example values 替换为您自己的值。

     ```
     # 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` 为 IAM 主体添加基于角色的访问控制（RBAC）。如果您尚未启动自行管理的节点并且未将 `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 资源名称（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** – 对于在 AWS 管理控制台 中使用 Amazon EKS 提供的 AWS CloudFormation 模板创建的节点组 

   1. 应用配置。此命令可能需要几分钟才能完成。

      ```
      kubectl apply -f aws-auth-cm.yaml
      ```
**注意**  
如果您收到任何授权或资源类型错误，请参阅故障排除主题中的 [未经授权或访问被拒绝 (`kubectl`)](troubleshooting.md#unauthorized)。

1. 查看节点的状态并等待它们达到 `Ready` 状态。

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

   输入 `Ctrl`\$1`C` 以返回到 Shell 提示符。