

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

# 创建 IAM 角色和策略
<a name="requirements-roles"></a>

本主题介绍可与之配合使用的策略和角色类型 Amazon Transfer Family，并介绍创建用户角色的过程。它还描述了会话策略的工作原理，并提供了一个用户角色示例。

Amazon Transfer Family 使用以下类型的角色：
+ **用户角色**-允许服务管理的用户访问必要的 Transfer Family 资源。 Amazon Transfer Family 在 Transfer Family 用户 ARN 的背景下担任此角色。
+ **访问角色** - 仅提供对正在传输的 Amazon S3 文件的访问权限。对于入站 AS2 转移，访问角色使用协议的 Amazon 资源名称 (ARN)。对于出站 AS2 传输，访问角色使用连接器的 ARN。
+ **调用角色** – 用于作为服务器自定义身份提供程序的 Amazon API Gateway。Transfer Family 在 Transfer Family 服务器 ARN 的背景下扮演这个角色。
+ **日志角色**-用于将条目登录到 Amazon CloudWatch。Transfer Family 使用此角色记录成功和失败的详细信息以及有关文件传输的信息。Transfer Family 在 Transfer Family 服务器 ARN 的背景下扮演这个角色。对于出站 AS2 传输，日志角色使用连接器 ARN。
+ **执行角色** - 允许 Transfer Family 用户调用和启动工作流程。Transfer Family 在 Transfer Family 工作流程 ARN 的背景下担任此角色。

除了这些角色之外，您还可以使用*会话策略*。会话策略用于在必要时限制访问权限。请注意，这些策略是独立的：也就是说，您不会将这些策略添加到角色中。相反，您可以直接向 Transfer Family 用户添加会话策略。

