

# 使用标签控制对 Amazon 资源的访问
<a name="access_tags"></a>

您可以使用标签以控制对支持标记的 Amazon 资源（包括 IAM 资源）的访问。您可以标记 IAM 用户和角色以控制他们可以访问哪些内容。要了解如何标记 IAM 用户和角色，请参阅 [Amazon Identity and Access Management 资源的标签](id_tags.md)。此外，您还可以控制对以下 IAM 资源的访问：客户托管策略、IAM 身份提供程序、实例配置文件、服务器证书和虚拟 MFA 设备。对于创建策略，以允许具有主体标签的 IAM 角色访问具有匹配标签的资源并测试该策略，有关教程，请参阅 [IAM 教程：根据标签定义访问 Amazon 资源的权限](tutorial_attribute-based-access-control.md)。可以使用以下部分中的信息以控制对其他 Amazon 资源（包括 IAM 资源）的访问，而无需标记 IAM 用户或角色。

在使用标签控制对 Amazon 资源的访问之前，您必须了解 Amazon 如何授予访问权限。Amazon 由一组*资源* 组成。Amazon EC2 实例是一种资源。Amazon S3 存储桶是一种资源。您可以使用 Amazon API、Amazon CLI 或 Amazon Web Services 管理控制台 执行操作，例如，在 Amazon S3 中创建存储桶。在执行操作时，您将发送该操作的*请求*。您的请求指定操作、资源、*主体实体*（用户或角色)、*主体账户* 以及所需的任何请求信息。所有这些信息提供了*上下文*。

Amazon然后， 检查是否对您（主体实体）进行身份验证（登录）和授权（具有权限），以便对指定的资源执行指定的操作。在授权期间，Amazon 检查应用于请求上下文的所有策略。大多数策略作为 [JSON 文档](access_policies.md#access_policies-json)存储在 Amazon 中，并指定主体实体的权限。有关策略类型和用法的更多信息，请参阅[Amazon Identity and Access Management 中的策略和权限](access_policies.md)。

只有在策略允许请求的每个部分时，Amazon 才会授权该请求。要查看示意图和详细了解 IAM 基础设施，请参阅 [IAM 的工作原理](intro-structure.md)。有关 IAM 如何确定是否允许请求的详细信息，请参阅 [策略评估逻辑](reference_policies_evaluation-logic.md)。

标签是此过程中的另一个考虑事项，因为标签可以附加到*资源*，也可以从*请求* 传入支持标签的服务。要基于标签控制访问，您需要在策略的[条件元素](reference_policies_elements_condition.md)中提供标签信息。要了解 Amazon 服务是否支持使用标签控制访问权限，请参阅 [使用 IAM 的 Amazon 服务](reference_aws-services-that-work-with-iam.md) 并查找在 **ABAC** 列中为**是**的服务。选择服务名称以查看该服务的授权和访问控制文档。

然后，您可以创建一个 IAM policy，以根据资源的标签允许或拒绝访问资源。在该策略中，您可以使用标签条件键以控制对任何以下内容的访问：
+ **[Resource](#access_tags_control-resources)**（资源）- 基于 Amazon 服务资源上的标签控制对这些资源的访问。为此，请使用 **aws:ResourceTag/*key-name*** 条件键根据附加到资源的标签确定是否允许访问资源。
+ **[Request](#access_tags_control-requests)**（请求）- 控制可以在请求中传递哪些标签。为此，请使用 **aws:RequestTag/*key-name*** 条件键，指定可以在请求中传递的标签键值对以用于标记 Amazon 资源。
+ **[授权过程的任何部分](#access_tags_control-tag-keys)** - 使用 **aws:TagKeys** 条件键来控制是否可以在请求中使用特定的标签键。

您可以通过可视化方式创建 IAM policy，也可以使用 JSON，或通过导入现有托管策略来创建。有关更多信息，请参阅 [使用客户管理型策略定义自定义 IAM 权限](access_policies_create.md)。

**注意**  
如果用户有权使用创建资源的操作，则某些服务允许用户在创建资源时指定标签。

## 控制对 Amazon 资源的访问
<a name="access_tags_control-resources"></a>

您可以使用 IAM policy 中的条件根据 Amazon 资源上的标签控制对该资源的访问。您可以使用全局 `aws:ResourceTag/tag-key` 条件键或服务特定的键执行该操作。某些服务仅支持此键的服务特定版本，而不支持全局版本。

**警告**  
请勿试图通过标记角色然后在带有 `iam:PassRole` 操作的策略中使用 `ResourceTag` 条件键来控制谁可以传递角色。这种方法没有可靠的结果。有关将角色传递给服务所需的权限的更多信息，请参阅[向用户授予权限以将角色传递给 Amazon 服务](id_roles_use_passrole.md)。

 此示例说明如何创建允许启动或停止 Amazon EC2 实例的基于身份的策略。只有在实例标签 `Owner` 具有该用户的用户名值时，才允许执行这些操作。此策略定义了程序访问和控制台访问的权限。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ec2:StartInstances",
                "ec2:StopInstances"
            ],
            "Resource": "arn:aws:ec2:*:*:instance/*",
            "Condition": {
                "StringEquals": {"aws:ResourceTag/Owner": "${aws:username}"}
            }
        },
        {
            "Effect": "Allow",
            "Action": "ec2:DescribeInstances",
            "Resource": "*"
        }
    ]
}
```

------

您可以将该策略附加到您账户中的 IAM 用户。如果名为 `richard` 的用户尝试启动 Amazon EC2 实例，则实例必须标记为 `Owner=richard` 或 `owner=richard`。否则，他将被拒绝访问。标签键 `Owner` 同时匹配 `owner` 和 `Owner`，因为条件键名称不区分大小写。有关更多信息，请参阅 [IAM JSON 策略元素：Condition](reference_policies_elements_condition.md)。

此示例说明了如何创建基于身份的策略，该策略使用了资源 ARN 中的 `team` 主体标签。该策略授予删除 Amazon Simple Queue Service 队列的权限，但前提是队列名称以团队名称开头，后跟 `-queue`。例如，如果 `qa` 是 `team` 主体标签的团队名称，则队列名称为 `qa-queue`。

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

****  

```
{
      "Version":"2012-10-17",		 	 	 
      "Statement": {
        "Sid": "AllQueueActions",
        "Effect": "Allow",
        "Action": "sqs:DeleteQueue",
        "Resource": "arn:aws:sqs:us-east-2:111122223333:${aws:PrincipalTag/team}-queue"
      }
}
```

------

## 在 Amazon 请求期间控制访问
<a name="access_tags_control-requests"></a>

您可以在 IAM 策略中使用条件以控制可在对 Amazon 资源应用标签的请求中传递哪些标签键值对。

此示例说明如何创建允许使用 Amazon EC2 `CreateTags` 操作将标签附加到实例的基于身份的策略。只有在标签包含 `environment` 键和 `preprod` 或 `production` 值时，才能附加标签。如果需要，您可以将 `ForAllValues` 修饰符与 `aws:TagKeys` 条件键一起使用，以指示仅允许在请求中使用 `environment` 键。这将阻止用户包括其他键，例如意外使用 `Environment` 而不是 `environment`。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": {
        "Effect": "Allow",
        "Action": "ec2:CreateTags",
        "Resource": "arn:aws:ec2:*:*:instance/*",
        "Condition": {
            "StringEquals": {
                "aws:RequestTag/environment": [
                    "preprod",
                    "production"
                ]
            },
            "ForAllValues:StringEquals": {"aws:TagKeys": "environment"}
        }
    }
}
```

