AWS Identity and Access Management
用户指南
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。请点击 Amazon AWS 入门,可查看中国地区的具体差异

AWS 全局和 IAM 条件上下文键

通过使用 IAM 中的 JSON 策略的 Condition 元素,您可以测试所有 AWS API 请求的评估上下文中包含的键的值。这些键提供有关请求本身或请求所引用资源的信息。在允许用户请求的操作之前,您可以检查这些键是否具有指定值。这样,您就可以精细控制 JSON 策略语句何时与传入的 API 请求匹配或不匹配。有关如何在 JSON 策略中使用 Condition 元素的信息,请参阅IAM JSON 策略元素: Condition

本主题介绍全局可用键 (前缀为“aws:”) 以及 IAM 服务定义并提供的键 (前缀为“iam:”)。其他几个 AWS 服务也提供与该服务定义的操作和资源相关的服务特定键。有关更多信息,请参阅 可在 IAM 策略中使用的 AWS 服务操作和条件上下文键。支持条件键的服务的文档通常包含附加信息。例如,有关您可以在 Amazon S3 资源的策略中使用的键的信息,请参阅 Amazon Simple Storage Service 开发人员指南 中的 Amazon S3 Policy Keys

注意

如果您使用只在某些情况下可用的条件键 (例如 aws:SourceIp 和 aws:SourceVpc),则可使用 IfExists 版本的比较运算符。如果请求上下文中缺少条件键 (未设置 IfExists),策略引擎将无法通过评估。例如,如果需要编写策略来限制来自特定 IP 范围或特定 VPC 的访问,则可按如下所示构造条件:

"Condition": {"IpAddressIfExists": {"aws:SourceIp" : ["xxx"] }, "StringEqualsIfExists" : {"aws:SourceVpc" : ["yyy"]} }

此条件满足 (1) 如果 aws:SourceIp 上下文键存在并且值为 xxx 或者 (2) 如果 aws:SourceVpc 上下文键存在并且值为 yyy。如果两个键中的任意一个不存在或两个都不存在,条件仍匹配。仅当请求上下文中存在指定的键时,才进行测试。如果不存在,则视为“与我无关”。

可用的全局条件键

AWS 为支持 IAM 的所有 AWS 服务提供下列预定义条件键以实现访问控制:

aws:CurrentTime

日期运算符结合使用。

要针对日期/时间条件检查的当前日期和时间。

aws:EpochTime

日期运算符结合使用。

要针对日期/时间条件检查的纪元中的当前日期和时间或 UNIX 时间。

aws:TokenIssueTime

日期运算符结合使用。

检查颁发临时安全凭证的日期/时间。此键仅在使用临时安全凭证签名的请求中存在。有关临时安全凭证的更多信息,请参阅临时安全凭证

aws:MultiFactorAuthPresent

布尔值运算符结合使用。

检查是否使用了多重验证 (MFA) 来验证发出当前请求的临时安全凭证。仅当用户使用临时凭证调用 API 时,此键才存在于请求环境。此凭证由 IAM 角色、联合身份用户、具有sts:GetSessionToken凭证的 IAM 用户,以及 AWS 管理控制台 用户使用。 (控制台使用在后台代表用户生成的临时凭证。)当使用例如标准访问密钥前缀的长期凭证调用 CLI 命令或 API 时,aws:MultiFactorAuthPresent 键不存在。因此我们建议,当您检查此键时使用 ...IfExists 版本的条件运算符。

必须理解以下条件要素不是可靠的检查 MFA 使用的方式:

##### THIS EXAMPLE DOES NOT WORK ##### "Condition" : { "Bool" : { "aws:MultiFactorAuthPresent" : false } }

这是因为使用长期凭证时,aws:MultiFactorAuthPresent 键在请求中不存在,导致测试始终 失败,最终造成不匹配。相反,我们建议您使用 BoolIfExists 运算符检查值。例如::

"Condition" : { "BoolIfExists" : { "aws:MultiFactorAuthPresent" : false } }

此运算符表示当值存在且值为 "false”或者 值不存在时语句将匹配。...IfExists 表示您实际上不关心要检查的键在请求环境中是否存在;即使不存在也不会产生不匹配。

请勿使用策略进行类似以下的构建,以检查 MFA 键是否存在:

##### THIS EXAMPLE DOES NOT WORK ##### "Action" : "Deny", "Condition" : { "Null" : { "aws:MultiFactorAuthPresent" : true } }

