AWS Identity and Access Management
用户指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 Amazon AWS 入门

IAM 策略元素:变量

介绍

在 IAM 策略中,您可通过很多操作为要控制其访问权限的特定资源指定名称。例如,以下策略允许用户David在 Amazon S3 存储桶中mybucket列出、读取和写入具有前缀的对象。

{ "Version": "2012-10-17", "Statement": [ { "Action": ["s3:ListBucket"], "Effect": "Allow", "Resource": ["arn:aws-cn:s3:::mybucket"], "Condition": {"StringLike": {"s3:prefix": ["David/*"]}} }, { "Action": [ "s3:GetObject", "s3:PutObject" ], "Effect": "Allow", "Resource": ["arn:aws-cn:s3:::mybucket/David/*"] } ] }

在某些情况下,您在编写策略时可能不知道资源的精确名称。您可能需要概括策略,这样无需为每个用户制作策略的唯一副本即可将该策略用于很多用户。例如,要编写策略,允许每位用户在 Amazon S3 存储桶中都可访问自己的对象,如上例所示。然而,您想要创建适用于组中任何用户的单个组策略,而不是为每位用户创建单独的策略,明确指定用户的名称作为资源的一部分。

您可以通过使用策略变量实现这一点,该功能可让您在策略中指定占位符。当评估策略时,策略变量将被替换为来自请求本身上下文中的值。

以下示例显示了使用策略变量的 Amazon S3 存储段的策略。

{ "Version": "2012-10-17", "Statement": [ { "Action": ["s3:ListBucket"], "Effect": "Allow", "Resource": ["arn:aws-cn:s3:::mybucket"], "Condition": {"StringLike": {"s3:prefix": ["${aws:username}/*"]}} }, { "Action": [ "s3:GetObject", "s3:PutObject" ], "Effect": "Allow", "Resource": ["arn:aws-cn:s3:::mybucket/${aws:username}/*"] } ] }

评估该策略时,IAM 将 ${aws:username} 变量替换为当前实际用户便于记忆的名称。这意味着,如果使用用户名称作为资源名称的一部分,适用于一组用户的单个策略可以用来控制对存储桶的访问。

该变量使用 $ 前缀标记,后跟一对大括号 ({ })。在 ${ } 字符内,可以包含想要在策略中使用的请求中的值名称。本页稍后将讨论您可以使用的值。

注意

为了使用策略变量,您必须在声明中包含 Version 元素,而且版本必须设置为支持策略变量的版本。变量是在 2012-10-17 版本中引入的。较早版本的策略语言不支持策略变量。如果您未添加 Version 元素,且没有将它设为相应的版本日期,则系统会将变量 (如 ${aws:username}) 视为策略中的文字字符串。

Version 策略元素与策略版本不同。Version 策略元素用在策略之中,用于定义策略语言的版本。另一方面,当您对 IAM 中的客户托管策略进行更改时,将创建一个策略版本。已更改的策略不会覆盖现有策略。而是由 IAM 创建新的托管策略版本。要了解有关 Version 策略元素的更多信息,请参阅IAM JSON 策略元素: Version。要了解有关策略版本的更多信息,请参阅IAM 策略版本控制

您可以通过类似方式使用策略变量来允许每个用户管理自己的访问密钥。允许用户以编程方式更改用户 David 的访问密钥的策略如下所示:

{ "Version": "2012-10-17", "Statement": [{ "Action": ["iam:*AccessKey*"], "Effect": "Allow", "Resource": ["arn:aws-cn:iam::ACCOUNT-ID-WITHOUT-HYPHENS:user/David"] }] }

如果此策略附加到 用户 David,那么该用户可以更改自己的访问密钥。对于访问特定用户的 Amazon S3 对象的策略,您必须为每位用户创建包含用户名称的单独的策略,然后将每个策略附加到各个用户。

通过使用策略变量,您可以创建如下所示的策略:

{ "Version": "2012-10-17", "Statement": [{ "Action": ["iam:*AccessKey*"], "Effect": "Allow", "Resource": ["arn:aws-cn:iam::ACCOUNT-ID-WITHOUT-HYPHENS:user/${aws:username}"] }] }

当您将策略变量用于这样的用户名称时,不必为每个单独的用户创建单独的策略。您可以改为将新策略附加到 IAM 组,该组包含应允许管理自己的访问密钥的每个人。当用户发出修改其访问密钥的请求时,IAM 将使用当前请求中的用户名称替代 ${aws:username} 变量并评估策略。

