转发访问会话 - AWS Identity and Access Management

转发访问会话

转发访问会话(FAS)是一种 IAM 技术,当 AWS 服务代表您发出请求时,AWS 服务使用该技术来传递您的身份、权限和会话属性。FAS 使用调用 AWS 服务的身份的权限以及 AWS 服务的身份向下游服务发出请求。只有在服务收到需要与其他 AWS 服务或资源交互才能完成的请求后,才会代表 IAM 主体向 AWS 服务发出 FAS 请求。当发出 FAS 请求时:

  • 接收 IAM 主体初始请求的服务会检查 IAM 主体的权限。

  • 接收 FAS 后续请求的服务也会检查同一 IAM 主体的权限。

例如,当使用 SSE-KMS 加密对象时,Amazon S3 使用 FAS 调用 AWS Key Management Service 以解密该对象。下载 SSE-KMS 加密对象时,名为 data-reader 的角色会针对 Amazon S3 在对象上调用 GetObject,并且不会直接调用 AWS KMS。在收到 GetObject 请求并授权 data-reader 后,Amazon S3 会向 AWS KMS 发出 FAS 请求以解密 Amazon S3 对象。当 KMS 收到 FAS 请求时,它会检查角色的权限,并且只有在 data-reader 对 KMS 密钥具有正确权限的情况下才会授权解密请求。对 Amazon S3 和 AWS KMS 的请求均使用角色的权限进行授权,并且只有当 data-reader 同时拥有对 Amazon S3 对象和 AWS KMS 密钥的权限时,请求才会成功。

将 IAM 角色作为主体传递给 Amazon S3,然后传递给 AWS KMS 的流程图。
注意

收到 FAS 请求的服务可以发出其他 FAS 请求。在这种情况下,请求的主体必须拥有对 FAS 调用的所有服务的权限。

FAS 请求和 IAM policy 条件

当发出 FAS 请求时,aws:CalledViaaws:CalledViaFirstaws:CalledViaLast 条件键将填充启动 FAS 调用的服务的服务主体。每当发出 FAS 请求时,aws:ViaAWSService 条件键值都设置为 true。在下图中,直接向 CloudFormation 发出的请求未设置任何 aws:CalledViaaws:ViaAWSService 条件键。当 CloudFormation 和 DynamoDB 代表角色发出下游 FAS 请求时,会填充这些条件键的值。

将 IAM 角色作为主体传递给 CloudFormation,然后将条件键值传递给 DynamoDB 和 AWS KMS 的流程图。

要在会被具有条件键测试源 IP 地址或源 VPC 的拒绝策略声明拒绝的情况下允许发出 FAS 请求,您必须使用条件键在拒绝策略中为 FAS 请求提供例外。使用 aws:ViaAWSService 条件键可以对所有 FAS 请求执行此操作。要仅允许特定 AWS 服务发出 FAS 请求,请使用 aws:CalledVia

重要

在通过 VPC 端点发出初始请求后发出 FAS 请求时,来自初始请求的 aws:SourceVpceaws:SourceVpcaws:VpcSourceIp 的条件键值不用于 FAS 请求中。使用 aws:VPCSourceIPaws:SourceVPCE 编写策略以有条件地授予访问权限时,还必须使用 aws:ViaAWSServiceaws:CalledVia 允许 FAS 请求。如果在公共 AWS 服务端点收到初始请求后发出 FAS 请求,则后续的 FAS 请求将使用相同的 aws:SourceIP 条件键值发出。

示例:允许 Amazon S3 从 VPC 或通过 FAS 进行访问

在以下 IAM policy 示例中,只有当 Amazon S3 GetObject 和 Athena 请求来自附加到 example_vpc 的 VPC 端点,或者是 Athena 发出的 FAS 请求时,这些请求才可以被允许。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "OnlyAllowMyIPs", "Effect": "Allow", "Action": [ "s3:GetObject*", "athena:StartQueryExecution", "athena:GetQueryResults", "athena:GetWorkGroup", "athena:StopQueryExecution", "athena:GetQueryExecution" ], "Resource": "*", "Condition": { "StringEquals": { "aws:SourceVPC": [ "example_vpc" ] } } }, { "Sid": "OnlyAllowFAS", "Effect": "Allow", "Action": [ "s3:GetObject*" ], "Resource": "*", "Condition": { "ForAnyValue:StringEquals": { "aws:CalledVia": "athena.amazonaws.com" } } } ] }

有关使用条件键允许 FAS 访问的其他示例,请参阅数据边界示例策略存储库