

# 转发访问会话
<a name="access_forward_access_sessions"></a>

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

例如，当使用 [SSE-KMS](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingKMSEncryption.html) 加密对象时，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 的流程图。\]](http://docs.aws.amazon.com/zh_cn/IAM/latest/UserGuide/images/access-fas-example.png)


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

## FAS 请求和 IAM policy 条件
<a name="access_fas_policy_conditions"></a>

当发出 FAS 请求时，[aws:CalledVia](reference_policies_condition-keys.md#condition-keys-calledvia)、[aws:CalledViaFirst](reference_policies_condition-keys.md#condition-keys-calledviafirst) 和 [aws:CalledViaLast](reference_policies_condition-keys.md#condition-keys-calledvialast) 条件键将填充启动 FAS 调用的服务的服务主体。每当发出 FAS 请求时，[aws:ViaAWSService](reference_policies_condition-keys.md#condition-keys-viaawsservice) 条件键值都设置为 `true`。在下图中，直接向 CloudFormation 发出的请求未设置任何 `aws:CalledVia` 或 `aws:ViaAWSService` 条件键。当 CloudFormation 和 DynamoDB 代表角色发出下游 FAS 请求时，会填充这些条件键的值。

![\[将 IAM 角色作为主体传递给 CloudFormation，然后将条件键值传递给 DynamoDB 和 AWS KMS 的流程图。\]](http://docs.aws.amazon.com/zh_cn/IAM/latest/UserGuide/images/access-fas-example2.png)


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

**重要**  
在通过 VPC 端点发出初始请求后发出 FAS 请求时，来自初始请求的 `aws:SourceVpce`、`aws:SourceVpc` 和 `aws:VpcSourceIp` 的条件键值不用于 FAS 请求中。使用 `aws:VPCSourceIP` 或 `aws:SourceVPCE` 编写策略以有条件地授予访问权限时，还必须使用 `aws:ViaAWSService` 或 `aws:CalledVia` 允许 FAS 请求。如果在公共 AWS 服务端点收到初始请求后发出 FAS 请求，则后续的 FAS 请求将使用相同的 `aws:SourceIP` 条件键值发出。

## 示例：允许 Amazon S3 从 VPC 或通过 FAS 进行访问
<a name="access_fas_example"></a>

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

------
#### [ JSON ]

****  

```
{
  "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": [
          "vpc-111bbb22"
          ]
        }
      }
    },
    {
      "Sid": "OnlyAllowFAS",
      "Effect": "Allow",
      "Action": [
        "s3:GetObject*"
      ],
      "Resource": "*",
      "Condition": {
        "ForAnyValue:StringEquals": {
          "aws:CalledVia": "athena.amazonaws.com"
        }
      }
    }
  ]
}
```

------

有关使用条件键允许 FAS 访问的其他示例，请参阅[数据边界示例策略存储库](https://github.com/aws-samples/data-perimeter-policy-examples)。