如果没有使用 MFA,您可能发现以前的示例拒绝访问。但当您使用长期凭证 (访问密钥) 发出 API 请求时,MFA 条件上下文键始终 缺失。因此,以此方法测试 MFA 将始终导致长期凭证的拒绝访问。

aws:MultiFactorAuthAge

数字运算符结合使用。

检查经 MFA 验证的、用于发出请求的安全凭证是多久之前使用 Multi-Factor Authentication (MFA) 颁发的 (以秒计)。如果未使用 MFA,则此键不存在。请参阅在 AWS 中使用多重验证 (MFA)。因此,这是您在使用 ...IfExists 版本的比较运算符时应考虑的另一个键。这将确保比较结果是您所希望的,即使键在请求环境中不存在。

aws:PrincipalType

字符串运算符结合使用。

要检查委托人类型 (用户、账户、联合身份用户等) 。

aws:Referer

字符串运算符结合使用。

检查谁将客户端浏览器引用为请求发送到的地址。只有某些服务 (如 Amazon S3,作为可以由 Web 浏览器直接寻址的服务) 支持它。值来自对 AWS 进行的 HTTPS 请求中的引用站点标头。

警告

应谨慎使用此键:aws:referer 允许 Amazon S3 存储桶拥有者帮助阻止未经授权的第三方站点将其内容提供给标准 Web 浏览器 (有关更多信息,请参阅上面的链接)。因为 aws:referer 值由发起人在 http 标头中提供,所以未经授权的第三方可以修改或自定义浏览器以提供他们选择的任何 aws:referer 值。因此,aws:referer 不应用于阻止未经授权的第三方进行直接 AWS 请求。提供它只是为了允许客户保护其存储在 Amazon S3 中的数字内容,以免在未经授权的第三方站点上引用。

aws:RequestTag/tag-key

字符串运算符结合使用。

该上下文键的格式为 "aws:Request/tag-key":"tag-value",其中 tag-keytag-value 是标签键值对。

在 AWS 请求中检查标签及其值。例如,您可以检查请求是否包含“Dept”标签并具有“Accounting”值。该 AWS 条件键是为 Amazon EC2 引入的,支持该键的其他服务数量有限。请检查服务,以了解它是否支持使用该条件键。

aws:SecureTransport

布尔值运算符结合使用。

检查请求是否是使用 SSL 发送的。

aws:SourceArn

ARN 运算符结合使用。

使用来源的 Amazon 资源名称 (ARN) 查看请求的来源。(该值仅适用于某些服务。)

aws:SourceIp

IP 地址运算符结合使用。

要检查请求者的 IP 地址,请参阅IP 地址条件运算符

注意

只应在 JSON 策略中针对从指定的 IP 范围中进行 API 调用的 IAM 用户、组、角色或联合用户使用 aws:SourceIp 条件键。该策略拒绝访问代表您进行调用的 AWS 服务。例如,如果您具有的服务角色允许 AWS CloudFormation 调用 Amazon EC2 以停止实例,则会拒绝该请求,因为目标服务 (EC2) 看到的是进行调用的服务 (CloudFormation) 的 IP 地址,而不是源用户的 IP 地址。无法通过进行调用的服务将源 IP 地址传递到目标服务以在 JSON 策略中进行评估。

如果请求来自使用 Amazon VPC 终端节点的主机,则 aws:SourceIp 键不可用。您应改用特定于 VPC 的键。有关更多信息,请参阅 Amazon VPC 用户指南 中的 VPC 终端节点 - 控制终端节点的使用

aws:SourceVpc

字符串运算符结合使用。

限制对特定 VPC 的访问。有关更多信息,请参阅 Amazon Simple Storage Service 开发人员指南 中的限制对特定 VPC 的访问。(通过 VPC 端点去往 AWS 服务的流量支持此条件键。)

aws:SourceVpce

字符串运算符结合使用。

限制对特定 VPC 终端节点的访问。有关更多信息,请参阅 Amazon Simple Storage Service 开发人员指南 中的限制对特定 VPC 终端节点的访问

aws:TagKeys

字符串运算符结合使用。

该上下文键的格式为 "aws:TagKeys":"tag-key",其中 tag-key 是没有值的标签键列表 (例如,["Dept","Cost-Center"])。

检查在 AWS 请求中包含的标签键。该 AWS 条件键是为 Amazon EC2 引入的,支持该键的其他服务数量有限。请检查服务,以了解它是否支持使用该条件键。

aws:UserAgent

字符串运算符结合使用。

检查请求者的客户端应用程序。

aws:userid

字符串运算符结合使用。

