使用标签控制对 AWS 资源的访问 - AWS Identity and Access Management

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

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

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

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

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

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

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

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

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

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

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

注意

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

控制对 AWS 资源的访问

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

警告

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

此示例说明如何创建允许启动或停止 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" } }

在 AWS 请求期间控制访问

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

此示例说明如何创建允许使用 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 条件键。支持标签的 AWS 服务可能允许您创建多个只有大小写不同的标签键名称,例如使用 stack=productionStack=test 标记 Amazon EC2 实例。在策略条件中,键名称不区分大小写。这意味着,如果您在策略的条件元素中指定 "aws:ResourceTag/TagKey1": "Value1",则条件将匹配名为 TagKey1tagkey1 的资源标签键,但不会同时匹配两者。要防止只有键的大小写形式不同的重复标签,请使用 aws:TagKeys 条件来定义用户可以应用的标签键,或使用带有 AWS 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" ] } } }