您可以使用策略变量的位置

您可以在 Resource 元素中和 Condition 元素的字符串比较中使用策略变量。

资源元素

策略变量可以显示在标识资源的 ARN 的最后部分。以下策略可以关联到组。它给予 群组中的每位用户以编程方式访问 Amazon S3 中特定用户的数据元 (自己的“主目录”) 的完全权限。

{ "Version": "2012-10-17", "Statement": [ { "Action": ["s3:ListBucket"], "Effect": "Allow", "Resource": ["arn:aws-cn:s3:::mybucket"], "Condition": {"StringLike": {"s3:prefix": ["${aws:username}/*"]}} }, { "Action": [ "s3:GetObject", "s3:PutObject" ], "Effect": "Allow", "Resource": ["arn:aws-cn:s3:::mybucket/${aws:username}/*"] } ] }

注意

此示例使用 aws:username 键,它将返回用户的易记名称 (比如“Adele”或“David”)。在某些情况下,您可能想要改用 aws:userid 键,它是全局唯一的值。有关更多信息,请参阅 唯一 ID

以下策略可用于 IAM 组。它让该组中的用户能够创建、使用和删除包含其名称以及位于 us-west-2 区域中的队列。

{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": "sqs:*", "Resource": "arn:aws-cn:sqs:us-west-2:*:${aws:username}-queue" }] }

条件元素

策略变量也可以用于涉及字符串操作符 (StringEqualsStringLikeStringNotLike 等) 的任何条件中的 Condition 值。或 ARN 运算符 (ArnEqualsArnLike 等) 的任何条件中的 Condition 值。以下 Amazon SNS 主题策略让 AWS 账户 999999999999 中的用户能够管理该主题 (执行所有适用操作),前提是 URL 与其 AWS 用户名称相匹配。

{ "Version": "2012-10-17", "Statement": [{ "Principal": {"AWS": "999999999999"}, "Effect": "Allow", "Action": "sns:*", "Condition": {"StringLike": {"sns:endpoint": "https://example.com/${aws:username}/*"}} }] }

可以用于策略变量的请求信息

可以取代策略变量的值必须来自当前请求上下文

在所有请求中可用的信息

策略包含您可以使用其值作为策略变量的键。(某些情况下,键不包含值;请参阅此列表后的信息。)

  • aws:CurrentTime 这可用于检查日期和时间的条件。

  • aws:EpochTime 这是用纪元或 UNIX 时间表示的日期,用于日期/时间条件。

  • aws:TokenIssueTime 这是颁发临时安全凭证的日期和时间,可用于日期/时间条件。注意:此键仅在使用临时安全凭证签名的请求中可用。有关临时安全凭证的更多信息,请参阅临时安全凭证

  • aws:principaltype 此值表示委托人是账户用户、联合身份用户还是代入的角色 - 请参阅后面的解释。

  • aws:SecureTransport 这是一个布尔值,该值指示是否已使用 SSL 发送请求。

  • aws:SourceIp 这是请求者的 IP 地址,用于 IP 地址条件。有关 SourceIp 何时有效以及何时应该改用 VPC 特定键的信息,请参阅IP 地址条件运算符

  • aws:UserAgent 此值是一个字符串,包含有关请求者的客户端应用程序的信息。

  • aws:userid 此值是当前用户的唯一 ID - 参见下图。

  • aws:username 这是一个包含当前用户的友好名称的字符串 - 参见下图。

  • ec2:SourceInstanceARN 这是从中发起请求的 Amazon EC2 实例的 Amazon 资源名称 (ARN)。仅在请求来自使用与 EC2 实例配置文件关联的 IAM 角色的 Amazon EC2 实例时,才提供此键。

重要

密钥名称不区分大小写。例如,aws:CurrentTime 等同于 AWS:currenttime

aws:usernameaws:useridaws:principaltype 取决于哪种类型的委托人发起的请求 – 请求是使用 AWS 账户、IAM 用户还是 IAM 角色等的证书创建的。以下显示了用于不同类型委托人的键的值。

委托人 aws:username aws:userid aws:principaltype
AWS 账户 (不存在) AWS 账户 ID Account
IAM 用户 IAM 用户名称 唯一 ID User
联合身份用户 (不存在) 账户:调用方指定的名称 FederatedUser
Web 联合用户 (Amazon、Amazon Cognito、Facebook、Google 登录名)

有关在使用 Web 联合身份验证时可用的策略键的信息,请参阅使用 Web 联合身份验证识别用户的身份

(不存在)

角色 ID:调用方指定的角色名称

其中,角色 ID 是角色的唯一 ID,调用方指定的角色名称由传递给 AssumeRoleWithWebIdentity 请求的 RoleSessionName parameter 指定。

AssumedRole
SAML 联合身份用户

有关在使用 SAML 联合身份验证时可用的策略键的信息,请参阅唯一标识基于 SAML 的联合中的用户

(不存在)

角色 ID:调用方指定的角色名称

其中,角色 ID 是角色的唯一 ID,调用方指定的角色名称由 Name 属性设置为 https://aws.amazon.com/SAML/attributes/RoleSessionName 的 Attribute 元素指定。

AssumedRole
代入的角色 (不存在)

角色 ID:调用方指定的角色名称

其中,角色 ID 是角色的唯一 ID,调用方指定的角色名称由传递给 AssumeRole 请求的 RoleSessionName parameter 指定。

AssumedRole
分配给 Amazon EC2 实例的角色 (不存在)

角色 ID:EC2 实例 ID

其中角色 ID 是角色的唯一 ID,EC2 实例 ID 是 EC2 实例的唯一标识符

AssumedRole
匿名调用方 (仅 Amazon SQS、Amazon SNS 和 Amazon S3) (不存在) (不存在) Anonymous

在此表中:

  • 不存在表示值不在当前请求信息中,且任何匹配该值的尝试都将失败并导致请求被拒绝。

  • role-id 是在创建时分配给每个角色的唯一标识符。可以使用 AWS CLI 命令显示角色 ID:aws iam get-role --role-name rolename

  • caller-specified-namecaller-specified-role-name 是进行调用以获取临时凭证时调用进程 (例如应用程序或服务) 传递的名称。

  • ec2-instance-id 是在实例启动时分配给它的值,显示在 Amazon EC2 控制台的 Instances (实例) 页面上。您还可以通过运行 AWS CLI 命令来显示实例 ID:aws ec2 describe-instances

联合身份用户的请求中的可用信息

联合身份用户是使用系统而不是 IAM 验证的用户。例如,公司可能拥有调用 AWS 的供内部使用的应用程序。为使用该应用程序的每位公司用户都提供 IAM 身份可能不现实。相反,该公司可能使用具有单一 IAM 身份的代理 (中间层) 应用程序,或该公司可能使用 SAML 身份提供商 (IdP)。代理应用程序或 SAML IdP 会使用企业网络对单个用户进行身份验证。然后,代理应用程序可使用其 IAM 身份获取单个用户的临时安全凭证;SAML IdP 可以将身份信息交换为 AWS 临时安全凭证。然后,临时凭证即可用于访问 AWS 资源。

类似地,您可以创建用于移动设备的应用程序,该应用程序需要访问 AWS 资源。在这种情况下,您可以使用 Web 联合身份验证,其中应用程序使用知名身份提供商 (如 Login with Amazon、Amazon Cognito,Facebook 或 Google) 对用户进行身份验证。随后,应用程序可以使用这些提供商提供的用户身份验证信息来获取访问 AWS 资源的临时安全凭证。

使用 Web 联合身份验证的推荐方法是利用 Amazon Cognito 和 AWS 移动软件开发工具包。有关更多信息,请参阅下列内容:

特定服务的信息

请求还可以在其请求上下文中包含特定服务的键和值。示例包括:

  • s3:prefix

  • s3:max-keys

  • s3:x-amz-acl

  • sns:Endpoint

  • sns:Protocol

有关您可以用来获取策略变量值的特定服务键的信息,请参考与单个服务相关的文档。例如,请参阅以下主题:

特殊字符

有几个特殊预定义策略变量具有固定值,可用于表示字符 (这些字符本身有特殊的含义)。如果这些特殊字符是您尝试匹配的字符串的一部分,而您原样插入这些字符,则不能正确进行解释。例如,在字符串中插入 * 星号会解释为与任何字符匹配的通配符 (而不是解释为文本 *)。这种情况下,可以使用以下预定义策略变量:

  • ${*} - 在需要星号字符 * 的位置使用。

  • ${?} - 在需要问号字符 ? 的位置使用。

  • ${$} - 在需要美元符号字符 $ 的位置使用。

在任何可以使用常规策略变量的字符串中,都可以使用这些预定义策略变量。

了解更多信息

欲了解更多有关策略的信息,请参阅: