

 **帮助改进此页面** 

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

# 将访问策略与访问条目关联起来
<a name="access-policies"></a>

您可以为*类型*为 `STANDARD` 的*访问条目*分配一个或多个访问策略。Amazon EKS 会自动向其他类型的访问条目授予在您的集群中正常运行所需的权限。Amazon EKS 访问策略包含 Kubernetes 权限，但不包含 IAM 权限。在将访问策略关联到访问条目之前，请确保您熟悉每个访问策略中包含的 Kubernetes 权限。有关更多信息，请参阅 [检查访问策略权限](access-policy-permissions.md)。如果所有访问策略都不符合您的要求，则不要将访问策略与访问条目相关联。而是为访问条目指定一个或多个*组名称*，然后创建和管理 Kubernetes 基于角色的访问控制对象。有关更多信息，请参阅 [创建访问条目](creating-access-entries.md)。
+ 现有的访问条目。要创建该文件，请参阅 [创建访问条目](creating-access-entries.md)。
+ 具有以下权限的 AWS Identity and Access Management 角色或用户：`ListAccessEntries`、`DescribeAccessEntry`、`UpdateAccessEntry`、`ListAccessPolicies`、`AssociateAccessPolicy` 和 `DisassociateAccessPolicy`。有关更多信息，请参阅《服务授权参考》中的 [Actions defined by Amazon Elastic Kubernetes Service](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonelastickubernetesservice.html#amazonelastickubernetesservice-actions-as-permissions)**。

在将访问策略与访问条目关联之前，请考虑以下要求：
+ 您可以将多个访问策略关联到每个访问条目，但只能将每个策略与一个访问条目关联一次。如果您关联多个访问策略，则访问条目的 IAM 主体拥有所有关联访问策略中包含的所有权限。
+ 您可以将访问策略的范围限定为集群上的所有资源，也可以指定一个或多个 Kubernetes 命名空间的名称。您可以为命名空间名称使用通配符。例如，如果要将访问策略的范围限定为以 `dev-` 开头的所有命名空间，则可以指定 `dev-*` 为命名空间名称。请确保您的集群上存在命名空间，并且拼写与集群上的实际命名空间名称相匹配。Amazon EKS 不会确认您的集群上命名空间的拼写或是否存在。
+ 将访问策略与访问条目关联后，您可以更改访问策略的*访问范围*。如果已将访问策略的范围限定为 Kubernetes 命名空间，则可根据需要为关联添加和移除命名空间。
+ 如果您将访问策略关联到同时指定了*组名称*的访问条目，则 IAM 主体拥有所有关联访问策略中的所有权限。该主体还拥有在指定组名称的任何 Kubernetes `Role` 和 `RoleBinding` 对象中指定的任何 Kubernetes `Role` 或 `ClusterRole` 对象中的所有权限。
+ 如果运行 `kubectl auth can-i --list` 命令，则不会看到访问策略分配的任何 Kubernetes 权限，这些权限与您在运行命令时使用的 IAM 主体的访问条目相关联。只有已经在 Kubernetes `Role` 或 `ClusterRole` 对象中授予 Kubernetes 权限，并且已经将这些权限绑定到为访问条目指定的组名称或用户名时，该命令才会显示这些权限。
+ 如果您在与集群上的 Kubernetes 对象交互时伪装成 Kubernetes 用户或组，例如使用带 `--as username ` 或 `--as-group group-name ` 的 `kubectl` 命令，则表示您强制使用 Kubernetes RBAC 授权。因此，IAM 主体没有与访问条目关联的任何访问策略所分配的权限。IAM 主体伪装的用户或组拥有的唯一 Kubernetes 权限是您在 Kubernetes `Role` 或 `ClusterRole` 对象中向其授予的 Kubernetes 权限，这些权限已绑定到组名称或用户名。要使 IAM 主体拥有相关访问策略中的权限，请不要伪装成 Kubernetes 用户或组。IAM 主体仍将拥有您在 Kubernetes `Role` 或 `ClusterRole` 对象中向其授予的任何权限，这些权限已绑定到为访问条目指定的组名称或用户名。有关更多信息，请参阅 Kubernetes 文档中的[用户伪装](https://kubernetes.io/docs/reference/access-authn-authz/authentication/#user-impersonation)。

您可以使用 AWS 管理控制台 或 AWS CLI 将访问策略与访问条目相关联。

## AWS 管理控制台
<a name="access-associate-console"></a>

1. 打开 [Amazon EKS 控制台](https://console.aws.amazon.com/eks/home#/clusters)。

1. 选择具有要与访问策略关联的访问条目的集群的名称。

1. 选择**访问**选项卡。

1. 如果访问条目的类型为**标准**，则可以关联或取消关联 Amazon EKS **访问策略**。如果您的访问条目类型不是**标准**，则此选项不可用。

1. 选择**关联访问策略**。

1. 对于**策略名称**，选择具有您希望 IAM 主体拥有的权限的策略。要查看每个策略包含的权限，请参阅 [检查访问策略权限](access-policy-permissions.md)。

1. 对于**访问范围**，选择一个访问范围。如果选择**集群**，则访问策略中的权限将授予 IAM 主体以访问所有 Kubernetes 命名空间中的资源。如果选择 **Kubernetes 命名空间**，则可选择**添加新命名空间**。可在显示的**命名空间**字段中，输入集群上 Kubernetes 命名空间的名称。如果您希望 IAM 主体拥有跨多个命名空间的权限，则可以输入多个命名空间。

1. 选择**添加访问策略**。

## AWS CLI
<a name="access-associate-cli"></a>

1. 在您的设备或 AWS CloudShell 上安装和配置 AWS 命令行界面（AWS CLI）的版本 `2.12.3` 或更高版本，或版本 `1.27.160` 或更高版本。要查看当前版本，请使用 `aws --version | cut -d / -f2 | cut -d ' ' -f1`。`yum`、`apt-get` 或适用于 macOS 的 Homebrew 等软件包管理器通常比 AWS CLI 的最新版本落后几个版本。要安装最新版本，请参阅《AWS 命令行界面用户指南》**中的[安装](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html)和[使用 aws configure 快速配置](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-config)。AWS CloudShell 中安装的 AWS CLI 版本也可能比最新版本落后几个版本。要对其进行更新，请参阅《AWS CloudShell 用户指南》**中的[将 AWS CLI 安装到您的主目录](https://docs.aws.amazon.com/cloudshell/latest/userguide/vm-specs.html#install-cli-software)。

1. 查看可用的访问策略。

   ```
   aws eks list-access-policies --output table
   ```

   示例输出如下。

   ```
   ---------------------------------------------------------------------------------------------------------
   |                                          ListAccessPolicies                                           |
   +-------------------------------------------------------------------------------------------------------+
   ||                                           accessPolicies                                            ||
   |+---------------------------------------------------------------------+-------------------------------+|
   ||                                 arn                                 |             name              ||
   |+---------------------------------------------------------------------+-------------------------------+|
   ||  {arn-aws}eks::aws:cluster-access-policy/AmazonEKSAdminPolicy        |  AmazonEKSAdminPolicy         ||
   ||  {arn-aws}eks::aws:cluster-access-policy/AmazonEKSClusterAdminPolicy |  AmazonEKSClusterAdminPolicy  ||
   ||  {arn-aws}eks::aws:cluster-access-policy/AmazonEKSEditPolicy         |  AmazonEKSEditPolicy          ||
   ||  {arn-aws}eks::aws:cluster-access-policy/AmazonEKSViewPolicy         |  AmazonEKSViewPolicy          ||
   |+---------------------------------------------------------------------+-------------------------------+|
   ```

   要查看每个策略包含的权限，请参阅 [检查访问策略权限](access-policy-permissions.md)。

1. 查看您现有的访问条目。将 *my-cluster* 替换为您的集群的名称。

   ```
   aws eks list-access-entries --cluster-name my-cluster
   ```

   示例输出如下。

   ```
   {
       "accessEntries": [
           "arn:aws:iam::111122223333:role/my-role",
           "arn:aws:iam::111122223333:user/my-user"
       ]
   }
   ```

1. 将访问策略与访问条目关联。以下示例将 `AmazonEKSViewPolicy` 访问策略与访问条目关联。每当 *my-role* IAM 角色尝试访问集群上的 Kubernetes 对象时，Amazon EKS 都将授权该角色使用策略中的权限仅访问 *my-namespace1* 和 *my-namespace2* Kubernetes 命名空间中的 Kubernetes 对象。将 *my-cluster* 替换为集群的名称，将 *111122223333* 替换为 AWS 账户 ID，将 *my-role* 替换为您希望 Amazon EKS 授权其访问 Kubernetes 集群对象的 IAM 角色的名称。

   ```
   aws eks associate-access-policy --cluster-name my-cluster --principal-arn arn:aws:iam::111122223333:role/my-role \
       --access-scope type=namespace,namespaces=my-namespace1,my-namespace2 --policy-arn arn:aws:eks::aws:cluster-access-policy/AmazonEKSViewPolicy
   ```

   如果您希望 IAM 主体拥有整个集群的权限，请将 `type=namespace,namespaces=my-namespace1,my-namespace2 ` 替换为 `type=cluster`。如果要将多个访问策略关联到访问条目，请多次运行该命令，每个访问条目都有唯一的访问策略。每个关联的访问策略都有自己的范围。
**注意**  
如果以后要更改关联访问策略的范围，请使用新的范围再次运行前面的命令。例如，如果您想移除 *my-namespace2*，则只能使用 `type=namespace,namespaces=my-namespace1 ` 再次运行该命令。如果要将范围从 `namespace` 更改为 `cluster`，则可以使用 `type=cluster` 再次运行该命令并移除 `type=namespace,namespaces=my-namespace1,my-namespace2 `。

1. 确定哪些访问策略与访问条目关联。

   ```
   aws eks list-associated-access-policies --cluster-name my-cluster --principal-arn arn:aws:iam::111122223333:role/my-role
   ```

   示例输出如下。

   ```
   {
       "clusterName": "my-cluster",
       "principalArn": "arn:aws:iam::111122223333",
       "associatedAccessPolicies": [
           {
               "policyArn": "arn:aws:eks::aws:cluster-access-policy/AmazonEKSViewPolicy",
               "accessScope": {
                   "type": "cluster",
                   "namespaces": []
               },
               "associatedAt": "2023-04-17T15:25:21.675000-04:00",
               "modifiedAt": "2023-04-17T15:25:21.675000-04:00"
           },
           {
               "policyArn": "arn:aws:eks::aws:cluster-access-policy/AmazonEKSAdminPolicy",
               "accessScope": {
                   "type": "namespace",
                   "namespaces": [
                       "my-namespace1",
                       "my-namespace2"
                   ]
               },
               "associatedAt": "2023-04-17T15:02:06.511000-04:00",
               "modifiedAt": "2023-04-17T15:02:06.511000-04:00"
           }
       ]
   }
   ```

   在前面的示例中，此访问条目的 IAM 主体拥有集群上所有命名空间的查看权限，以及对两个 Kubernetes 命名空间的管理员权限。

1. 取消访问策略与访问条目的关联。在此示例中，`AmazonEKSAdminPolicy` 策略与访问条目取消关联。但是，IAM 主体保留 `AmazonEKSViewPolicy` 访问策略中对 *my-namespace1* 和 *my-namespace2* 命名空间中对象的权限，因为该访问策略并未与访问条目取消关联。

   ```
   aws eks disassociate-access-policy --cluster-name my-cluster --principal-arn arn:aws:iam::111122223333:role/my-role \
       --policy-arn arn:aws:eks::aws:cluster-access-policy/AmazonEKSAdminPolicy
   ```

要列出可用的访问策略，请参阅[检查访问策略权限](access-policy-permissions.md)。