------

## 根据标签键控制访问
<a name="access_tags_control-tag-keys"></a>

您可以在 IAM policy 中使用条件来控制是否可以在请求中使用特定标签键。

我们建议，当您使用策略来通过标签控制访问时，应该使用 [`aws:TagKeys` 条件键](reference_policies_condition-keys.md#condition-keys-tagkeys)。支持标签的 Amazon 服务可能允许您创建多个只有大小写不同的标签键名称，例如使用 `stack=production` 和 `Stack=test` 标记 Amazon EC2 实例。在策略条件中，键名称不区分大小写。这意味着，如果您在策略的条件元素中指定 `"aws:ResourceTag/TagKey1": "Value1"`，则条件将匹配名为 `TagKey1` 或 `tagkey1` 的资源标签键，但不会同时匹配两者。要防止只有键的大小写形式不同的重复标签，请使用 `aws:TagKeys` 条件来定义用户可以应用的标签键，或使用带有 Amazon Organizations 的标签策略。有关更多信息，请参阅*《Amazon Organizations 用户指南》*中的[标签策略](https://docs.amazonaws.cn/organizations/latest/userguide/orgs_manage_policies_tag-policies.html)。

此示例说明了如何创建允许创建 Secrets Manager 密钥及将其贴标签的基于身份的策略，但仅限于标签密钥 `environment` 或 `cost-center`。`Null` 条件可确保在请求中没有标签时，条件的计算结果为 `false`。

```
{
        "Effect": "Allow",
        "Action": [
            "secretsmanager:CreateSecret",
            "secretsmanager:TagResource"
        ],
        "Resource": "*",
        "Condition": {
            "Null": {
                "aws:TagKeys": "false"
            },
            "ForAllValues:StringEquals": {
                "aws:TagKeys": [
                    "environment",
                    "cost-center"
                ]
            }
        }
}
```