

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

# 管理访问控制
<a name="users-policies"></a>

您可以使用 AWS Identity and Access Management (IAM) 策略控制用户对 AWS Transfer Family 资源的访问权限。IAM 策略是一个语句（通常采用 JSON 格式），它允许对资源进行特定级别的访问。您可以使用 IAM 策略来定义希望允许用户执行和不执行哪些文件操作。您还可以使用 IAM 策略来定义希望允许用户访问哪些 Amazon S3 存储桶。要为用户指定这些策略，您需要为其创建一个 IAM 策略和与之关联的信任关系的 IAM 角色。 AWS Transfer Family 

为每个用户分配一个 IAM 角色。 AWS Transfer Family 使用的 IAM 角色类型称为*服务角色*。当用户登录到您的服务器时， AWS Transfer Family 将使用映射到该用户的 IAM 角色。要了解如何创建向用户提供对 Amazon S3 存储桶的访问权限的 IAM [角色，请参阅 *IAM 用户指南*中的创建向 AWS 服务委派权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-service.html)的角色。

您可以使用 IAM 策略中的特定权限授予对 Amazon S3 对象的只写访问权限。有关更多信息，请参阅 [授予仅写入和列出文件的权限](configure-storage.md#headobject-access-denied)。

 AWS 存储博客包含一篇详细介绍如何设置最低权限访问权限的文章。有关详细信息，请参阅在[AWS Transfer Family 工作流程中实现最低权限访问权限](https://aws.amazon.com/blogs//storage/implementing-least-privilege-access-in-an-aws-transfer-family-workflow/)。

**注意**  
 如果您的 Amazon S3 存储桶使用 AWS Key Management Service (AWS KMS) 进行加密，则必须在策略中指定其他权限。有关更多信息，请参阅 [数据保护和加密](encryption-at-rest.md)。此外，您可以在 *IAM 用户指南*中查看有关[会话策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session.html)的更多信息。

**Topics**
+ [

# 允许对 Amazon S3 存储桶的读取和写入访问权限
](users-policies-all-access.md)
+ [

# 为 Amazon S3 存储桶创建会话策略
](users-policies-session.md)
+ [

# 动态权限管理方法
](dynamic-permission-management.md)

# 允许对 Amazon S3 存储桶的读取和写入访问权限
<a name="users-policies-all-access"></a>

此部分说明了如何创建 IAM 策略，以允许对特定 Amazon S3 存储桶进行读写访问。向您的用户分配具有此 IAM 策略的 IAM 角色后，该用户 read/write 便可以访问指定的 Amazon S3 存储桶。

以下策略允许通过编程方式对 Amazon S3 存储桶进行读写访问。只有当您需要启用跨账户存取时，才需要 `GetObjectACL` 和 `PutObjectACL` 语句。也就是说，您的 Transfer Family 服务器需要访问其他账户中的存储桶。

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid":"ReadWriteS3",
      "Action": [
            "s3:ListBucket"
                ],
      "Effect": "Allow",
      "Resource": ["arn:aws:s3:::amzn-s3-demo-bucket"]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "s3:GetObject",
        "s3:GetObjectTagging",
        "s3:DeleteObject",              
        "s3:DeleteObjectVersion",
        "s3:GetObjectVersion",
        "s3:GetObjectVersionTagging",
        "s3:GetObjectACL",
        "s3:PutObjectACL"
      ],
      "Resource": ["arn:aws:s3:::amzn-s3-demo-bucket/*"]
    }
  ]
}
```

`ListBucket` 操作需要对存储桶本身的权限。`PUT`、`GET` 和 `DELETE` 操作需要对象权限。由于这些资源不同，因此使用不同的 Amazon 资源名称 (ARNs) 来指定。

要进一步限制用户，使其只能访问具有指定 `home` 前缀的 Amazon S3 存储桶，请参阅 [为 Amazon S3 存储桶创建会话策略](users-policies-session.md)。

# 为 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}`

# 动态权限管理方法
<a name="dynamic-permission-management"></a>

## 了解 Transfer Family 权限架构
<a name="permission-architecture-overview"></a>

AWS Transfer Family 支持通过会话策略进行动态权限管理，允许您在运行时限制 IAM 角色的有效权限。这种方法适用于服务托管用户和自定义身份提供商用户，但仅在向 Amazon S3（不是 Amazon EFS）传输文件或从中传输文件时才受支持。

每个 AWS Transfer Family 用户都使用权限模型进行操作，该模型包括：

1. *基本 IAM 角色*-定义用户的基础权限

1. *可选会话策略*-在运行时限制（范围缩小）基本权限

有效权限是基本角色权限和会话策略权限的交集。会话策略只能限制权限；它们不能授予超出基本角色允许范围的其他权限。

此架构适用于两种用户类型：
+ *服务管理的用户*-可以直接在用户设置中配置会话策略
+ *自定义身份提供商用户*-会话策略可以作为身份验证响应的一部分返回，也可以存储在 AWS Secrets Manager

## 两种权限管理方法
<a name="permission-management-approaches"></a>

在为需要独特访问模式的 Transfer Family 用户设计权限时，您可以选择两种主要方法：

每个用户一个角色  
为每个 Transfer Family 用户创建一个单独的 IAM 角色，该角色具有针对该用户需求量身定制的特定权限。在以下情况下使用此方法：  
+ 每个用户需要的权限截然不同
+ 权限管理由组织中的不同人员处理
+ 您需要对个人用户访问权限进行精细控制

