

# IAM 教程：将 SAML 会话标签用于 ABAC
<a name="tutorial_abac-saml"></a>

基于属性的访问权限控制 (ABAC) 是一种授权策略，该策略基于属性来定义权限。在 AWS 中，这些属性称为标签。您可以将标签附加到 IAM 资源（包括 IAM 实体（用户和角色））以及 AWS 资源。将实体用于向 AWS 发出请求时，实体成为主体并且包含标签。

您也可以在代入角色或联合身份用户时传递[会话标签](id_session-tags.md)。然后，您可以定义策略，这些策略使用标签条件键来根据主体的标签向其授予权限。当您使用标签控制对 AWS 资源的访问时，可通过对 AWS 策略进行较少更改来实现团队和资源的增长。ABAC 策略比传统 AWS 策略更加灵活，后者需要您列出每个单独的资源。有关 ABAC 及其相对于传统策略的优势的更多信息，请参阅[使用 ABAC 授权根据属性定义权限](introduction_attribute-based-access-control.md)。

如果您的公司使用基于 SAML 的身份提供程序 (IdP) 管理公司用户身份，则可以在 AWS 中使用 SAML 属性进行细粒度访问控制。属性包括成本中心标识符、用户电子邮件地址、部门分类和项目分配等。当您将这些属性作为会话标签传递时，可以根据这些会话标签控制对 AWS 的访问权限。

要通过将 SAML 属性传递给会话主体来完成 [ABAC 教程](tutorial_attribute-based-access-control.md)，请完成 [IAM 教程：根据标签定义访问 AWS 资源的权限](tutorial_attribute-based-access-control.md) 中的任务以及本主题中介绍的更改。

## 先决条件
<a name="tutorial_abac-saml-prerequisites"></a>