检查请求者的用户 ID。

aws:username

字符串运算符结合使用。

检查请求者的用户名称。

IAM 的可用键

可以在控制对 IAM 资源的访问的策略中使用以下条件键:

iam:PolicyArn

ARN 运算符结合使用。

检查涉及托管策略的请求中的托管策略的 Amazon 资源名称 (ARN)。有关更多信息,请参阅 控制对策略的访问

Web 联合身份验证的可用键

如果您使用 Web 联合身份验证为已使用身份提供商 (IdP) 进行身份验证 (例如使用 Login with Amazon、Amazon Cognito、Google 或 Facebook 进行身份验证) 的用户提供了临时安全凭证,则当使用该临时安全凭证发出请求时,可获得其他条件键。这些键可使您编写策略,确保联合身份用户只能访问与特定提供商、应用程序或用户关联的资源。

aws:FederatedProvider

字符串运算符结合使用。

FederatedProvider 键可以识别是使用哪个 IdP 对用户进行身份验证的。例如,如果使用 Amazon Cognito 对用户进行身份验证,则键将包含 cognito-identity.amazonaws.com。同样,如果使用 Login with Amazon 对用户进行身份验证,则键将包含值 www.amazon.com。您可能使用类似以下资源策略中的键,该策略在资源的 ARN 中使用 aws:FederatedProvider 键作为策略变量。如果任何用户使用 IdP 进行了身份验证,那么策略将允许该用户从 Amazon S3 存储桶中特定于他们进行身份验证所使用的提供商的文件夹中获取对象。