与会话策略共享角色  
使用具有广泛权限的单个 IAM 角色（例如访问包含多个用户主目录的整个 Amazon S3 存储桶），并应用会话策略将每个用户限制在其特定区域内。与为每个用户管理单独的角色相比，这种方法可以显著减少管理开销。在以下情况下使用此方法：  
+ 用户需要类似类型的访问权限，但需要不同的资源（例如，所有用户都需要 read/write 访问权限，但每个用户只能访问自己的文件夹）
+ 你想简化角色管理，避免创建数十或数百个个人角色
+ 用户只能在共享存储桶中访问其指定的主目录
+ 权限管理集中在您的组织内
例如，与其为用户 “alice”、“bob” 和 “charlie” 创建单独的角色，不如创建一个可以访问整个`s3://company-transfers/`存储桶的角色，然后使用会话策略将 alice 限制为`s3://company-transfers/alice/`、bob 限制为`s3://company-transfers/bob/`，依此类推。

## 实施会话策略
<a name="session-policy-implementation"></a>

会话策略的工作原理是限制分配给用户的基本 IAM 角色的有效权限。最终权限是角色权限和会话策略权限的交集。

您可以通过两种方式实现动态会话策略：

变量替换  
`${transfer:HomeBucket}`在会话策略中使用 Transfer `${transfer:Username}` Family 策略变量，例如`${transfer:HomeDirectory}`、和。这些变量在运行时会自动替换为实际值。有关这些变量的更多信息，请参阅[为 Amazon S3 存储桶创建会话策略](users-policies-session.md)。

动态生成  
对于自定义身份提供商，生成会话策略 on-the-fly作为您的 Lambda 函数或 API Gateway 方法的身份验证响应的一部分。这种方法允许您在身份验证时根据用户属性、群组成员资格或外部数据源创建高度自定义的策略。  
您还可以 AWS Secrets Manager 通过添加以会话策略 JSON 作为值命名的`Policy`密钥来存储预生成的会话策略。这使您可以跨多个用户使用相同的广泛的 IAM 角色，同时保持特定于用户的访问控制。

**注意**  
仅支持进出 Amazon S3 的文件传输和传出会话策略。它们不适用于 Amazon EFS 文件系统。对于 Amazon EFS，权限由 UID/GID 文件系统本身管理，权限位应用于文件系统本身。

## 按用户类型实现情况
<a name="implementation-by-user-type"></a>

服务托管用户  
对于服务管理的用户，您可以通过 AWS Transfer Family 控制台、API 或 CLI 直接在用户配置中指定会话策略。有关更多信息，请参阅 [与服务托管用户合作](service-managed-users.md)。

自定义身份提供程序用户  
对于自定义身份提供商用户，您可以通过两种方式提供会话策略：  
+  AWS Secrets Manager 通过包括一个`Policy`以会话策略作为值命名的密钥
+ 直接在 Lambda 函数响应或 API Gateway 响应中作为身份验证结果的一部分
有关更多信息，请参阅 [自定义身份提供商解决方案](custom-idp-toolkit.md)。

## 示例：使用会话策略简化角色管理
<a name="dynamic-permission-example"></a>

此示例演示了动态权限管理如何在维护安全的同时显著减少管理开销。

### 场景
<a name="scenario-description"></a>

您的组织有 50 个用户需要 SFTP 访问权限才能传输文件。每个用户只能在名为的共享 Amazon S3 存储桶中访问自己的文件夹`company-transfers`。如果没有会话策略，则需要创建 50 个单独的 IAM 角色。

传统方法（无会话策略）  
+ 创建 50 个 IAM 角色：`TransferRole-Alice``TransferRole-Bob``TransferRole-Charlie`、、等
+ 每个角色仅具有访问该用户文件夹的特定权限
+ 管理权限需要更新各个角色
+ 添加新用户需要创建新角色

动态方法（使用会话策略）  
+ 创建 1 个 IAM 角色：`TransferRole-Shared`拥有对整个存储桶的广泛权限
+ 使用会话策略将每个用户限制在运行时访问其特定文件夹
+ 管理权限需要更新一个角色或会话策略模板
+ 添加新用户不需要新角色，只需配置用户即可

### 实施
<a name="implementation-example"></a>

以下是您将如何实现动态方法（以`company-transfers`存储桶为例，将其替换为实际的 Amazon S3 存储桶）：

**实现动态权限管理**

1. 创建一个具有广泛的 Amazon S3 权限的共享 IAM 角色：  
****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Action": [
           "s3:GetObject",
           "s3:PutObject",
           "s3:DeleteObject"
         ],
         "Resource": "arn:aws:s3:::company-transfers/*"
       },
       {
         "Effect": "Allow",
         "Action": "s3:ListBucket",
         "Resource": "arn:aws:s3:::company-transfers"
       }
     ]
   }
   ```

1. 创建限制用户文件夹访问权限的会话策略模板：  
****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Action": [
           "s3:GetObject",
           "s3:PutObject",
           "s3:DeleteObject"
         ],
         "Resource": "arn:aws:s3:::company-transfers/${transfer:Username}/*"
       },
       {
         "Effect": "Allow",
         "Action": "s3:ListBucket",
         "Resource": "arn:aws:s3:::company-transfers",
         "Condition": {
           "StringLike": {
             "s3:prefix": "${transfer:Username}*"
           }
         }
       }
     ]
   }
   ```

1. 为每位用户配置以下内容：
   + 共享的 IAM 角色
   + 会话策略的应用方式如下：
     + *服务管理的用户*：在创建或修改用户时，使用 API 或 CLI 通过策略参数应用 JSON（控制台仅提供预定义的策略选项）
     + *自定义身份提供商用户*：要么在身份验证期间将其作为 Lambda 函数响应的一部分返回，要么将其 AWS Secrets Manager 作为名为 “Policy” 的密钥与用户的证书一起存储
   + 主目录：`/company-transfers/${transfer:Username}/`