**注意**  
创建服务管理的 Transfer Family 用户时，可以选择**基于主文件夹自动生成策略**。如果您想限制用户访问自己的文件夹，这是一个有用的快捷方式。此外，您还可以在[会话策略工作原理](#session-policy)中查看有关会话策略的详细信息以及示例。您还可以在《*IAM 用户指南*》的[会话策略](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies.html#policies_session)中找到有关会话策略的更多信息。

**Topics**
+ [创建用户角色](#role-create-procedure)
+ [会话策略工作原理](#session-policy)
+ [read/write 访问策略示例](#read-write-access)

## 创建用户角色
<a name="role-create-procedure"></a>

在创建用户时，您会做出大量有关用户访问权限的决定。这些决定包括用户可以访问哪些 Amazon S3 存储桶或 Amazon EFS 文件系统、每个 Amazon S3 存储桶的哪些部分和文件系统中的哪些文件可以访问，以及用户拥有哪些权限（例如`PUT`或`GET`）。

要设置访问权限，您需要创建基于身份 Amazon Identity and Access Management (IAM) 的策略和角色来提供该访问信息。作为此过程的一部分，您为用户提供对 AmazonS3 存储桶或 Amazon EFS 文件系统的访问权限，这些文件系统是文件操作的目标或源。为此，请执行以下简要步骤（稍后将详细介绍）：

**创建用户角色**

1. 为创建 IAM 策略 Amazon Transfer Family。[为创建 IAM 策略 Amazon Transfer Family](#iam-policy-procedure)中对此进行了描述。

1. 创建 IAM 角色并附加新的 IAM policy。有关示例，请参阅[read/write 访问策略示例](#read-write-access)。

1. 在和 IAM 角色 Amazon Transfer Family 之间建立信任关系。[建立信任关系](#establish-trust-transfer)中对此进行了描述。

以下过程介绍如何创建 IAM policy 和角色。<a name="iam-policy-procedure"></a>

**为创建 IAM 策略 Amazon Transfer Family**

1. 使用 [https://console.aws.amazon.com/iam/](https://console.amazonaws.cn/iam/) 打开 IAM 控制台。

1. 在导航窗格中，选择 **策略**，然后选择 **创建策略**。

1. 在**创建策略**页面上，选择 **JSON** 选项卡。

1. 在显示的编辑器中，将编辑器的内容替换为要附加到 IAM 角色的 IAM policy。

   您可以授予 read/write 访问权限或限制用户访问其主目录。有关更多信息，请参阅 [read/write 访问策略示例](#read-write-access)。

1. 选择**查看策略**，并提供策略的名称和描述，然后选择**创建策略**。

接下来，您将创建一个 IAM 角色并向该角色附加新的 IAM 策略。<a name="iam-role-procedure"></a>

**为创建 IAM 角色 Amazon Transfer Family**

1. 在导航窗格中，选择**角色**，然后选择**创建角色**。

   在**创建角色**页面上，确保已选择**Amazon 服务**。

1. 从服务列表中选择**转移**，然后选择**下一步：权限**。这在 Amazon Transfer Family 和之间建立了信任关系 Amazon。

1. 在**附加权限策略**部分中，找到并选择刚刚创建的策略，然后选择**下一步：标签**。

1. （可选）输入标签的键和值，然后选择**下一步：审核**。

1. 在**审核**页面上，输入新角色的名称和描述，然后选择**创建角色**。

接下来，在 Amazon Transfer Family 和之间建立信任关系 Amazon。<a name="establish-trust-transfer"></a>

**建立信任关系**
**注意**  
在我们的示例中，我们同时使用 `ArnLike` 和 `ArnEquals`。它们在功能上是相同的，因此您可以在制定策略时使用其中任何一个。Transfer Family 文档在条件包含通配符时使用`ArnLike`，`ArnEquals`用于表示完全匹配的条件。

1. 在 IAM 控制台中，选择您刚创建的角色。

1. 在 **Summary (摘要)** 页面上，选择 **Trust relationships (信任关系)**，然后选择 **Edit trust relationship (编辑信任关系)**。

1. 在**编辑信任关系**编辑器中，确保**服务**是`"transfer.amazonaws.com"`。编辑后的访问策略如下所示。  
****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Principal": {
           "Service": "transfer.amazonaws.com"
         },
         "Action": "sts:AssumeRole"
       }
     ]
   }
   ```

   建议您使用 `aws:SourceAccount` 和 `aws:SourceArn` 条件键来防止出现混淆代理人问题。源账户是域的所有者，并且源 ARN 是域的 ARN。例如：

   ```
   "Condition": {
       "StringEquals": {
           "aws:SourceAccount": "account_id"
       },
       "ArnLike": {
           "aws:SourceArn": "arn:aws:transfer:region:account_id:user/*"
       }
   }
   ```

   如果您希望限制到特定的服务器而不是用户账户中的任何服务器，也可以使用`ArnLike`条件。例如：

   ```
   "Condition": {    
       "ArnLike": {
           "aws:SourceArn": "arn:aws:transfer:region:account-id:user/server-id/*"
       }
   }
   ```
**注意**  
在上面的示例中，用您自己的信息替换每个*user input placeholder*示例。

   有关混淆代理人问题的详细信息以及更多示例，请参阅 [防止跨服务混淆代理](confused-deputy.md)。

1. 选择**更新信任策略**以更新访问策略。

现在，您已经创建了一个 IAM 角色， Amazon Transfer Family 允许您代表您调用 Amazon 服务。您已将创建的 IAM policy 附加到该角色，以授予对用户的访问权限。在[Amazon Transfer Family 服务器端点入门](getting-started.md)部分中，此角色和策略将分配给您的用户或用户。

**另请参阅**
+ 有关 IAM 角色的更多一般信息，请参阅 I [A *M 用户指南*中的创建角色以向 Amazon 服务委派权限](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_roles_create_for-service.html)。
+ 要详细了解 Amazon S3 资源基于身份的策略，请参阅 *Amazon 简单存储服务用户指南*中的 [Amazon S3 中的身份和访问管理](https://docs.amazonaws.cn/AmazonS3/latest/userguide/s3-access-control.html)。
+ 要了解有关 Amazon EFS 资源基于身份的策略的更多信息，请参阅 *Amazon 弹性文件系统用户指南*中的[使用 IAM 控制文件系统数据访问](https://docs.amazonaws.cn/efs/latest/ug/iam-access-control-nfs-efs.html)。

## 会话策略工作原理
<a name="session-policy"></a>

管理员创建角色时，该角色通常包含涵盖多个用例或团队成员的广泛权限。如果管理员配置了[控制台 URL](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_roles_use.html)，则他们可以使用*会话策略*来减少对生成的会话的权限。例如，如果您创建具有[读/写访问权限](#read-write-access)的角色，则可以设置一个 URL，限制用户只能访问其主目录。

会话策略是当您以编程方式为角色或用户创建临时会话时作为参数传递的高级策略。会话策略对于锁定用户非常有用，这样他们就只能访问存储桶中包含其用户名的对象前缀的部分。下图显示了会话策略的权限是会话策略和基于资源的策略的交集，以及会话策略和基于身份策略的交集。

![\[会话策略权限 Venn 图。显示基于资源的策略、基于身份的策略和会话策略交叉点权限的有效性。\]](http://docs.amazonaws.cn/transfer/latest/userguide/images/EffectivePermissions-session-rbp-id.png)


有关更多详细信息，请参阅 *IAM 用户指南*中的[会话策略](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies.html#policies_session)。

在中 Amazon Transfer Family，只有当您向 Amazon S3 传输或从 Amazon S3 传输数据时，才支持会话策略。以下示例策略是一个会话策略，它仅限制用户访问其 `home` 目录。注意以下几点：
+ 只有当您需要启用跨账户存取时，才需要`GetObjectACL`和`PutObjectACL`语句。也就是说，您的 Transfer Family 服务器需要访问其他账户中的存储桶。
+  会话策略的最大长度为 2048 个字符。有关更多详细信息，请参阅 *API 参考*中 `CreateUser` 操作的[策略请求参数](https://docs.amazonaws.cn/transfer/latest/APIReference/API_CreateUser.html#API_CreateUser_RequestSyntax)。
+  如果您的 Amazon S3 存储桶使用 Amazon Key Management Service (Amazon KMS) 进行加密，则必须在策略中指定其他权限。有关更多信息，请参阅 [数据保护和加密](encryption-at-rest.md)。
+ 要使用会话策略根据用户属性创建访问权限，而不必为每个用户创建单独的 IAM 角色，请参阅[动态权限管理方法](dynamic-permission-management.md)。

****  

```
{
    "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:DeleteObject",
                "s3:DeleteObjectVersion",
                "s3:GetObjectVersion",
                "s3:GetObjectACL",
                "s3:PutObjectACL"
            ],
            "Resource": "arn:aws:s3:::${transfer:HomeDirectory}/*"
        }
    ]
}
```

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

在前面的示例策略中，请注意使用`transfer:HomeFolder`、`transfer:HomeBucket`和`transfer:HomeDirectory`策略参数。这些参数是为用户配置的设置的，如[HomeDirectory](https://docs.amazonaws.cn/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` 访问权限。

## read/write 访问策略示例
<a name="read-write-access"></a>

**授予 read/write 对 Amazon S3 存储桶的访问权限**  
以下示例策略 Amazon Transfer Family 授予对您的 Amazon S3 存储桶中对象的 read/write 访问权限。

注意以下几点：
+ 将 `amzn-s3-demo-bucket` 替换为您的 Amazon S3 存储桶的名称。
+ 只有当您需要启用跨账户存取时，才需要 `GetObjectACL` 和 `PutObjectACL` 语句。也就是说，您的 Transfer Family 服务器需要访问其他账户中的存储桶。
+ 只有在正在访问的 Amazon S3 存储桶上启用版本控制时，才需要使用`GetObjectVersion`和`DeleteObjectVersion`语句。
**注意**  
如果您*曾经为存储桶启用过*版本控制，则需要这些权限，因为您只能在 Amazon S3 中暂停版本控制，而不能完全将其关闭。有关详细信息，请参阅[未版本化、启用版本控制和已暂停版本控制的存储](https://docs.amazonaws.cn/AmazonS3/latest/userguide/Versioning.html#versioning-states)桶。

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowListingOfUserFolder",
            "Action": [
                "s3:ListBucket",
                "s3:GetBucketLocation"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-bucket"
            ]
        },
        {
            "Sid": "HomeDirObjectAccess",
            "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/*"
        }
    ]
}
```

**授予文件系统访问 Amazon EFS 文件系统中文件的权限**  


**注意**  
除了策略外，您还必须确保您的 POSIX 文件权限授予了相应的访问权限。有关更多信息，请参阅 *Amazon Elastic File System 用户指南*中的[在网络文件系统 (NFS) 级别处理用户、组和权限](https://docs.amazonaws.cn/efs/latest/ug/accessing-fs-nfs-permissions.html)。

以下示例策略允许根文件系统访问您的 Amazon EFS 文件系统中的文件。

**注意**  
在以下示例中，*region*替换为您所在的地区、*account-id*文件所在的账户以及*file-system-id*您的亚马逊弹性文件系统 (Amazon EFS) 的 ID。

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "RootFileSystemAccess",
            "Effect": "Allow",
            "Action": [
                "elasticfilesystem:ClientRootAccess",
                "elasticfilesystem:ClientMount",
                "elasticfilesystem:ClientWrite"
            ],
            "Resource": "arn:aws:elasticfilesystem:us-east-1:123456789012:file-system/file-system-id"
        }
    ]
}
```

以下示例策略授予用户文件系统访问您的 Amazon EFS 文件系统中文件的权限。

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "UserFileSystemAccess",
            "Effect": "Allow",
            "Action": [
                "elasticfilesystem:ClientMount",
                "elasticfilesystem:ClientWrite"
            ],
            "Resource": "arn:aws:elasticfilesystem:us-east-1:123456789012:file-system/file-system-id"
        }
    ]
}
```