{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws-cn:s3:::BUCKET-NAME/${aws:FederatedProvider}/*" } }
应用程序 ID 和用户 ID

字符串运算符结合使用。

您也可以使用两个键,它们提供用户的唯一标识符以及用于验证用户的应用程序或网站的标识符。这些键具有以下 IdP 特定名称:

  • 对于 Amazon Cognito 用户,键是 cognito-identity.amazonaws.com:aud (对于身份池 ID) 和 cognito-identity.amazonaws.com:sub (对于用户 ID)。

  • 对于使用 Amazon 登录信息的用户,键为 www.amazon.com:app_idwww.amazon.com:user_id

  • 对 Facebook 用户,键为 graph.facebook.com:app_idgraph.facebook.com:id

  • 对于 Google 用户,键为 accounts.google.com:aud (对于应用程序 ID) 和 accounts.google.com:sub (对于用户 ID)。

Amazon Cognito 中的 amr 键

字符串运算符结合使用。

如果您正在使用 Amazon Cognito 进行 Web 联合身份验证,则信任策略中的 cognito-identity.amazonaws.com:amr 键 (已经过身份验证的方法引用) 包含有关该用户的登录信息。该键有多个值,这意味着您要在使用条件集合运算符的策略中对它进行测试。该键可包含以下值:

  • 如果用户未经过身份验证,则该键仅包含 unauthenticated

  • 如果该用户已经过身份验证,则该键包含值 authenticated 以及在调用中使用的登录提供商的名称 (graph.facebook.comaccounts.google.comwww.amazon.com)。

例如,某 Amazon Cognito 角色信任策略中的以下条件测试用户是否未经过身份验证:

"Condition": { "StringEquals": { "cognito-identity.amazonaws.com:aud": "us-east-2:identity-pool-id" }, "ForAnyValue:StringLike": { "cognito-identity.amazonaws.com:amr": "unauthenticated" } }
有关 Web 联合身份验证的更多信息

有关 Web 联合身份验证的更多信息,请参阅以下内容:

基于 SAML 的联合的可用键

如果使用的是基于 SAML 的联合,则可以在策略中涵盖更多条件键。

信任策略

在角色的信任策略中,您可以包括以下键,以帮助您确定发起人是否有权代入角色。除了 saml:doc,所有值均源自 SAML 断言。控制台 UI 可使用列表中标有星号 (*) 的项目创建条件。标有 [] 的项目可以 具有指定类型列表中的值。

saml:aud

字符串运算符结合使用。

SAML 断言提交到的终端节点 URL。此键的值来自断言中的“SAML Recipient”字段,而不是“Audience”字段。

saml:cn[]

字符串运算符结合使用。

这是 eduOrg 属性。

saml:doc*

字符串运算符结合使用。

这代表担任角色所用的委托人。格式为 account-ID/provider-friendly-name,例如 123456789012/SAMLProviderName账户 ID 值指拥有 SAML 提供商的账户。

saml:edupersonaffiliation[]

字符串运算符结合使用。

这是 eduPerson 属性。

saml:edupersonassurance[]

字符串运算符结合使用。

这是 eduPerson 属性。

saml:edupersonentitlement[]*

字符串运算符结合使用。

这是 eduPerson 属性。

saml:edupersonnickname[]

字符串运算符结合使用。

这是 eduPerson 属性。

saml:edupersonorgdn*

字符串运算符结合使用。

这是 eduPerson 属性。

saml:edupersonorgunitdn[]

字符串运算符结合使用。

这是 eduPerson 属性。

saml:edupersonprimaryaffiliation

字符串运算符结合使用。

这是 eduPerson 属性。

saml:edupersonprimaryorgunitdn

字符串运算符结合使用。

这是 eduPerson 属性。

saml:edupersonprincipalname

字符串运算符结合使用。

这是 eduPerson 属性。

saml:edupersonscopedaffiliation[]

字符串运算符结合使用。

这是 eduPerson 属性。

saml:edupersontargetedid[]

字符串运算符结合使用。

这是 eduPerson 属性。

saml:eduorghomepageuri[]

字符串运算符结合使用。

这是 eduOrg 属性。

saml:eduorgidentityauthnpolicyuri[]

字符串运算符结合使用。

这是 eduOrg 属性。

saml:eduorglegalname[]

字符串运算符结合使用。

这是 eduOrg 属性。

saml:eduorgsuperioruri[]

字符串运算符结合使用。

这是 eduOrg 属性。

saml:eduorgwhitepagesuri[]

字符串运算符结合使用。

这是 eduOrg 属性。

saml:namequalifier*

字符串运算符结合使用。

哈希值,基于 Issuer 响应值 (saml:iss)、AWS 账户 ID 和 IAM 中 SAML 提供商的友好名称 (ARN 的最后一部分) 的串联,以“/”字符分隔。账户 ID 与 SAML 提供商的友好名称的串联可作为键 saml:doc 供 IAM 策略使用。有关更多信息,请参阅 唯一标识基于 SAML 的联合中的用户

saml:iss*

字符串运算符结合使用。

发布者,以 URN 表示。

saml:sub*

字符串运算符结合使用。

这是该陈述的主题,其中包含唯一标识组织中某个用户的值 (例如 _cbb88bf52c2510eabe00c1642d4643f41430fe25e3)。

saml:sub_type*

字符串运算符结合使用。

此键的值可以是“persistent”、“transient”或由 SAML 断言中使用的 SubjectNameID 元素的完整 Format URI 构成。“persistent”值表示在不同会话之间用户的 saml:sub 值是相同的。如果值为“transient”的,则用户在每个会话中拥有不同的 saml:sub 值。有关 NameID 元素的 Format 属性的信息,请参阅为身份验证响应配置 SAML 断言

有关 eduPersoneduOrg 属性的一般信息,请参阅 Internet2 网站。有关 eduPerson 属性的列表,请参阅 eduPerson 对象类规范 (201203)

列表类型的条件键可以包含多个值。要在策略中创建条件以获取列表值,可以使用集合运算符 (ForAllValuesForAnyValue)。例如,要支持从属关系为“教员”、“职员”或“员工”(而非“学生”、“校友”或其他可能的从属关系) 的用户,可以使用下面这样的条件:

"Condition": { "ForAllValues:StringLike": { "saml:edupersonaffiliation":[ "faculty", "staff", "employee" ] } }

许可 (访问) 策略

SAML 联合角色的许可策略用于定义用户能够访问的 AWS 内容,您可以在其中包含以下键:

saml:namequalifier

字符串运算符结合使用。

这包含代表 saml:docsaml:iss 值组合的一个哈希值。它用作命名空间限定词;saml:namequalifiersaml:sub 组合可唯一标识用户。

saml:sub

字符串运算符结合使用。

这是该陈述的主题,其中包含唯一标识组织中某个用户的值 (例如 _cbb88bf52c2510eabe00c1642d4643f41430fe25e3)。

saml:sub_type

字符串运算符结合使用。

此键的值可以是“persistent”、“transient”或由 SAML 断言中使用的 SubjectNameID 元素的完整 Format URI 构成。“persistent”值表示在不同会话之间用户的 saml:sub 值是相同的。如果值为“transient”的,则用户在每个会话中拥有不同的 saml:sub 值。有关 NameID 元素的 Format 属性的信息,请参阅为身份验证响应配置 SAML 断言

有关使用这些键的更多信息,请参阅关于基于 SAML 2.0 的联合身份验证