转发访问会话
转发访问会话(FAS)是一种 IAM 技术,当 Amazon 服务代表您发出请求时,Amazon 服务使用该技术来传递您的身份、权限和会话属性。FAS 使用调用 Amazon 服务的身份的权限以及 Amazon 服务的身份向下游服务发出请求。只有在服务收到需要与其他 Amazon 服务或资源交互才能完成的请求后,才会代表 IAM 主体向 Amazon 服务发出 FAS 请求。当发出 FAS 请求时:
-
接收 IAM 主体初始请求的服务会检查 IAM 主体的权限。
-
接收 FAS 后续请求的服务也会检查同一 IAM 主体的权限。
例如,当使用 SSE-KMS 加密对象时,Amazon S3 使用 FAS 调用 Amazon Key Management Service 以解密该对象。下载 SSE-KMS 加密对象时,名为 data-reader 的角色会针对 Amazon S3 在对象上调用 GetObject,并且不会直接调用 Amazon KMS。在收到 GetObject 请求并授权 data-reader 后,Amazon S3 会向 Amazon KMS 发出 FAS 请求以解密 Amazon S3 对象。当 KMS 收到 FAS 请求时,它会检查角色的权限,并且只有在 data-reader 对 KMS 密钥具有正确权限的情况下才会授权解密请求。对 Amazon S3 和 Amazon KMS 的请求均使用角色的权限进行授权,并且只有当 data-reader 同时拥有对 Amazon S3 对象和 Amazon KMS 密钥的权限时,请求才会成功。
注意
收到 FAS 请求的服务可以发出其他 FAS 请求。在这种情况下,请求的主体必须拥有对 FAS 调用的所有服务的权限。
FAS 请求和 IAM policy 条件
当发出 FAS 请求时,aws:CalledVia、aws:CalledViaFirst 和 aws:CalledViaLast 条件键将填充启动 FAS 调用的服务的服务主体。每当发出 FAS 请求时,aws:ViaAWSService 条件键值都设置为 true
。在下图中,直接向 CloudFormation 发出的请求未设置任何 aws:CalledVia
或 aws:ViaAWSService
条件键。当 CloudFormation 和 DynamoDB 代表角色发出下游 FAS 请求时,会填充这些条件键的值。
要在会被具有条件键测试源 IP 地址或源 VPC 的拒绝策略声明拒绝的情况下允许发出 FAS 请求,您必须使用条件键在拒绝策略中为 FAS 请求提供例外。使用 aws:ViaAWSService
条件键可以对所有 FAS 请求执行此操作。要仅允许特定 Amazon 服务发出 FAS 请求,请使用 aws:CalledVia
。
重要
在通过 VPC 端点发出初始请求后发出 FAS 请求时,来自初始请求的 aws:SourceVpce
、aws:SourceVpc
和 aws:VpcSourceIp
的条件键值不用于 FAS 请求中。使用 aws:VPCSourceIP
或 aws:SourceVPCE
编写策略以有条件地授予访问权限时,还必须使用 aws:ViaAWSService
或 aws:CalledVia
允许 FAS 请求。如果在公共 Amazon 服务端点收到初始请求后发出 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 访问的其他示例,请参阅数据边界示例策略存储库