

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 为 Amazon S3 存储桶创建会话策略
<a name="users-policies-session"></a>

*会话策略*是一项 AWS Identity and Access Management (IAM) 策略，它限制用户访问 Amazon S3 存储桶的某些部分。它通过实时评估访问来做到这一点。

**注意**  
 会话策略仅适用于 Amazon S3。对于 Amazon EFS，您可以使用 POSIX 文件权限限制访问权限。

当您需要向一组用户授予对 Amazon S3 存储桶的特定部分的相同访问权限时，可以使用会话策略。例如，一组用户可能仅需访问 `home` 目录。该组用户共享相同的 IAM 角色。

**注意**  
 路径的长度上限是 2048 个字符。有关更多详细信息，请参阅 *API 参考*中 `CreateUser` 操作的[策略请求参数](https://docs.aws.amazon.com/transfer/latest/APIReference/API_CreateUser.html#API_CreateUser_RequestSyntax)。

要创建会话策略，请在 IAM 策略中使用以下策略变量：
+ `${transfer:HomeBucket}`
+ `${transfer:HomeDirectory}`
+ `${transfer:HomeFolder}`
+ `${transfer:UserName}`

**重要**  
您不能在托管策略中使用前述变量。也不能在 IAM 角色定义中将其用作策略变量。您可以在 IAM 策略中创建这些变量，并在设置用户时直接提供这些变量。另外，您不能在此会话策略中使用 `${aws:Username}` 变量。此变量引用了 IAM 用户名而不是 AWS Transfer Family所需的用户名。

## 会话策略示例
<a name="example-session-policy"></a>

以下代码所示为会话策略示例。

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
      {
          "Sid": "AllowListingOfUserFolder",
          "Action": [
              "s3:ListBucket"
          ],
          "Effect": "Allow",
          "Resource": [
              "arn:aws:s3:::${transfer:HomeBucket}"
          ],
          "Condition": {
              "StringLike": {
                  "s3:prefix": [
                      "${transfer:HomeFolder}/*",
                      "${transfer:HomeFolder}"
                  ]
              }
          }
      },
      {
          "Sid": "HomeDirObjectAccess",
          "Effect": "Allow",
          "Action": [
              "s3:PutObject",
              "s3:GetObject",
              "s3:DeleteObjectVersion",
              "s3:DeleteObject",
              "s3:GetObjectVersion",
              "s3:GetObjectACL",
              "s3:PutObjectACL"
          ],
          "Resource": "arn:aws:s3:::${transfer:HomeDirectory}/*"
       }
  ]
}
```

**注意**  
前面的策略示例假设用户的主目录设置为包含尾部斜杠，以表示它是一个目录。另一方面，如果您设置的用户 `HomeDirectory` 不带尾部的斜杠，则应将其作为策略的一部分。

在前面的示例策略中，请注意使用`transfer:HomeFolder`、`transfer:HomeBucket`和`transfer:HomeDirectory`策略参数。这些参数是为用户配置的设置的，如[HomeDirectory](https://docs.aws.amazon.com/transfer/latest/APIReference/API_CreateUser.html#TransferFamily-CreateUser-request-HomeDirectory)和中所述[实施您的 API Gateway 方法](authentication-api-gateway.md#authentication-api-method)。`HomeDirectory`这些参数具有以下定义：
+ `transfer:HomeBucket`参数将替换为的`HomeDirectory`第一个组件。
+ `transfer:HomeFolder` 参数将替换为 `HomeDirectory` 参数的其余部分。
+ `transfer:HomeDirectory`参数删除了前导正斜杠 (`/`)，因此可以在`Resource`语句中将其用作 S3 Amazon 资源名称 (ARN) 的一部分。

**注意**  
 如果您使用的是逻辑目录（即用户的`homeDirectoryType`是`LOGICAL`），则不支持这些策略参数（`HomeBucket`、`HomeDirectory`和`HomeFolder`）。

例如，假设为 Transfer Family 用户配置的 `HomeDirectory` 参数是 `/home/bob/amazon/stuff/`。
+ `transfer:HomeBucket` 设置为 `/home`。
+ `transfer:HomeFolder` 设置为 `/bob/amazon/stuff/`。
+ `transfer:HomeDirectory` 变为 `home/bob/amazon/stuff/`。

第一个`"Sid"`允许用户列出从`/home/bob/amazon/stuff/`开始的所有目录。

第二个 `"Sid"` 限制用户对同一路径 `/home/bob/amazon/stuff/` 的 `put` 和 `get` 访问权限。

借助上述策略，当用户登录时，他们只能访问其主目录中的对象。在连接时， AWS Transfer Family 将这些变量替换为适合用户的值。这样做可以更轻松地将相同的策略文档应用于多个用户。此方法减少了用于管理用户对 Amazon S3 存储桶的访问的 IAM 角色和策略管理的开销。

您还可以使用会话策略以根据业务需求自定义每个用户的访问权限。有关更多信息，请参阅 *IAM 用户指南 AssumeRoleWithWebIdentity中的权限 AssumeRole、 AssumeRoleWith SAM* [L 和](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_control-access_assumerole.html)。

**注意**  
AWS Transfer Family 存储策略 JSON，而不是策略的亚马逊资源名称 (ARN)。因此，当您在 IAM 控制台中更改策略时，您需要返回 AWS Transfer Family 控制台并向用户更新最新的策略内容。您可以在**用户配置**部分的**策略信息**选项卡上更新用户。  
如果您使用的是 AWS CLI，则可以使用以下命令来更新策略。  

```
aws transfer update-user --server-id server --user-name user --policy \
   "$(aws iam get-policy-version --policy-arn policy --version-id version --output json)"
```

## 会话策略的嵌套替换
<a name="nested-variable-behavior"></a>

Transfer Family 会话策略中不执行嵌套替换。会话策略可以使用嵌套变量，例如`${transfer:HomeDirectory}`。处理策略时，外部变量（例如，`${transfer:HomeDirectory}`）可能会被包含另一个变量的值（例如 \$1`amzn-s3-demo-bucket:/$(transfer:UserName}`）所取代。但是，嵌套变量不会被实际用户名（例如 **johndoe**）进一步替换。

这意味着，在为 Transfer Family 创建会话策略时，您需要考虑这种行为，并确保相应地设计策略结构和变量用法。嵌套变量可能无法按预期解析，并且策略可能无法授予预期权限。必须对会话策略进行全面测试和验证，以确保它们按预期运行。在为您的 Transfer Family 环境实施访问控制和权限时，此行为是一个关键考虑因素。

解决此问题的一种方法是在会话策略中使用实际的 Amazon S3 存储桶名称。因此，例如，与其在会话策略`${transfer:HomeDirectory}`中指定，不如使用以下内容，其中 amzn-s3-demo-bucket 是您的实际存储桶：。`${amzn-s3-demo-bucket/transfer:UserName}`