

# 使用 ABAC 授权根据属性定义权限
<a name="introduction_attribute-based-access-control"></a>

基于属性的访问权限控制（ABAC）是一种授权策略，该策略基于属性来定义权限。AWS 将这些属性称为*标签*。您可以将标签附加到 IAM 资源（包括 IAM 实体（IAM 用户和 IAM 角色））以及 AWS 资源。您可以为 IAM 委托人创建单个 ABAC 策略或者一小组策略。您可以将这些 ABAC 策略设计为在主体的标签与资源标签匹配时允许操作。ABAC 的属性系统既提供高级用户上下文，又提供精细的访问控制。由于 ABAC 是基于属性的，因此它可以对数据或应用程序执行动态授权，从而实时授予或撤销访问权限。ABAC 在扩展环境中以及身份或资源策略管理变得复杂的情况下非常有用。

例如，您可以创建具有 `access-project` 标签键的三个 IAM 角色。将第一个 IAM 角色的标签值设置为 `Heart`，第二个为 `Star`，第三个为 `Lightning`。然后，您可以使用单个策略，在 IAM 角色和 AWS 资源具有标签值 `access-project` 时允许访问。有关演示如何在 AWS 中使用 ABAC 的详细教程，请参阅[IAM 教程：根据标签定义访问 AWS 资源的权限](tutorial_attribute-based-access-control.md)。要了解支持 ABAC 的服务，请参阅 [使用 IAM 的 AWS 服务](reference_aws-services-that-work-with-iam.md)。

![\[下图说明应用于主体的标签必须与应用于资源的标签相匹配，才能向用户授予该资源的权限。标签可应用于 IAM 组、资源组、个人用户和单个资源。\]](http://docs.aws.amazon.com/zh_cn/IAM/latest/UserGuide/images/tutorial-abac-concept-23.png)


## ABAC 与传统 RBAC 模型的比较
<a name="introduction_attribute-based-access-control_compare-rbac"></a>

IAM 中使用的传统授权模型是基于角色的访问控制（RBAC）。RBAC 根据用户的工作职能（或称*角色*）定义权限，这与 IAM 角色不同。IAM 确实包含[任务函数的管式策略](access_policies_job-functions.md)，能够将权限分配给 RBAC 模型中的任务函数。

在 IAM 中，您通过为不同工作职能创建不同策略来实施 RBAC。然后，您可将策略附加到身份（IAM 用户、IAM 组或 IAM 角色）。作为[最佳实践](best-practices.md)，您向工作职能授予所需的最小权限。这会导致[最低权限](best-practices.md#grant-least-privilege)访问。每个工作职能策略都列出了分配给该策略的身份可以访问的特定资源。使用传统 RBAC 模型的缺点是，当您或您的用户向您的环境添加新资源时，您必须更新策略以允许访问这些资源。

例如，假设您的员工在处理三个项目，名为 `Heart`、`Star` 和 `Lightning`。您可以为每个项目创建一个 IAM 角色。然后，您将策略附加到各个 IAM 角色，定义允许担任该 IAM 角色的任何用户可以访问的资源。如果员工更换了公司中的工作，您可向其分配不同的 IAM 角色。您可以将用户或计划分配给多个 IAM 角色。但是，`Star` 项目可能需要额外的资源，例如新的 Amazon EC2 容器。在这种情况下，您必须更新附加到 `Star` IAM 角色的策略，来指定新的容器资源。否则，系统将不允许 `Star` 项目成员访问新的容器。

![\[下图说明基于角色的访问控制要求为每个身份分配一个基于工作职能的特定策略来访问不同的资源。\]](http://docs.aws.amazon.com/zh_cn/IAM/latest/UserGuide/images/tutorial-abac-rbac-concept-23.png)


**相比传统 RBAC 模型，ABAC 具备以下优势：**
+ **ABAC 权限随着创新扩展。**它不再需要管理员更新现有策略以允许对新资源的访问。例如，假设您使用 `access-project` 标签指定了 ABAC 策略。开发人员使用 `access-project` = `Heart` 标签的 IAM 角色。当 `Heart` 项目中的员工需要额外的 Amazon EC2 资源时，开发人员可以使用 `access-project` = `Heart` 标签创建新 Amazon EC2 实例。这样，`Heart` 项目中的任何员工可以启动和停止这些实例，因为其标签值匹配。
+ **ABAC 需要较少的策略。**由于您无需为不同工作职能创建不同策略，需要创建的策略数量减少。这些策略更易于管理。
+ **使用 ABAC，团队可以动态响应变化和增长。**由于新资源的权限是根据属性自动授予的，因此您无需为身份手动分配策略。例如，如果您的公司已经使用 ABAC 支持 `Heart` 和 `Star` 项目，则可以轻松地添加新 `Lightning` 项目。IAM 管理员创建具有 `access-project` = `Lightning` 标签的新 IAM 角色。无需更改策略以支持新项目。有权担任该 IAM 角色的任何用户可以创建和查看使用 `access-project` = `Lightning` 标记的实例。另一种情况是团队成员从 `Heart` 项目转到 `Lightning` 项目。为了向团队成员提供 `Lightning` 项目的访问权限，IAM 管理员将其分配给不同的 IAM 角色。无需更改权限策略。
+ **使用 ABAC 可以实现精细权限。**在您创建策略时，最佳实践是[授予最小权限](best-practices.md#grant-least-privilege)。使用传统 RBAC 时，您可编写允许访问特定资源的策略。但使用 ABAC 时，如果资源的标签与主体的标签匹配，则可以允许对所有资源执行操作。
+ **通过 ABAC 使用来自您公司目录的员工属性。**您可以配置 SAML 或 OIDC 提供商，以将会话标签传递给 IAM。当您的员工希望在 AWS 中进行联合身份验证时，IAM 会将其属性应用于其最终的主体。然后，您可以使用 ABAC 来允许或拒绝基于这些属性的权限。

有关演示如何在 AWS 中使用 ABAC 的详细教程，请参阅[IAM 教程：根据标签定义访问 AWS 资源的权限](tutorial_attribute-based-access-control.md)。