使用标签控制对 Amazon 资源的访问 - Amazon Identity and Access Management
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

使用标签控制对 Amazon 资源的访问

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

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

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

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

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

然后,您可以创建一个 IAM policy,以根据资源的标签允许或拒绝访问资源。在该策略中,您可以使用标签条件键以控制对任何以下内容的访问:

  • Resource(资源)- 基于 Amazon 服务资源上的标签控制对这些资源的访问。为此,请使用 aws:ResourceTag/key-name 条件键根据附加到资源的标签确定是否允许访问资源。

  • Request(请求)- 控制可以在请求中传递哪些标签。为此,请使用 aws:RequestTag/key-name 条件键,指定可以在请求中传递的标签键值对以用于标记 Amazon 资源。

  • 授权过程的任何部分 - 使用 aws:TagKeys 条件键来控制是否可以在请求中使用特定的标签键。

您可以通过可视化方式创建 IAM policy,也可以使用 JSON,或通过导入现有托管策略来创建。有关详细信息,请参阅使用客户管理型策略定义自定义 IAM 权限

注意

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

控制对 Amazon 资源的访问

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

警告

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

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

{ "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-roe 的用户尝试启动 Amazon EC2 实例,则实例必须标记为 Owner=richard-roeowner=richard-roe。否则,他将被拒绝访问。标签键 Owner 同时匹配 ownerOwner,因为条件键名称不区分大小写。有关更多信息,请参阅 IAM JSON 策略元素:Condition

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

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

在 Amazon 请求期间控制访问

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

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

{ "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"} } } }

根据标签键控制访问

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

我们建议,当您使用策略来通过标签控制访问时,应该使用 aws:TagKeys 条件键。支持标签的 Amazon 服务可能允许您创建多个只有大小写不同的标签键名称,例如使用 stack=productionStack=test 标记 Amazon EC2 实例。在策略条件中,键名称不区分大小写。这意味着,如果您在策略的条件元素中指定 "aws:ResourceTag/TagKey1": "Value1",则条件将匹配名为 TagKey1tagkey1 的资源标签键,但不会同时匹配两者。要防止只有键的大小写形式不同的重复标签,请使用 aws:TagKeys 条件来定义用户可以应用的标签键,或使用带有 Amazon Organizations 的标签策略。有关更多信息,请参阅《Organizations 用户指南》中的标签策略

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

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