

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

# 动态权限管理方法
<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}/`