要执行将 SAML 会话标签用于 ABAC 的步骤，您必须满足以下条件：
+ 对基于 SAML 的 IdP 的访问权限，您在其中可以创建具有特定属性的测试用户。
+ 能够以具有管理员权限的用户身份登录。
+ 体验在 AWS 管理控制台 中创建和编辑 IAM 用户、角色和策略。但是，如果您需要获得帮助以便记住 IAM 管理过程，请访问 ABAC 教程提供的链接来查看分步说明。
+ 在 IAM 中设置基于 SAML 的 IdP 的经验。要查看详细信息以及指向详细 IAM 文档的链接，请参阅 [使用 AssumeRoleWithSAML 传递会话标签](id_session-tags.md#id_session-tags_adding-assume-role-saml)。

## 步骤 1：创建测试用户
<a name="tutorial_abac-saml-step1"></a>

跳过[步骤 1：创建测试用户](tutorial_attribute-based-access-control.md#tutorial_abac_step1)中的说明。由于您在提供商中定义身份，因此无需为员工添加 IAM 用户。

## 步骤 2：创建 ABAC 策略
<a name="tutorial_abac-saml-step2"></a>

按照 [步骤 2：创建 ABAC 策略](tutorial_attribute-based-access-control.md#tutorial_abac_step2) 中的说明在 IAM 中创建指定的托管策略。

## 步骤 3：创建和配置 SAML 角色
<a name="tutorial_abac-saml-step3"></a>

为 SAML 使用 ABAC 教程时，您必须执行额外的步骤来创建角色、配置 SAML IdP 和启用 AWS 管理控制台 访问权限。有关更多信息，请参阅 [步骤 3：创建角色](tutorial_attribute-based-access-control.md#tutorial_abac_step3)。

### 步骤 3A：创建 SAML 角色
<a name="tutorial_abac-saml-step3a"></a>

创建一个信任 SAML 身份提供程序和在步骤 1 中创建的 `test-session-tags` 用户的角色。ABAC 教程使用具有不同角色标签的单独角色。由于您从 SAML IdP 传递会话标签，因此只需要一个角色。要了解如何创建基于 SAML 的角色，请参阅[创建用于 SAML 2.0 联合身份验证的角色（控制台）](id_roles_create_for-idp_saml.md)。

将角色命名为 `access-session-tags`。将 `access-same-project-team` 权限策略附加到角色。编辑角色信任策略来使用以下策略。有关如何编辑角色的信任关系的详细说明，请参阅[更新角色信任策略](id_roles_update-role-trust-policy.md)。

以下角色信任策略允许您的 SAML 身份提供程序和 `test-session-tags` 用户代入该角色。在代入角色时，他们必须传递三个指定的会话标签。`sts:TagSession` 操作是允许传递会话标签所必需的。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowSamlIdentityAssumeRole",
            "Effect": "Allow",
            "Action": [
                "sts:AssumeRoleWithSAML",
                "sts:TagSession"
            ],
            "Principal": {"Federated":"arn:aws:iam::123456789012:saml-provider/ExampleCorpProvider"},
            "Condition": {
                "StringLike": {
                    "aws:RequestTag/cost-center": "*",
                    "aws:RequestTag/access-project": "*",
                    "aws:RequestTag/access-team": [
                        "eng",
                        "qas"
                    ]
                },
                "StringEquals": {"SAML:aud": "https://signin.aws.amazon.com/saml"}
            }
        }
    ]
}
```

------

`AllowSamlIdentityAssumeRole` 语句允许工程和质量保证团队的成员在从示例公司 IdP 将身份联合到 AWS 中时代入此角色。`ExampleCorpProvider` SAML 提供商在 IAM 中定义。管理员已经设置 SAML 断言以传递三个必需的会话标签。断言可以传递额外的标签，但必须存在这三个标签。身份的属性可以具有 `cost-center` 和 `access-project` 标签的任何值。但是，`access-team` 属性值必须匹配 `eng` 或 `qas`，以指示位于工程或质量保证团队中的身份。

### 步骤 3B：配置 SAML IdP
<a name="tutorial_abac-saml-step3b"></a>

配置您的 SAML IdP 以将 `cost-center`、`access-project` 和 `access-team` 属性作为会话标签传递。有关更多信息，请参阅 [使用 AssumeRoleWithSAML 传递会话标签](id_session-tags.md#id_session-tags_adding-assume-role-saml)。

要将这些属性作为会话标签传递，请在 SAML 断言中包含以下元素。

```
<Attribute Name="https://aws.amazon.com/SAML/Attributes/PrincipalTag:cost-center">
  <AttributeValue>987654</AttributeValue>
</Attribute>
<Attribute Name="https://aws.amazon.com/SAML/Attributes/PrincipalTag:access-project">
  <AttributeValue>peg</AttributeValue>
</Attribute>
<Attribute Name="https://aws.amazon.com/SAML/Attributes/PrincipalTag:access-team">
  <AttributeValue>eng</AttributeValue>
</Attribute>
```

### 步骤 3C：启用控制台访问
<a name="tutorial_abac-saml-step3b"></a>

为联合身份 SAML 用户启用控制台访问权限。有关更多信息，请参阅 [使 SAML 2.0 联合主体能够访问 AWS 管理控制台](id_roles_providers_enable-console-saml.md)。

## 步骤 4：测试创建密钥
<a name="tutorial_abac-saml-step4"></a>

使用 `access-session-tags` 角色联合身份到 AWS 管理控制台中。有关更多信息，请参阅 [使 SAML 2.0 联合主体能够访问 AWS 管理控制台](id_roles_providers_enable-console-saml.md)。然后按照说明 [步骤 4：测试创建密钥](tutorial_attribute-based-access-control.md#tutorial_abac_step4) 创建密钥。使用不同的 SAML 身份，该身份的属性与 ABAC 教程中指示的标签匹配。有关更多信息，请参阅 [步骤 4：测试创建密钥](tutorial_attribute-based-access-control.md#tutorial_abac_step4)。

## 步骤 5：测试查看密钥
<a name="tutorial_abac-saml-step5"></a>

按照[步骤 5：测试查看密钥](tutorial_attribute-based-access-control.md#tutorial_abac_step5)中的说明查看在上一步中创建的密钥。使用不同的 SAML 身份，该身份的属性与 ABAC 教程中指示的标签匹配。

## 步骤 6：测试可扩展性
<a name="tutorial_abac-saml-step6"></a>

按照[步骤 6：测试可扩展性](tutorial_attribute-based-access-control.md#tutorial_abac_step6)中的说明测试可扩展性。要执行此操作，您可在基于 SAML 的 IdP 中添加具有以下属性的新身份：
+ `cost-center = 101010`
+ `access-project = cen`
+ `access-team = eng`

## 步骤 7：测试更新和删除密钥
<a name="tutorial_abac-saml-step7"></a>

按照[步骤 7：测试更新和删除密钥](tutorial_attribute-based-access-control.md#tutorial_abac_step7)中的说明更新和删除密钥。使用不同的 SAML 身份，该身份的属性与 ABAC 教程中指示的标签匹配。

**重要**  
删除您创建的所有密钥以避免产生费用。有关 Secrets Manager 中定价的详细信息，请参阅 [AWS Secrets Manager 定价](https://aws.amazon.com/secrets-manager/pricing/)。

## 摘要
<a name="tutorial-abac-saml-summary"></a>

您现在已成功完成使用 SAML 会话标签和资源标签进行权限管理所需的所有步骤。

**注意**  
您添加的策略仅允许在特定条件下执行操作。如果您将不同的策略应用于具有更广泛权限的用户或角色，则可能不会将操作限制为需要标记。例如，如果您使用 `AdministratorAccess`AWS 托管策略向用户授予完全管理权限，则这些策略不会限制该访问。有关在涉及多个策略时如何确定权限的更多信息，请参阅[AWS 执行代码逻辑如何评估允许或拒绝访问的请求](reference_policies_evaluation-logic_policy-eval-denyallow.md)。