

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

# 管理服务器端点的用户
<a name="create-user"></a>

在以下各节中，您可以找到有关如何使用 AWS Transfer Family AWS Directory Service for Microsoft Active Directory 或自定义身份提供商添加用户的信息。

作为各个用户属性的一部分，您还可以存储该用户的安全外壳 (SSH) 公有密钥。基于密钥的身份验证需要这样做。私有密钥存储在您用户的计算机本地。当用户使用客户端发送身份验证请求到服务器时，您的服务器首先确认用户具有关联 SSH 私有密钥的访问权限。然后，服务器成功验证用户身份。

**注意**  
有关自动部署和管理拥有多个 SSH 密钥的用户，请参阅[Transfer Family terraform 模块](terraform.md)。

此外，您指定用户的主目录或登录目录，并将 AWS Identity and Access Management IAM 角色分配给用户。或者，您可以提供一个会话策略来限制用户仅访问 AmazonS3 存储桶的主目录。

**重要**  
AWS Transfer Family 阻止长度为 1 或 2 个字符的用户名向 SFTP 服务器进行身份验证。此外，我们还屏蔽了 `root` 用户名。  
其背后的原因是密码扫描器进行了大量的恶意登录尝试。

## Amazon EFS 与 Amazon S3
<a name="efs-vs-s3-users"></a>

每种存储选项的特点：
+ 限制访问权限：Amazon S3 支持会话策略；Amazon EFS 支持 POSIX 用户、群组和辅助群组 IDs
+  两者都支持 public/private 按键 
+  两者都支持主目录 
+  两者都支持逻辑目录 
**注意**  
 对于 Amazon S3，对逻辑目录的大部分支持是通过 API/CLI 实现的。您可以使用控制台中的**受限**复选框将用户锁定至其主目录，但不能指定虚拟目录结构。

## 逻辑目录
<a name="logical-dir-users"></a>

如果要为用户指定逻辑目录值，则使用的参数取决于用户的类型。
+ 对于服务托管的用户，请在 `HomeDirectoryMappings` 中提供逻辑目录值。
+ 对于自定义身份提供商用户，请在中提供逻辑目录值`HomeDirectoryDetails`。

AWS Transfer Family 支持在使用 LO HomeDirectory GICAL 时指定值 HomeDirectoryType。这适用于响应中提供的服务托管用户、Active Directory 访问权限和自定义身份提供 HomeDirectoryDetails 者实现。

**重要**  
 HomeDirectory 使用 LOGICAL 指定 a 时 HomeDirectoryType，该值必须映射到您的一个逻辑目录映射。该服务在用户创建和更新过程中都会对此进行验证，以防止配置失效。

### 默认 行为
<a name="logical-dir-default"></a>

默认情况下，如果未指定， HomeDirectory 则逻辑模式将设置为 “/”。此行为保持不变，并且与现有用户定义保持兼容。
+ 确保将您的映射 HomeDirectory 到*条目*而不是*目标*。有关更多详细信息，请参阅[使用逻辑目录的规则](logical-dir-mappings.md#logical-dir-rules)。
+ 有关虚拟目录结构的详细信息，请参阅[虚拟目录结构](implement-log-dirs.md#virtual-dirs)。

### 自定义身份提供商注意事项
<a name="logical-dir-custom-idp"></a>

使用自定义身份提供商时，您现在可以在使用 LOGICA HomeDirectory L 的同时在响应中指定 HomeDirectoryType。当自定义 IDP 在逻辑模式下指定时， TestIdentityProvider API 调用将生成正确的结果。 HomeDirectory 

带有 HomeDirectory 和逻辑 HomeDirectoryType的自定义 IDP 响应示例：

```
{
  "Role": "arn:aws:iam::123456789012:role/transfer-user-role",
  "HomeDirectoryType": "LOGICAL",
  "HomeDirectory": "/marketing",
  "HomeDirectoryDetails": "[{\"Entry\":\"/\",\"Target\":\"/bucket/home\"},{\"Entry\":\"/marketing\",\"Target\":\"/marketing-bucket/campaigns\"}]"
}
```

## 活动目录组配额
<a name="ad-group-quotas"></a>

AWS Transfer Family 默认限制为每台服务器 100 个 Active Directory 组。如果您的用例需要超过 100 个群组，请考虑使用自定义身份提供商解决方案，如使用自定义身份提供商[简化 Active Directory 身份验证](https://aws.amazon.com/blogs/storage/simplify-active-directory-authentication-with-a-custom-identity-provider-for-aws-transfer-family/)中所述 AWS Transfer Family。

此限制适用于使用以下身份提供商的服务器：
+ AWS 微软 Active Directory 的目录服务
+ AWS 适用于 Entra ID 域服务的目录服务

如果您需要申请提高服务限制，请参阅中的[AWS 服务 配额*AWS 一般参考*](https://docs.aws.amazon.com/general/latest/gr/aws_service_limits.html)。如果您的用例需要超过 100 个群组，请考虑使用自定义身份提供商解决方案，如使用自定义身份提供商[简化 Active Directory 身份验证](https://aws.amazon.com/blogs/storage/simplify-active-directory-authentication-with-a-custom-identity-provider-for-aws-transfer-family/)中所述 AWS Transfer Family。

有关 Active Directory 组限制的疑难解答信息，请参阅[已超出活动目录组限制](auth-issues.md#managed-ad-group-limits)。

**Topics**
+ [Amazon EFS 与 Amazon S3](#efs-vs-s3-users)
+ [逻辑目录](#logical-dir-users)
+ [活动目录组配额](#ad-group-quotas)
+ [与服务托管用户合作](service-managed-users.md)
+ [使用自定义身份提供程序](custom-idp-intro.md)
+ [使用微软 Active Directory 的 AWS 目录服务](directory-services-users.md)
+ [将 AWS Directory Service 用于 Entra ID 域服务](azure-sftp.md)

# 与服务托管用户合作
<a name="service-managed-users"></a>

您可以将 Amazon S3 或 Amazon EFS 服务托管用户添加到您的服务器，具体取决于服务器的**域**设置。有关更多信息，请参阅 [配置 SFTP、FTPS 或 FTP 服务器端点](tf-server-endpoint.md)。

如果您使用服务托管身份类型，则将用户添加到您启用文件传输协议的服务器。在执行此操作时，服务器上的各个用户名必须唯一。

要以编程方式添加服务管理用户，请参阅 AP [I 示例](https://docs.aws.amazon.com/transfer/latest/APIReference/API_CreateUser.html#API_CreateUser_Examples)。[CreateUser](https://docs.aws.amazon.com/transfer/latest/APIReference/API_CreateUser.html)

**注意**  
对于服务管理的用户，逻辑目录条目的限制为 2,000 个。有关使用逻辑目录的信息，请参见[使用逻辑目录简化您的 Transfer Family 目录结构](logical-dir-mappings.md)。

**Topics**
+ [添加 Amazon S3 服务托管用户](#add-s3-user)
+ [添加 Amazon EFS 服务托管用户](#add-efs-user)
+ [管理服务托管用户](#managing-service-managed-users)

## 添加 Amazon S3 服务托管用户
<a name="add-s3-user"></a>

**注意**  
 如果要配置跨账户 Amazon S3 存储桶，请按照知识中心文章中提到的步骤进行[操作：如何将 AWS Transfer Family 服务器配置为使用其他 AWS 账户中的 Amazon 简单存储服务存储桶？](https://aws.amazon.com/premiumsupport/knowledge-center/sftp-cross-account-s3-bucket/) 。

**将 Amazon S3 服务托管用户添加至您的服务器**

1. 打开 AWS Transfer Family 控制台 [https://console.aws.amazon.com/transfer/](https://console.aws.amazon.com/transfer/)，然后从导航窗格中选择 “**服务器**”。

1. 在**服务器**页面上，选中您要将用户添加到的服务器复选框。

1. 选择**添加用户**。

1. 在**用户配置**部分的**用户名**中，输入用户名。此用户名长度最少为 3 个字符，最多为 100 个字符 你可以在用户名中使用以下字符：a—z、A-Z、0—9、下划线 '\$1'、连字符 '-'、句点 '.' 和 at 符号 '@'。用户名不能以连字符 “-”、“句点” 或 “@” 开头。

1. 对于**访问权限**，选择您之前创建的提供对 Amazon S3 存储桶访问权限的 IAM 角色。

   您可使用[创建 IAM 角色和策略](requirements-roles.md)中的过程创建此 IAM 角色。该 IAM 角色包括一个提供对您 Amazon S3 存储桶访问权限的 IAM policy。它还包括与 AWS Transfer Family 服务的信任关系，该关系在另一个 IAM 策略中定义。如果您需要对用户进行精细的访问控制，请参阅使用[AWS Transfer Family 和 Amazon S3 增强数据访问控制](https://aws.amazon.com/blogs/storage/enhance-data-access-control-with-aws-transfer-family-and-amazon-s3-access-points/)博客文章。

1. （可选）对于**策略**，选择下列选项之一：
   + **无**
   + **现有策略**
   + **从 IAM 中选择策略**：允许您选择现有的会话策略。选择**查看**以查看包含策略详细信息的 JSON 对象。
   + **基于主文件夹自动生成策略**：为您生成会话策略。选择**查看**以查看包含策略详细信息的 JSON 对象。
**注意**  
如果选择**基于主文件夹自动生成策略**，请不要为此用户选择**受限**。

   要了解有关会话策略的更多信息，请参阅[创建 IAM 角色和策略](requirements-roles.md)[为 Amazon S3 存储桶创建会话策略](users-policies-session.md)、或[动态权限管理方法](dynamic-permission-management.md)。

1. 对于**主目录**，选择用于存储要传输的数据的 Amazon S3 存储桶 AWS Transfer Family。输入用户在使用其客户端登录时转到的 `home` 目录的路径。

   如果您将此参数留空，则使用 Amazon S3 存储桶的 `root` 目录。在这种情况下，请确保您的 IAM 角色提供对此 `root` 目录的访问权限。
**注意**  
我们建议您选择包含用户的用户名的目录路径，这使得您可以更高效地使用会话策略。会话策略将用户在 Amazon S3 存储桶中的访问权限限制为该用户的 `home` 目录。

1. （可选）对于**受限**，选中该复选框，这样您的用户就无法访问该文件夹之外的任何内容，也看不到 Amazon S3 存储桶或文件夹名称。
**注意**  
为用户分配主目录并限制用户访问该主目录应该足以锁定用户对指定文件夹的访问权限。如果您需要应用进一步的控制措施，请使用会话策略。  
如果您为此用户选择**受限**，则无法选择**基于主文件夹自动生成策略**，因为主文件夹不是为受限用户定义的值。

1. 对于 **SSH 公有密钥**，输入 SSH 密钥对的 SSH 公有密钥部分。

   您的密钥先由服务进行验证，然后才能添加新用户。
**注意**  
有关如何生成 SSH 密钥对的说明，请参阅 [为服务托管用户生成 SSH 密钥](sshkeygen.md)。

1. （可选）对于**键**和**值**，输入一个或多个标记作为键-值对，然后选择**添加标记**。

1. 选择 **Add (添加)** 可将您的新用户添加到所选服务器。

   新用户将出现在**服务器详细信息**页面的**用户**部分。

**后续步骤** — 对于下一步，请继续前往 [使用客户端通过服务器端点传输文件](transfer-file.md)。

## 添加 Amazon EFS 服务托管用户
<a name="add-efs-user"></a>

Amazon EFS 使用便携式操作系统接口 (POSIX) 文件权限模型来表示文件所有权。
+  有关 Amazon EFS 文件所有权的更多详细信息，请参阅 [Amazon EFS 文件所有权](configure-storage.md#efs-file-ownership)。
+ 有关为 EFS 用户设置目录的更多详细信息，请参阅 [为 Transfer Family 设置 Amazon EFS 用户](configure-storage.md#configure-efs-users-permissions)。

**将 Amazon EFS 服务托管用户添加至您的服务器**

1. 打开 AWS Transfer Family 控制台 [https://console.aws.amazon.com/transfer/](https://console.aws.amazon.com/transfer/)，然后从导航窗格中选择 “**服务器**”。

1. 在**服务器**页面上，选择要向其添加用户的 Amazon EFS 服务器。

1. 选择**添加用户**以显示**添加用户**页面。

1. 在**用户配置**部分中，使用以下设置。

   1. 此**用户名**长度最少为 3 个字符，最多为 100 个字符。您可以在用户名中使用以下字符：a–z、A-Z、0–9、下划线“\$1”、连字符“-”、句点“.”和“@”符号。用户名不能以连字符“-”、句点“.”或“@”符号开头。

   1.  对于**用户 ID** 和**组 ID**，请注意以下几点：
      + 对于您创建的第一个用户，我们建议您为**组 ID** 和**用户 ID** 输入一个值 **0**。这将授予用户使用 Amazon EFS 的管理员权限。
      + 对于其他用户，请输入用户的 POSIX 用户 ID 和组 ID。 IDs 它们用于用户执行的所有 Amazon Elastic File System 操作。
      + 对于**用户 ID** 和**组 ID**，请勿使用任何前导零。例如，可以接受 **12345**，但不能接受 **012345**。

   1. （可选）对于**辅助组 IDs**，为每个用户输入一个或多个其他 POSIX 组 IDs ，用逗号分隔。

   1. 对于**访问权限**，请选择符合以下条件的 IAM 角色：
      + 仅允许用户访问您希望他们访问的 Amazon EFS 资源（文件系统）。
      + 定义用户可以执行哪些文件系统操作和不能执行哪些文件系统操作。

      我们建议您使用具有挂载访问 read/write 权限和权限的 Amazon EFS 文件系统选择的 IAM 角色。例如，以下两个 AWS 托管策略的组合虽然相当宽松，但可以为您的用户授予必要的权限：
      +  AmazonElasticFileSystemClientFullAccess 
      +  AWSTransferConsoleFullAccess 

      有关更多信息，请参阅 [AWS Transfer Family 对 Amazon Elastic File System 的支持](https://aws.amazon.com/blogs/aws/new-aws-transfer-family-support-for-amazon-elastic-file-system/)博客文章。

   1. 对于**主目录**，请执行以下操作：
      + 选择您希望用于存储使用 AWS Transfer Family传输的数据的 Amazon EFS 文件系统。
      + 决定是否将主目录设置为**受限**。将主目录设置为**受限**会产生以下影响：
        + Amazon EFS 用户无法访问该文件夹之外的任何文件或目录。
        + Amazon EFS 用户看不到 Amazon EFS 文件系统名称 (**fs-xxxxxxx**)。
**注意**  
当您选择**受限**选项时，符号链接无法为 Amazon EFS 用户解析。
      + （可选）输入您希望用户在使用客户端登录时进入的主目录路径。

        如果您未指定主目录，则使用您的 Amazon EFS 文件系统的根目录。在这种情况下，请确保您的 IAM 角色提供对此根目录的访问权限。

1. 对于 **SSH 公有密钥**，输入 SSH 密钥对的 SSH 公有密钥部分。

   您的密钥先由服务进行验证，然后才能添加新用户。
**注意**  
有关如何生成 SSH 密钥对的说明，请参阅 [为服务托管用户生成 SSH 密钥](sshkeygen.md)。

1. （可选）为用户输入任何标签。对于**键**和**值**，输入一个或多个标记作为键-值对，然后选择**添加标记**。

1. 选择 **Add (添加)** 可将您的新用户添加到所选服务器。

   新用户将出现在**服务器详细信息**页面的**用户**部分。

 首次通过 SFTP 连接到 Transfer Family 服务器时可能会遇到的问题：
+  如果您运行 `sftp` 命令但提示符未出现，则可能会遇到以下消息：

   `Couldn't canonicalize: Permission denied` 

   `Need cwd` 

   在这种情况下，您必须增加用户角色的策略权限。您可以添加 AWS 托管策略，例如`AmazonElasticFileSystemClientFullAccess`。
+ 如果您在`sftp`提示`pwd`时输入查看用户的主目录，则可能会看到以下消息，其中*USER-HOME-DIRECTORY*是 SFTP 用户的主目录：

   `remote readdir("/USER-HOME-DIRECTORY"): No such file or directory` 

  在这种情况下，您应该能够导航到父目录 (`cd ..`)，并创建用户的主目录 (`mkdir username`)。

**后续步骤** — 对于下一步，请继续前往 [使用客户端通过服务器端点传输文件](transfer-file.md)。

## 管理服务托管用户
<a name="managing-service-managed-users"></a>

 在本部分中，您可以找到有关如何查看用户列表、如何编辑用户详细信息以及如何添加 SSH 公有密钥的信息。
+ [查看用户列表](#list-users)
+ [查看或编辑用户详细信息](#view-user-details)
+ [删除用户](#delete-user)
+ [添加 SSH 公钥](#add-user-ssh-key)
+ [删除 SSH 公钥](#delete-user-ssh-key)<a name="list-users"></a>

**查找您的用户列表**

1. 打开 AWS Transfer Family 控制台，网址为[https://console.aws.amazon.com/transfer/](https://console.aws.amazon.com/transfer/)。

1. 从导航窗格中选择**服务器**以显示**服务器**页面。

1. 选择**服务器 ID** 列中的标识符以查看**服务器详细信息**页面。

1. 在**用户**下，查看用户列表。<a name="view-user-details"></a>

**要查看或编辑用户详细信息**

1. 打开 AWS Transfer Family 控制台，网址为[https://console.aws.amazon.com/transfer/](https://console.aws.amazon.com/transfer/)。

1. 从导航窗格中选择**服务器**以显示**服务器**页面。

1. 选择**服务器 ID** 列中的标识符以查看**服务器详细信息**页面。

1. 在**用户**下，选择一个用户名以查看**用户详细信息**页面。

   您可以通过选择**编辑**来更改该页面上的用户属性。

1. 在**用户详细信息**页面上，选择**用户配置**旁边的**编辑**。  
![\[该图显示了编辑用户配置的屏幕\]](http://docs.aws.amazon.com/zh_cn/transfer/latest/userguide/images/edit-user-details-page-user-config.png)

1. 在**编辑配置**页面上的**访问权限**，选择您之前创建的 IAM 角色，该角色提供对您的 Amazon S3 存储桶的访问权限。

   您可使用[创建 IAM 角色和策略](requirements-roles.md)中的过程创建此 IAM 角色。该 IAM 角色包括一个提供对您 Amazon S3 存储桶访问权限的 IAM policy。它还包括与 AWS Transfer Family 服务的信任关系，该关系在另一个 IAM 策略中定义。

1. （可选）对于**策略**，请选择以下选项之一：
   + **无**
   + **现有策略**
   + **从 IAM 中选择策略**以选择现有策略。选择**查看**以查看包含策略详细信息的 JSON 对象。

   要了解有关会话策略的更多信息，请参阅 [创建 IAM 角色和策略](requirements-roles.md)。要了解有关创建会话策略的更多信息，请参阅 [为 Amazon S3 存储桶创建会话策略](users-policies-session.md)。

1. 对于**主目录**，选择用于存储要传输的数据的 Amazon S3 存储桶 AWS Transfer Family。输入用户在使用其客户端登录时转到的 `home` 目录的路径。

   如果您将此参数留空，则使用 Amazon S3 存储桶的 `root` 目录。在这种情况下，请确保您的 IAM 角色提供对此 `root` 目录的访问权限。
**注意**  
我们建议您选择包含用户的用户名的目录路径，这使得您可以更高效地使用会话策略。会话策略将用户在 Amazon S3 存储桶中的访问权限限制为该用户的 `home` 目录。

1. （可选）对于**受限**，选中该复选框，这样您的用户就无法访问该文件夹之外的任何内容，也看不到 Amazon S3 存储桶或文件夹名称。
**注意**  
当为用户分配主目录并限制用户访问该主目录时，这应该足以锁定用户对指定文件夹的访问权限。当您需要应用进一步的控制措施，请使用会话策略。

1. 选择 **保存** 以保存您的更改。<a name="delete-user"></a>

**删除用户**

1. 打开 AWS Transfer Family 控制台，网址为[https://console.aws.amazon.com/transfer/](https://console.aws.amazon.com/transfer/)。

1. 从导航窗格中选择**服务器**以显示**服务器**页面。

1. 选择**服务器 ID** 列中的标识符以查看**服务器详细信息**页面。

1. 在**用户**下，选择一个用户名以查看**用户详细信息**页面。

1. 在**用户详细信息**页面上，选择用户名右侧的**删除**。

1. 在显示的确认对话框中，输入单词 **delete**，然后选择**删除**以确认您要删除该用户。

 将从**用户**列表中删除该用户。<a name="add-user-ssh-key"></a>

**为用户添加 SSH 公钥**

1. 打开 AWS Transfer Family 控制台，网址为[https://console.aws.amazon.com/transfer/](https://console.aws.amazon.com/transfer/)。

1. 在导航窗格中，选择**服务器**。

1. 选择**服务器 ID** 列中的标识符以查看**服务器详细信息**页面。

1. 在**用户**下，选择一个用户名以查看**用户详细信息**页面。

1. 选择 **Add SSH public key (添加 SSH 公有密钥)** 以向用户添加新的 SSH 公有密钥。
**注意**  
SSH 密钥仅由启用 Secure Shell (SSH) 文件传输协议 (SFTP) 的服务器使用。有关如何生成 SSH 密钥对的信息，请参阅 [为服务托管用户生成 SSH 密钥](sshkeygen.md)。

1. 对于 **SSH public key (SSH 公有密钥)**，输入 SSH 密钥对的 SSH 公有密钥部分。

   您的密钥先由服务进行验证，然后才能添加新用户。SSH 密钥的格式为 `ssh-rsa string`。要生成 SSH 密钥对，请参阅 [为服务托管用户生成 SSH 密钥](sshkeygen.md)。

1. 选择**添加密钥**。<a name="delete-user-ssh-key"></a>

**删除用户的 SSH 公钥**

1. 打开 AWS Transfer Family 控制台，网址为[https://console.aws.amazon.com/transfer/](https://console.aws.amazon.com/transfer/)。

1. 在导航窗格中，选择**服务器**。

1. 选择**服务器 ID** 列中的标识符以查看**服务器详细信息**页面。

1. 在**用户**下，选择一个用户名以查看**用户详细信息**页面。

1. 要删除公钥，请选中其 SSH 密钥复选框并选择**删除**。

# 使用自定义身份提供程序
<a name="custom-idp-intro"></a>

AWS Transfer Family 为自定义身份提供商提供了多种选项，用于对用户进行身份验证和授权，以实现安全的文件传输。以下是主要方法：
+ [自定义身份提供商解决方案](custom-idp-toolkit.md)— 本主题使用中托管的工具包介绍 Transfer Family 自定义身份提供商解决方案。 GitHub
**注意**  
对于大多数用例，这是推荐的选项。具体而言，如果您需要支持 100 个以上的 Active Directory 群组，则自定义身份提供商解决方案可提供不受群组限制的可扩展替代方案。此解决方案在博客文章《[使用自定义身份提供商简化 Active Directory 身份验证](https://aws.amazon.com/blogs/storage/simplify-active-directory-authentication-with-a-custom-identity-provider-for-aws-transfer-family/)》中进行了介绍 AWS Transfer Family。
+ [使用 Amazon API Gateway 整合您的身份提供程序](authentication-api-gateway.md)— 本主题介绍如何使用 AWS Lambda 函数支持 Amazon API Gateway 方法。

  您可以使用单个 Amazon API Gateway 方法提供 RESTful 接口。Transfer Family 调用此方法连接到您的身份提供程序，该提供程序会对您的用户进行身份验证和授权，使其能够访问 Amazon S3 或 Amazon EFS。如果您需要一个 RESTful API 来集成您的身份提供商，或者想要利用其功能来处理地理封锁或速率限制请求，请使用 AWS WAF 此选项。有关更多信息，请参阅 [使用 Amazon API Gateway 整合您的身份提供程序](authentication-api-gateway.md)。
+ [动态权限管理方法](dynamic-permission-management.md)— 本主题介绍使用会话策略动态管理用户权限的方法。

  要对您的用户进行身份验证，可以将现有的身份提供程序与 AWS Transfer Family一同使用。您可以使用 AWS Lambda 函数集成您的身份提供程序，该函数会对您的用户进行身份验证和授权，使其能够访问 Amazon S3 或 Amazon Elastic File System (Amazon EFS)。有关更多信息，请参阅 [AWS Lambda 用于整合您的身份提供商](custom-lambda-idp.md)。您还可以访问 AWS Transfer Family 管理控制台中传输的文件数和字节数等指标的 CloudWatch 图表，从而通过单一控制面板使用集中式仪表板监控文件传输。
+ Transfer Family 提供了一篇博客文章和一个研讨会，引导你完成文件传输解决方案的构建。该解决方案利用托管 SFTP/FTPS 终端节点 AWS Transfer Family ，利用 Amazon Cognito 和 DynamoDB 进行用户管理。

  该博客文章可在[使用 Amazon Cognito 作为身份提供商 AWS Transfer Family 和 Amazon S3 上](https://aws.amazon.com/blogs/storage/using-amazon-cognito-as-an-identity-provider-with-aws-transfer-family-and-amazon-s3/)找到。您可以[在此](https://catalog.workshops.aws/transfer-family-sftp/en-US)处查看研讨会的详细信息。

**注意**  
对于自定义身份提供商，用户名必须至少为 3 个字符，最多 100 个字符。你可以在用户名中使用以下字符：a—z、A-Z、0—9、下划线 '\$1'、连字符 '-'、句点 '.' 和 at 符号 '@'。用户名不能以连字符 “-”、“句点” 或 “@” 开头。

在实现自定义身份提供商时，请考虑以下最佳实践：
+ 将解决方案部署在与 Trans AWS 账户 fer Family 服务器相同的区域。
+ 在配置 IAM 角色和策略时实施最低权限原则。
+ 使用 IP 允许名单和标准化日志记录等功能来增强安全性。
+ 部署之前，请在非生产环境中彻底测试您的自定义身份提供商。

**Topics**
+ [自定义身份提供商解决方案](custom-idp-toolkit.md)
+ [AWS Lambda 用于整合您的身份提供商](custom-lambda-idp.md)
+ [使用 Amazon API Gateway 整合您的身份提供程序](authentication-api-gateway.md)
+ [使用多种身份验证方法](custom-idp-mfa.md)
+ [IPv6 支持自定义身份提供商](custom-idp-ipv6.md)

# 自定义身份提供商解决方案
<a name="custom-idp-toolkit"></a>

 AWS Transfer Family 自定义身份提供商解决方案是一种模块化的自定义身份提供商解决方案，可解决企业在实施服务时遇到的许多常见身份验证和授权用例。该解决方案为通过精细的每用户会话配置实现自定义身份提供商提供了可重复使用的基础，并将身份验证和授权逻辑分开，为各种用例提供了灵活的 easy-to-maintain基础。

借助 AWS Transfer Family 自定义身份提供商解决方案，您可以解决常见的企业身份验证和授权用例。该模块化解决方案提供：
+ 实现自定义身份提供商的可重复使用的基础 
+ 精细的每用户会话配置 
+ 独立的身份验证和授权逻辑 

## 自定义身份工具包的实现细节
<a name="idp-toolkit-implementation-details"></a>

该解决方案为各种用例提供了灵活且可维护的基础。要开始使用，请查看 [https://github.com/aws-samples/toolkit-for-aws-transfer-family](https://github.com/aws-samples/toolkit-for-aws-transfer-family) 中的工具包，然后按照[入门](https://github.com/aws-samples/toolkit-for-aws-transfer-family/tree/main/solutions/custom-idp#getting-started)部分中的部署说明进行操作。

![\[中提供的自定义身份提供商工具包的架构图 GitHub。\]](http://docs.aws.amazon.com/zh_cn/transfer/latest/userguide/images/custom-idp-solution-high-level-architecture.png)


**注意**  
如果您之前使用过自定义身份提供商模板和示例，请考虑改用此解决方案。展望未来，特定于提供商的模块将以此解决方案为基础进行标准化。将对该解决方案进行持续维护和功能增强。

此解决方案包含用于实现自定义提供程序的标准模式，该提供程序会考虑详细信息，包括日志记录以及在何处存储所需的其他会话元数据 AWS Transfer Family，例如`HomeDirectoryDetails`参数。该解决方案为通过精细的每用户会话配置实现自定义身份提供者提供了可重复使用的基础，并将身份提供者身份验证逻辑与可重用逻辑分离，后者构建的配置返回给 Transfer Family 以完成身份验证并建立会话设置。

该解决方案的代码和支持资源可在 [https://github.com/aws-samples/toolkit-for-aws-transfer-famil](https://github.com/aws-samples/toolkit-for-aws-transfer-family) y 中找到。

该工具包包含以下功能：
+ 预置所需资源的[AWS Serverless Application Model](https://aws.amazon.com/serverless/sam)模板。（可选）部署和配置要合并的 Amazon API Gateway AWS WAF，如博客文章《[AWS Transfer Family 使用 AWS Web 应用程序防火墙和 Amazon API Gateway 确保安全](https://aws.amazon.com/blogs/storage/securing-aws-transfer-family-with-aws-web-application-firewall-and-amazon-api-gateway/)》中所述。
+ A [mazon Dy](https://aws.amazon.com/dynamodb) namoDB 架构，用于存储有关身份提供商的配置元数据，包括用户会话设置，`HomeDirectoryDetails`例如`Role`、和。`Policy`
+ 一种模块化方法，允许您将来将新的身份提供者作为模块添加到解决方案中。
+ 属性检索：（可选）从支持的身份提供商（包括 AD、LDAP 和 Okta）检索 IAM 角色和 POSIX 配置文件（UID 和 GID）属性。
+ 支持使用相同的解决方案部署连接到单个 Transfer Family 服务器和多个 Transfer Family 服务器的多个身份提供商。
+ 内置 IP 允许列表检查，例如 IP 允许列表，可以选择根据每个用户或每个身份提供商进行配置。
+ 详细的日志记录以及可配置的日志级别和跟踪支持，以帮助进行故障排除。

在开始部署自定义身份提供商解决方案之前，您需要具备以下 AWS 资源。
+ 带有私有子网的亚马逊虚拟私有云 (VPC)，可通过 NAT 网关或 DynamoDB 网关终端节点进行互联网连接。
+ 执行以下任务的相应的 IAM 权限：
  + 部署`custom-idp.yaml` CloudFormation 模板，
  + 创建 AWS CodePipeline 项目
  + 创建 AWS CodeBuild 项目
  + 创建 IAM 角色和策略

**重要**  
您必须将解决方案部署到包含目标 Trans AWS 账户 f AWS 区域 er Family 服务器的相同服务器上。

## 支持的身份提供商
<a name="custom-supported-idp"></a>

以下列表包含自定义身份提供商解决方案支持的身份提供商的详细信息。


| Provider | 密码流 | 公钥流 | 多因子 | 属性检索 | Details | 
| --- | --- | --- | --- | --- | --- | 
| 活动目录和 LDAP | 支持 | 是 | 否 | 是 | 用户验证可以作为公钥身份验证流程的一部分来执行。 | 
| Argon2（本地哈希） | 是 | 否 | 否 | 否 | Argon2 哈希存储在基于 “本地” 密码的身份验证用例的用户记录中。 | 
| Amazon Cognito | 是 | 否 | 是\$1 | 否 | 仅限基于时间的一次性密码 (TOTP) 的多因素身份验证。 \$1不支持基于短信的 MFA。 | 
| 入口 ID（以前是 Azure AD） | 是 | 否 | 否 | 否 |  | 
| Okta | 支持 | 是 | 是\$1 | 是 | 仅限基于 TOTP 的 MFA。 | 
| 公有密钥 | 否 | 是 | 否 | 否 | 公钥存储在 DynamoDB 的用户记录中。 | 
| Secrets Manager  | 支持 | 是 | 否 | 否 |  | 

# AWS Lambda 用于整合您的身份提供商
<a name="custom-lambda-idp"></a>

本主题介绍如何创建连接到您的自定义身份提供商的 AWS Lambda 函数。您可以使用任何自定义身份提供商，例如 Okta、Secrets Manager 或包含授权和身份验证逻辑的自定义数据存储。 OneLogin

对于大多数用例，配置自定义身份提供商的推荐方法是使用[自定义身份提供商解决方案](custom-idp-toolkit.md)。

**注意**  
在创建使用 Lambda 作为身份提供程序的 Transfer Family 服务器之前，必须创建该函数。有关示例 Lambda 函数，请参阅 [Lambda 函数示例](#lambda-auth-examples)。或者，您可以部署使用其中一个的 CloudFormation 堆栈[Lambda 函数模板](#lambda-idp-templates)。此外，请确保您的 Lambda 函数使用信任 Transfer Family 的基于资源的策略。有关策略示例，请参阅 [Lambda 资源策略](#lambda-resource-policy)。

1. 打开 [AWS Transfer Family 控制台](https://console.aws.amazon.com/transfer/)。

1. 选择“**创建服务器**”以打开“**创建服务器**”页面。**在“选择身份提供程序**”中，选择“**自定义身份提供程序**”，如以下屏幕截图所示。  
![\[选择身份提供程序控制台部分，其中已选中自定义身份提供程序。还选择了默认值，即用户可以使用其密码或密钥进行身份验证。\]](http://docs.aws.amazon.com/zh_cn/transfer/latest/userguide/images/custom-lambda-console.png)
**注意**  
只有启用 SFTP 作为 Transfer Family 服务器的协议之一时，才能选择身份验证方法。

1. 确保选择了默认值 “** AWS Lambda 用于连接您的身份提供商**”。

1. 对于 **AWS Lambda 函数**，选择 Lambda 函数名称。

1. 填写其余的方框，然后选择“**创建服务器**”。有关创建服务器的其余步骤的详细信息，请参阅 [配置 SFTP、FTPS 或 FTP 服务器端点](tf-server-endpoint.md)。

## Lambda 资源策略
<a name="lambda-resource-policy"></a>

您必须有一个引用 Transfer Family 服务器和 Lambda ARNs 的策略。例如，您可以将以下策略与连接到您的身份提供程序的 Lambda 函数一起使用。策略会以 JSON 格式转义为字符串。

****  

```
"Policy":
"{\"Version\":\"2012-10-17\",
\"Id\":\"default\",
\"Statement\":[
  {\"Sid\":\"AllowTransferInvocation\",
  \"Effect\":\"Allow\",
  \"Principal\":{\"Service\":\"transfer.amazonaws.com\"},
  \"Action\":\"lambda:InvokeFunction\",
  \"Resource\":\"arn:aws:lambda:region:123456789012:function:my-lambda-auth-function\",
  \"Condition\":{\"ArnLike\":{\"AWS:SourceArn\":\"arn:aws:transfer:region:123456789012:server/server-id\"}}}
]}"
```

**注意**  
在上面的示例政策中，用您自己的信息替换每项*user input placeholder*政策。

## 事件消息结构
<a name="event-message-structure"></a>

来自自定义 IDP 的 SFTP 服务器发送给授权程序 Lambda 函数的事件消息结构如下所示。

```
{
    "username": "value",
    "password": "value",
    "protocol": "SFTP",
    "serverId": "s-abcd123456",
    "sourceIp": "192.168.0.100"
}
```

其中 `username` 和 `password` 是发送到服务器的登录凭证的值。

例如，您可输入以下连接命令。

```
sftp bobusa@server_hostname
```

系统会提示您输入密码：

```
Enter password:
    mysecretpassword
```

您可以在 Lambda 函数中进行检查，方法是在 Lambda 函数中打印传递的事件。此部分与以下文本块类似。

```
{
    "username": "bobusa",
    "password": "mysecretpassword",
    "protocol": "SFTP",
    "serverId": "s-abcd123456",
    "sourceIp": "192.168.0.100"
}
```

FTP 和 FTPS 的事件结构类似：唯一的区别是 `protocol` 参数会使用这些值，而不是 SFTP。

## 用于身份验证的 Lambda 函数
<a name="authentication-lambda-examples"></a>

要实现不同的身份验证策略，请编辑 Lambda 函数。为了帮助您满足应用程序的需求，您可以部署堆 CloudFormation 栈。有关更多信息，请参见 [AWS Lambda 开发人员指南](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) 或 [ 通过 Node.js 构建 Lambda 函数](https://docs.aws.amazon.com/lambda/latest/dg/lambda-nodejs.html)。

**Topics**
+ [有效的 Lambda 值](#lambda-valid-values)
+ [Lambda 函数示例](#lambda-auth-examples)
+ [测试您的配置](#authentication-test-configuration)
+ [Lambda 函数模板](#lambda-idp-templates)

### 有效的 Lambda 值
<a name="lambda-valid-values"></a>

下表详细介绍了 Transfer Family 接受的用于自定义身份提供程序的 Lambda 函数的值。


|  值  |  说明  |  必填  | 
| --- | --- | --- | 
|  `Role`  |  指定控制用户对 Amazon S3 存储桶或 Amazon EFS 文件系统访问权限的 IAM 角色的 Amazon Resource Name (ARN) 。附加到此角色的策略确定在将文件传入和传出 Amazon S3 存储桶或 Amazon EFS 文件系统时要为用户提供的访问权限级别。IAM 角色还应包含一个信任关系，从而允许服务器在为用户的传输请求提供服务时访问您的资源。 有关建立信任关系的详细信息，请参阅 [建立信任关系](requirements-roles.md#establish-trust-transfer)。  |  必需  | 
|  `PosixProfile`  |  控制用户访问您的 Amazon EFS 文件系统的完整 POSIX 身份，包括用户 ID IDs (`Uid``Gid``SecondaryGids`)、群组 ID () 和任何辅助群组 ()。POSIX 权限针对文件系统中的文件和目录设置，用于确定用户在将文件传入和传出 Amazon EFS 文件系统时获得的访问权限级别。  |  Amazon EFS 后备存储为必填项  | 
|  `PublicKeys`  |  对此用户有效的 SSH 公钥值列表。空列表表示这不是有效的登录名。密码认证期间不得返回。  |  可选  | 
|  `Policy`  |  适用于您的用户的会话策略，可让您跨多个用户使用相同的 IAM 角色。此策略将用户的访问范围缩小至 Amazon S3 存储桶的一部分。有关使用自定义身份提供商的会话策略的更多信息，请参阅本主题中的会话策略示例。  |  可选  | 
|  `HomeDirectoryType`  |  您希望用户在登录服务器时，用户主目录的登录目录（文件夹）的类型。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/transfer/latest/userguide/custom-lambda-idp.html)  |  可选  | 
|  `HomeDirectoryDetails`  |  逻辑目录映射指定哪些 Amazon S3 或 Amazon EFS 路径和密钥应对您的用户可见，以及使其对用户可见的方式。您需要指定 `Entry` 和 `Target` 对，其中 `Entry` 显示如何使路径可见，`Target` 是实际的 Amazon S3 或 Amazon EFS 路径。  |  如果 `HomeDirectoryType` 值为 `LOGICAL`，则为必填项  | 
|  `HomeDirectory`  |  用户使用客户端登录服务器时的登录目录。格式取决于您的存储后端： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/transfer/latest/userguide/custom-lambda-idp.html)  路径中必须包含存储桶名称或 Amazon EFS 文件系统 ID。省略此信息将导致文件传输过程中出现 “找不到文件” 错误。   |  可选  | 

**注意**  
`HomeDirectoryDetails` 是 JSON 映射的字符串表示形式。这与 `PosixProfile` 形成鲜明对比，后者是一个实际的 JSON 映射对象，`PublicKeys` 是一个字符串的 JSON 数组。有关特定语言的详细信息，请参阅代码示例。

**HomeDirectory 格式要求**  
使用`HomeDirectory`参数时，请确保包含完整的路径格式：  
**对于 Amazon S3 存储：**请务必使用以下格式包含存储桶名称 `/bucket-name/path`
**对于 Amazon EFS 存储：**请务必使用以下格式包含文件系统 ID `/fs-12345/path`
“找不到文件” 错误的一个常见原因是`HomeDirectory`路径中省略了存储桶名称或 EFS 文件系统 ID。如果设置`HomeDirectory`为`/`不带存储标识符，则会导致身份验证成功，但文件操作失败。

### Lambda 函数示例
<a name="lambda-auth-examples"></a>

本节介绍了一些 NodeJS 和 Python 中的 Lambda 函数示例。

**注意**  
在这些示例中，用户、角色、POSIX 配置文件、密码和主目录详细信息均为示例，必须将其替换为实际值。

------
#### [ Logical home directory, NodeJS ]

[以下 NodeJS 示例函数为拥有逻辑主目录](https://docs.aws.amazon.com/transfer/latest/userguide/logical-dir-mappings.html)的用户提供了详细信息。

```
// GetUserConfig Lambda

exports.handler = (event, context, callback) => {
  console.log("Username:", event.username, "ServerId: ", event.serverId);

  var response;
  // Check if the username presented for authentication is correct. This doesn't check the value of the server ID, only that it is provided.
  if (event.serverId !== "" && event.username == 'example-user') {
    var homeDirectoryDetails = [
      {
        Entry: "/",
        Target: "/fs-faa1a123"
      }
    ];
    response = {
      Role: 'arn:aws:iam::123456789012:role/transfer-access-role', // The user is authenticated if and only if the Role field is not blank
      PosixProfile: {"Gid": 65534, "Uid": 65534}, // Required for EFS access, but not needed for S3
      HomeDirectoryDetails: JSON.stringify(homeDirectoryDetails),
      HomeDirectoryType: "LOGICAL",
    };

    // Check if password is provided
    if (!event.password) {
      // If no password provided, return the user's SSH public key
      response['PublicKeys'] = [ "ssh-rsa abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789" ];
    // Check if password is correct
    } else if (event.password !== 'Password1234') {
      // Return HTTP status 200 but with no role in the response to indicate authentication failure
      response = {};
    }
  } else {
    // Return HTTP status 200 but with no role in the response to indicate authentication failure
    response = {};
  }
  callback(null, response);
};
```

------
#### [ Path-based home directory, NodeJS ]

以下 NodeJS 示例函数为拥有基于路径的主目录的用户提供了详细信息。

```
// GetUserConfig Lambda

exports.handler = (event, context, callback) => {
  console.log("Username:", event.username, "ServerId: ", event.serverId);

  var response;
  // Check if the username presented for authentication is correct. This doesn't check the value of the server ID, only that it is provided.
  // There is also event.protocol (one of "FTP", "FTPS", "SFTP") and event.sourceIp (e.g., "127.0.0.1") to further restrict logins.
  if (event.serverId !== "" && event.username == 'example-user') {
    response = {
      Role: 'arn:aws:iam::123456789012:role/transfer-access-role', // The user is authenticated if and only if the Role field is not blank
      Policy: '', // Optional, JSON stringified blob to further restrict this user's permissions
      // HomeDirectory format depends on your storage backend:
      // For S3: '/bucket-name/user-home-directory' (e.g., '/my-transfer-bucket/users/john')
      // For EFS: '/fs-12345/user-home-directory' (e.g., '/fs-faa1a123/users/john')
      HomeDirectory: '/my-transfer-bucket/users/example-user' // S3 example - replace with your bucket name
      // HomeDirectory: '/fs-faa1a123/users/example-user' // EFS example - uncomment for EFS
    };
    
    // Check if password is provided
    if (!event.password) {
      // If no password provided, return the user's SSH public key
     response['PublicKeys'] = [ "ssh-rsa abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789" ];
    // Check if password is correct
    } else if (event.password !== 'Password1234') {
      // Return HTTP status 200 but with no role in the response to indicate authentication failure
      response = {};
    } 
  } else {
    // Return HTTP status 200 but with no role in the response to indicate authentication failure
    response = {};
  }
  callback(null, response);
};
```

------
#### [ Logical home directory, Python ]

以下 Python 示例函数为拥有[逻辑主目录](https://docs.aws.amazon.com/transfer/latest/userguide/logical-dir-mappings.html)的用户提供了详细信息。

```
# GetUserConfig Python Lambda with LOGICAL HomeDirectoryDetails
import json

def lambda_handler(event, context):
  print("Username: {}, ServerId: {}".format(event['username'], event['serverId']))

  response = {}

  # Check if the username presented for authentication is correct. This doesn't check the value of the server ID, only that it is provided.
  if event['serverId'] != '' and event['username'] == 'example-user':
    homeDirectoryDetails = [
      {
        'Entry': '/',
        'Target': '/fs-faa1a123'
      }
    ]
    response = {
      'Role': 'arn:aws:iam::123456789012:role/transfer-access-role', # The user will be authenticated if and only if the Role field is not blank
      'PosixProfile': {"Gid": 65534, "Uid": 65534}, # Required for EFS access, but not needed for S3
      'HomeDirectoryDetails': json.dumps(homeDirectoryDetails),
      'HomeDirectoryType': "LOGICAL"
    }

    # Check if password is provided
    if event.get('password', '') == '':
      # If no password provided, return the user's SSH public key
     response['PublicKeys'] = [ "ssh-rsa abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789" ]
    # Check if password is correct
    elif event['password'] != 'Password1234':
      # Return HTTP status 200 but with no role in the response to indicate authentication failure
      response = {}
  else:
    # Return HTTP status 200 but with no role in the response to indicate authentication failure
    response = {}

  return response
```

------
#### [ Path-based home directory, Python ]

以下 Python 示例函数为拥有基于路径的主目录的用户提供了详细信息。

```
# GetUserConfig Python Lambda with PATH HomeDirectory

def lambda_handler(event, context):
  print("Username: {}, ServerId: {}".format(event['username'], event['serverId']))

  response = {}

  # Check if the username presented for authentication is correct. This doesn't check the value of the server ID, only that it is provided.
  # There is also event.protocol (one of "FTP", "FTPS", "SFTP") and event.sourceIp (e.g., "127.0.0.1") to further restrict logins.
  if event['serverId'] != '' and event['username'] == 'example-user':
    response = {
      'Role': 'arn:aws:iam::123456789012:role/transfer-access-role', # The user will be authenticated if and only if the Role field is not blank
      'Policy': '', #  Optional, JSON stringified blob to further restrict this user's permissions
      # HomeDirectory format depends on your storage backend:
      # For S3: '/bucket-name/user-home-directory' (e.g., '/my-transfer-bucket/users/john')
      # For EFS: '/fs-12345/user-home-directory' (e.g., '/fs-faa1a123/users/john')
      'HomeDirectory': '/my-transfer-bucket/users/example-user', # S3 example - replace with your bucket name
      # 'HomeDirectory': '/fs-faa1a123/users/example-user', # EFS example - uncomment for EFS
      'HomeDirectoryType': "PATH" # Not strictly required, defaults to PATH
    }
    
    # Check if password is provided
    if event.get('password', '') == '':
      # If no password provided, return the user's SSH public key
     response['PublicKeys'] = [ "ssh-rsa abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789" ]
    # Check if password is correct
    elif event['password'] != 'Password1234':
      # Return HTTP status 200 but with no role in the response to indicate authentication failure
      response = {}
  else:
    # Return HTTP status 200 but with no role in the response to indicate authentication failure
    response = {}

  return response
```

------

### 测试您的配置
<a name="authentication-test-configuration"></a>

创建自定义身份提供程序后，应测试您的配置。

------
#### [ Console ]

**使用 AWS Transfer Family 控制台测试您的配置**

1. 打开 [AWS Transfer Family 控制台](https://console.aws.amazon.com/transfer/)。

1. 在“**服务器**”页面上，选择您的新服务器，选择“**操作**”，然后选择“**测试**”。

1. 输入您在部署 CloudFormation 堆栈时设置的**用户名**和**密码**文本。如果您保留默认选项，则用户名为 `myuser`，密码为 `MySuperSecretPassword`。

1. 如果在部署 CloudFormation 堆栈时设置了**源 IP** 地址，请选择**服务器协议**并输入源 IP 地址。

------
#### [ CLI ]

**使用 AWS CLI 测试您的配置**

1. 运行 [test-identity-provider](https://docs.aws.amazon.com/cli/latest/reference/transfer/test-identity-provider.html) 命令。如后续步骤所述，将 `user input placeholder` 用您自己的信息进行替换。

   ```
   aws transfer test-identity-provider --server-id s-1234abcd5678efgh --user-name myuser --user-password MySuperSecretPassword --server-protocol FTP --source-ip 127.0.0.1
   ```

1. 输入服务器 ID。

1. 输入您在部署 CloudFormation 堆栈时设置的用户名和密码。如果您保留默认选项，则用户名为 `myuser`，密码为 `MySuperSecretPassword`。

1. 如果在部署 CloudFormation 堆栈时设置了服务器协议和源 IP 地址，请输入它们。

------

如果用户身份验证成功，则测试将返回 `StatusCode: 200` HTTP 响应、一个空字符串 `Message: ""`（否则将包含失败原因）和一个 `Response` 字段。

**注意**  
 在下面的响应示例中，`Response` 字段是一个已经 “字符串化” 的 JSON 对象（转换为可在程序中使用的扁平 JSON 字符串），其中包含用户角色和权限的详细信息。

```
{
    "Response":"{\"Policy\":\"{\\\"Version\\\":\\\"2012-10-17\\\",\\\"Statement\\\":[{\\\"Sid\\\":\\\"ReadAndListAllBuckets\\\",\\\"Effect\\\":\\\"Allow\\\",\\\"Action\\\":[\\\"s3:ListAllMybuckets\\\",\\\"s3:GetBucketLocation\\\",\\\"s3:ListBucket\\\",\\\"s3:GetObjectVersion\\\",\\\"s3:GetObjectVersion\\\"],\\\"Resource\\\":\\\"*\\\"}]}\",\"Role\":\"arn:aws:iam::000000000000:role/MyUserS3AccessRole\",\"HomeDirectory\":\"/\"}",
    "StatusCode": 200,
    "Message": ""
}
```

### Lambda 函数模板
<a name="lambda-idp-templates"></a>

您可以部署使用 Lambda 函数进行身份验证的 CloudFormation 堆栈。我们提供了多个模板，可使用登录凭证对您的用户进行身份验证和授权。您可以修改这些模板或 AWS Lambda 代码以进一步自定义用户访问权限。

**注意**  
您可以通过在模板中指定启用 FIPS 的安全策略 CloudFormation 来创建启用 FIPS 的 AWS Transfer Family 服务器。有关可用安全策略的描述，请参见 [AWS Transfer Family 服务器的安全策略](security-policies.md) 

**创建用于身份验证的 CloudFormation 堆栈**

1. 在 [https://console.aws.amazon.com/cloudformat](https://console.aws.amazon.com/cloudformation/) ion 上打开 CloudFormation 控制台。

1. 按照*AWS CloudFormation 用户指南*中的[选择 CloudFormation 堆栈模板中的使用现有模板部署堆栈](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-using-console-create-stack-template.html)的说明进行操作。

1. 使用以下模板之一来创建在 Transfer Family 中进行身份验证的 Lambda 函数。
   + [经典 (Amazon Cognito) 堆栈模板](https://s3.amazonaws.com/aws-transfer-resources/custom-idp-templates/aws-transfer-custom-idp-basic-lambda-cognito-s3.template.yml)

     用于在中创建用作 AWS Lambda 自定义身份提供者的基本模板 AWS Transfer Family。它会针对 Amazon Cognito 进行身份验证以进行基于密码的身份验证，如果使用基于公钥的身份验证，则会从 Amazon S3 存储桶返回公钥。部署后，您可以修改 Lambda 函数代码以执行不同的操作。
   + [AWS Secrets Manager 堆栈模板](https://s3.amazonaws.com/aws-transfer-resources/custom-idp-templates/aws-transfer-custom-idp-secrets-manager-lambda.template.yml)

     与 AWS Transfer Family 服务器 AWS Lambda 一起使用的基本模板，用于将 Secrets Manager 作为身份提供者进行集成。它根据格式`aws/transfer/server-id/username`的条目 AWS Secrets Manager 进行身份验证。此外，该密钥必须包含返回给 Transfer Family 的所有用户属性的键值对。部署后，您可以修改 Lambda 函数代码以执行不同的操作。
   + [Okta 堆栈模板](https://s3.amazonaws.com/aws-transfer-resources/custom-idp-templates/aws-transfer-custom-idp-okta-lambda.template.yml)：与 AWS Transfer Family 服务器 AWS Lambda 一起使用，将 Okta 作为自定义身份提供程序集成的基本模板。
   + [Okta-MFA 堆栈模板](https://s3.amazonaws.com/aws-transfer-resources/custom-idp-templates/aws-transfer-custom-idp-okta-mfa-lambda.template.yml)：一种基本模板，可与 AWS Transfer Family 服务器 AWS Lambda 一起使用，将 Okta 与多因素身份验证集成，作为自定义身份提供商。
   + [Azure Active Directory 模板](https://s3.amazonaws.com/aws-transfer-resources/custom-idp-templates/aws-transfer-custom-idp-basic-lambda-azure-ad.template.yml)：博客文章[使用 Azure 活动目录进行 AWS Transfer Family 身份验证](https://aws.amazon.com/blogs/storage/authenticating-to-aws-transfer-family-with-azure-active-directory-and-aws-lambda/)中描述了此堆栈的详细信息。 AWS Lambda

   部署堆栈后，您可以在 CloudFormation 控制台的**输出**选项卡上查看有关堆栈的详细信息。

   部署其中一个堆栈是将自定义身份提供程序集成到 Transfer Family 工作流程的最简单方法。

# 使用 Amazon API Gateway 整合您的身份提供程序
<a name="authentication-api-gateway"></a>

本主题介绍如何使用 AWS Lambda 函数支持 API Gateway 方法。如果您需要一个 RESTful API 来集成您的身份提供商，或者想要利用其功能来处理地理封锁或速率限制请求，请使用 AWS WAF 此选项。

对于大多数用例，配置自定义身份提供商的推荐方法是使用[自定义身份提供商解决方案](custom-idp-toolkit.md)。

**使用 API Gateway 集成身份提供程序时的限制**
+ 此配置不支持自定义域。
+ 此配置不支持私有 API Gateway 网址。

如果您需要其中任何一个，则可以使用 Lambda 作为身份提供程序，而无需使用 API Gateway。有关更多信息，请参阅 [AWS Lambda 用于整合您的身份提供商](custom-lambda-idp.md)。

## 使用 API Gateway 方法进行身份验证
<a name="authentication-custom-ip"></a>

您可以创建一个 API Gateway 方法，用作 Transfer Family 的身份提供程序。这种方法为您提供了一种高度安全的创建和提供方式 APIs。借助 API Gateway，您可以创建 HTTPS 终端节点，以便以更高的安全性传输所有传入的 API 操作。有关 API Gateway 服务的更多详细信息，请参阅 [API Gateway 开发者指南](https://docs.aws.amazon.com/apigateway/latest/developerguide/welcome.html)。

API Gateway 提供了一种名为的授权方法`AWS_IAM`，该方法为您提供与内部 AWS 使用的相同基于 AWS Identity and Access Management (IAM) 的身份验证。如果您通过 `AWS_IAM` 启用身份验证，则只有具有调用 API 的明确权限的调用程序才能访问该 API 的 API Gateway 方法。

要将您的 API Gateway 方法用作 Transfer Family 的自定义身份提供程序，请为您的 API Gateway 方法启用 IAM。在此过程中，您需要为一个 IAM 角色提供 Transfer Family 使用您的网关的权限。

**注意**  
为了提高安全性，可以配置 Web 应用程序防火墙。 AWS WAF 是一种 Web 应用程序防火墙，可让您监视转发到 Amazon API Gateway 的 HTTP 和 HTTPS 请求。有关更多信息，请参阅 [添加 Web 应用程序防火墙](web-application-firewall.md)。

**不要启用 API Gateway 缓存**  
将 API Gateway 方法用作 Transfer Family 的自定义身份提供者时，请勿为其启用缓存。缓存对身份验证请求不恰当且无效，因为：  
每个身份验证请求都是唯一的，需要实时响应，而不是缓存的响应
缓存没有任何好处，因为 Transfer Family 永远不会向 API Gateway 发送重复或重复的请求
启用缓存将导致 API Gateway 使用不匹配的数据进行响应，从而导致对身份验证请求的响应无效

**使用您的 API Gateway 方法对 Transfer Family 进行自定义身份验证**

1. 创建 CloudFormation 堆栈。要实现此目的，应按照以下步骤进行：
**注意**  
堆栈模板已更新为使用 BASE64编码密码：有关详细信息，请参阅。[对 CloudFormation 模板的改进](#base64-templates)

   1. 在 [https://console.aws.amazon.com/cloudformat](https://console.aws.amazon.com/cloudformation/) ion 上打开 CloudFormation 控制台。

   1. 按照*AWS CloudFormation 用户指南*中的[选择 CloudFormation 堆栈模板中的使用现有模板部署堆栈](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-using-console-create-stack-template.html)的说明进行操作。

   1. 使用以下基本模板之一创建由 AWS Lambda支持的 API Gateway 方法，以便在 Transfer Family 中用作自定义身份提供程序。
      + [基本堆栈模板](https://s3.amazonaws.com/aws-transfer-resources/custom-idp-templates/aws-transfer-custom-idp-basic-apig.template.yml)

        默认情况下，您的 API Gateway 方法用作自定义身份提供者，使用硬编码的 SSH（安全外壳）密钥或密码对单个服务器中的单个用户进行身份验证。部署后，您可以修改 Lambda 函数代码以执行不同的操作。
      + [AWS Secrets Manager 堆栈模板](https://s3.amazonaws.com/aws-transfer-resources/custom-idp-templates/aws-transfer-custom-idp-secrets-manager-apig.template.yml)

        默认情况下，您的 API Gateway 方法会根据格式 `aws/transfer/server-id/username` 的 Secrets Manager 中的条目进行身份验证。此外，该密钥必须包含返回给 Transfer Family 的所有用户属性的键值对。部署后，您可以修改 Lambda 函数代码以执行不同的操作。有关更多信息，请参阅博客文章[启用密码身份验证以供 AWS Transfer Family 使用 AWS Secrets Manager](https://aws.amazon.com/blogs/storage/enable-password-authentication-for-aws-transfer-family-using-aws-secrets-manager-updated/)。
      + [Okta 堆栈模板](https://s3.amazonaws.com/aws-transfer-resources/custom-idp-templates/aws-transfer-custom-idp-okta-apig.template.yml)

        您的 API Gateway 方法与 Okta 集成，以作为 Transfer Family 中的自定义身份提供程序。有关更多信息，请参阅博客文章：[使用 AWS Transfer Family将 Okta 用作身份提供程序](https://aws.amazon.com/blogs/storage/using-okta-as-an-identity-provider-with-aws-transfer-for-sftp/)。

   部署其中一个堆栈是将自定义身份提供程序集成到 Transfer Family 工作流程的最简单方法。每个堆栈都使用 Lambda 函数来支持基于 API Gateway 的 API 方法。然后，您可以在 Transfer Family 中使用您的 API 方法作为自定义身份提供程序。默认情况下，Lambda 函数对使用 `MySuperSecretPassword` 密码 `myuser` 调用的单个用户进行身份验证。部署后，您可以编辑这些凭证或更新 Lambda 函数代码以执行不同的操作。
**重要**  
我们建议您编辑默认的用户和密码凭证。

   部署堆栈后，您可以在 CloudFormation 控制台的**输出**选项卡上查看有关堆栈的详细信息。这些详细信息包括堆栈的 Amazon 资源名称 (ARN)、堆栈创建的 IAM 角色的 ARN 以及您的新网关的 URL。
**注意**  
如果您使用自定义身份提供商选项为用户启用基于密码的身份验证，并且启用了 API Gateway 提供的请求和响应日志，API Gateway 会将用户的密码记录到您的 Amazon 日志中。 CloudWatch 我们建议不要在生产环境中使用此日志。有关更多信息，请参阅《[ CloudWatch API Gateway *开发者指南》中的 “在 API Gateway 中设置 API* 日志](https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-logging.html)”。

1. 检查您的服务器的 API Gateway 方法配置。要实现此目的，应按照以下步骤进行：

   1. 打开 API Gateway 控制台，网址为[https://console.aws.amazon.com/apigateway/](https://console.aws.amazon.com/apigateway/)。

   1. 选择模板生成的**转移自定义身份提供商基本 CloudFormation 模板 API**。您可能需要选择您的区域才能看到您的网关。

   1. 在 “**资源**” 窗格中，选择 **GET**。以下屏幕截图显示了正确的方法配置。  
![\[API 配置详细信息，显示请求路径的方法配置参数和 URL 查询字符串的 。\]](http://docs.aws.amazon.com/zh_cn/transfer/latest/userguide/images/apig-config-method-fields.png)

   此时，您的 API Gateway 已准备好部署。

1. 在**操作**，选择**部署 API**。对于**部署阶段**，选择 **prod**，然后选择**部署**。

   成功部署 API Gateway 方法后，在 “阶段” > “**阶段****详情**” 中查看其性能，如以下屏幕截图所示。
**注意**  
复制显示在屏幕顶部的**调用 URL** 地址。下一步可能需要它。  
![\[暂存细节，突出显示调用网址。\]](http://docs.aws.amazon.com/zh_cn/transfer/latest/userguide/images/apig-config-method-invoke.png)

1. 打开 AWS Transfer Family 控制台，网址为[https://console.aws.amazon.com/transfer/](https://console.aws.amazon.com/transfer/)。

1. 在你创建堆栈时，应该已经为你创建了 Transfer Family。如果不是，请使用以下步骤配置您的服务器。

   1. 选择“**创建服务器**”以打开“**创建服务器**”页面。在**“选择身份提供程序**”中，选择“**自定义**”，然后选择“**使用 Amazon API Gateway 连接到您的身份提供程序**”，如以下屏幕截图所示。  
![\[身份提供者屏幕，选择自定义身份提供商，并选择 API Gateway 来连接到您的身份提供商。\]](http://docs.aws.amazon.com/zh_cn/transfer/latest/userguide/images/create-server-choose-idp-custom.png)

   1. 在**提供 Amazon API Gateway 网址**文本框中，粘贴您在本过程的步骤 3 中创建的 API Gateway 端点的**调用 URL** 地址。

   1. 对于**角色**，选择由 CloudFormation 模板创建的 IAM 角色。此角色允许 Transfer Family 调用您的 API Gateway 方法。

      调用角色包含您在步骤 1 中为创建的堆栈选择的堆栈名称。 CloudFormation 格式如下：`CloudFormation-stack-name-TransferIdentityProviderRole-ABC123DEF456GHI`。

   1. 填写其余的方框，然后选择“**创建服务器**”。有关创建服务器的其余步骤的详细信息，请参阅 [配置 SFTP、FTPS 或 FTP 服务器端点](tf-server-endpoint.md)。

## 实施您的 API Gateway 方法
<a name="authentication-api-method"></a>

要为 Transfer Family 创建自定义身份提供程序，您的 API Gateway 方法必须实现资源路径为 `/servers/serverId/users/username/config` 的单个方法。`serverId`和`username`值来自 RESTful 资源路径。此外，在**方法请求**中添加 `sourceIp` 和 `protocol` 作为 **URL 查询字符串参数**，如下图所示。

![\[API Gateway 的资源屏幕显示了GET方法的详细信息。\]](http://docs.aws.amazon.com/zh_cn/transfer/latest/userguide/images/apig-config-method-request.png)


**注意**  
此用户名长度最少为 3 个字符，最多为 100 个字符。你可以在用户名中使用以下字符：a—z、A-Z、0—9、下划线 '\$1'、连字符 '-'、句点 '.' 和 at 符号 '@'。用户名不能以连字符 “-”、“句点” 或 “@” 开头。

如果 Transfer Family 代表您的用户尝试进行密码身份验证，则该服务会提供 `Password:` 标头字段。在没有 `Password:` 标头的情况下，Transfer Family 会尝试通过公钥身份验证来验证您的用户。

当您使用身份提供商对最终用户进行身份验证和授权时，除了验证他们的凭据外，您还可以根据最终用户使用的客户端 IP 地址来允许或拒绝访问请求。您可以使用此功能来确保存储在 S3 存储桶或 Amazon EFS 文件系统中的数据只能通过支持的协议从您指定为可信的 IP 地址进行访问。要启用此功能，必须在查询字符串中包含 `sourceIp`。

如果您为服务器启用了多个协议，并且想要通过多个协议使用相同的用户名提供访问权限，则只要在身份提供程序中设置了每个协议的特定凭据，就可以这样做。要启用此功能，您必须在 RESTful 资源路径中包含该`protocol`值。

您的 API Gateway 方法应始终返回 HTTP 状态码 `200`。任何其他 HTTP 状态代码则表示访问 API 时出错。

**Amazon S3 示例响应**  
示例响应正文是适用于 Amazon S3 的以下格式的 JSON 文档。

```
{
 "Role": "IAM role with configured S3 permissions",
 "PublicKeys": [
     "ssh-rsa public-key1",
     "ssh-rsa public-key2"
  ],
 "Policy": "STS Assume role session policy",
 "HomeDirectory": "/amzn-s3-demo-bucket/path/to/home/directory"
}
```

**注意**  
 策略会以 JSON 格式转义为字符串。例如：  

****  

```
"Policy":
"{
  \"Version\": \"2012-10-17\",
  \"Statement\":
     [
     {\"Condition\":
        {\"StringLike\":
            {\"s3:prefix\":
               [\"user/*\", \"user/\"]}},
     \"Resource\": \"arn:aws:s3:::amzn-s3-demo-bucket\",
     \"Action\": \"s3:ListBucket\",
     \"Effect\": \"Allow\",
     \"Sid\": \"ListHomeDir\"},
     {\"Resource\": \"arn:aws:s3:::*\",
        \"Action\": [\"s3:PutObject\",
        \"s3:GetObject\",
        \"s3:DeleteObjectVersion\",
        \"s3:DeleteObject\",
        \"s3:GetObjectVersion\",
        \"s3:GetObjectACL\",
        \"s3:PutObjectACL\"],
     \"Effect\": \"Allow\",
     \"Sid\": \"HomeDirObjectAccess\"}]
}"
```

以下示例响应会显示用户具有逻辑主目录类型。

```
{
   "Role": "arn:aws:iam::123456789012:role/transfer-access-role-s3",
   "HomeDirectoryType":"LOGICAL",
   "HomeDirectoryDetails":"[{\"Entry\":\"/\",\"Target\":\"/amzn-s3-demo-bucket1\"}]",
   "PublicKeys":[""]
}
```

**Amazon EFS 示例响应**  
示例响应正文是 Amazon EFS 的以下格式的 JSON 文档。

```
{
 "Role": "IAM role with configured EFS permissions",
 "PublicKeys": [
     "ssh-rsa public-key1",
     "ssh-rsa public-key2"
  ],
 "PosixProfile": {
   "Uid": "POSIX user ID",
   "Gid": "POSIX group ID",
   "SecondaryGids": [Optional list of secondary Group IDs],
 },
 "HomeDirectory": "/fs-id/path/to/home/directory"
}
```

`Role` 字段表示身份验证成功。在进行密码身份验证时（当您提供 `Password:` 标头时），您无需提供 SSH 公钥。如果无法对用户进行身份验证，例如，如果密码不正确，则您的方法应返回未设置 `Role` 的响应。此类响应的一个例子是空的 JSON 对象。

 以下示例响应显示了具有逻辑主目录类型的用户。

```
{
    "Role": "arn:aws:iam::123456789012:role/transfer-access-role-efs",
    "HomeDirectoryType": "LOGICAL",
    "HomeDirectoryDetails":"[{\"Entry\":\"/\",\"Target\":\"/faa1a123\"}]",
    "PublicKeys":[""],
    "PosixProfile":{"Uid":65534,"Gid":65534}
}
```

您可以在 JSON 格式的 Lambda 函数中包含用户策略。有关在 Transfer Family 中配置用户策略的更多信息，请参阅 [管理访问控制](users-policies.md)。

## 默认 Lambda 函数
<a name="authentication-lambda-examples-default"></a>

要实施不同的身份验证策略，请编辑您的网关使用的 Lambda 函数。为了帮助您满足应用程序的需求，您可以在 Node.js 中使用以下示例 Lambda 函数。有关更多信息，请参见 [AWS Lambda 开发人员指南](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) 或 [ 通过 Node.js 构建 Lambda 函数](https://docs.aws.amazon.com/lambda/latest/dg/lambda-nodejs.html)。

以下示例 Lambda 函数使用您的用户名、密码（如果您正在执行密码身份验证）、服务器 ID、协议和客户端 IP 地址。您可以使用这些输入的组合来查找您的身份提供程序并确定是否应接受登录。

**注意**  
如果您为服务器启用了多个协议，并且想要通过多个协议使用相同的用户名提供访问权限，则只要在身份提供程序中设置了相关协议的特定凭据，就可以这样做。  
对于文件传输协议 (FTP)，我们建议为 Secure Shell (SSH) 文件传输协议 (SFTP) 和 SSL (FTPS) 文件传输协议设置不同的凭证。我们建议为 FTP 保留单独的凭据，因为与 SFTP 和 FTPS 不同，FTP 以明文形式传输凭据。通过将 FTP 凭证与 SFTP 或 FTPS 隔离开来，如果共享或公开 FTP 凭证，则使用 SFTP 或 FTPS 的工作负载会保持安全。

此示例函数会返回角色和逻辑主目录详细信息以及公钥（如果它执行公钥身份验证）。

创建服务托管用户时，可以设置他们的主目录，无论是逻辑目录还是物理目录均是如此。同样，我们需要 Lambda 函数的结果来传达所需的用户物理或逻辑目录结构。您设置的参数取决于该 [https://docs.aws.amazon.com//transfer/latest/APIReference/API_CreateUser.html#TransferFamily-CreateUser-request-HomeDirectoryType](https://docs.aws.amazon.com//transfer/latest/APIReference/API_CreateUser.html#TransferFamily-CreateUser-request-HomeDirectoryType) 字段的值。
+ `HomeDirectoryType` 设置为 `PATH` — 然后，`HomeDirectory` 字段必须是您的用户可见的 Amazon S3 存储桶绝对前缀或 Amazon EFS 绝对路径。
+ `HomeDirectoryType` 设置为 `LOGICAL` — 请*不要*设置 `HomeDirectory` 字段。相反，我们设置了一个提供所需 Entry/Target 映射的`HomeDirectoryDetails`字段，类似于服务管理用户的[https://docs.aws.amazon.com//transfer/latest/APIReference/API_CreateUser.html#TransferFamily-CreateUser-request-HomeDirectoryMappings](https://docs.aws.amazon.com//transfer/latest/APIReference/API_CreateUser.html#TransferFamily-CreateUser-request-HomeDirectoryMappings)参数中描述的值。

[Lambda 函数示例](custom-lambda-idp.md#lambda-auth-examples) 中列出了示例函数。

## 与一起使用的 Lambda 函数 AWS Secrets Manager
<a name="authentication-lambda-examples-secrets-mgr"></a>

要 AWS Secrets Manager 用作您的身份提供商，您可以使用示例 CloudFormation 模板中的 Lambda 函数。Lambda 函数使用您的凭证查询 Secrets Manager 服务，如果成功，则会返回指定的密钥。有关 Secrets Manager 的更多信息，请参阅《AWS Secrets Manager 用户指南》[https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html)。

要下载使用此 Lambda 函数的示例 CloudFormation 模板，请访问[提供的 Amazon S3 存储桶](https://s3.amazonaws.com/aws-transfer-resources/custom-idp-templates/aws-transfer-custom-idp-secrets-manager-apig.template.yml)。 AWS Transfer Family

## 对 CloudFormation 模板的改进
<a name="base64-templates"></a>

已发布的 CloudFormation模板已对 API Gateway 界面进行了改进。现在，这些模板在 API BASE64 Gateway 中使用经过编码的密码。如果没有此增强功能，您的现有部署将继续运行，但不允许使用基本 US-ASCII 字符集之外的字符的密码。

启用此功能的模板更改如下：
+ `GetUserConfigRequest AWS::ApiGateway::Method`资源必须有这个`RequestTemplates`代码（斜体行是更新的行）

  ```
  RequestTemplates:
     application/json: |
     {
        "username": "$util.urlDecode($input.params('username'))",
        "password": "$util.escapeJavaScript($util.base64Decode($input.params('PasswordBase64'))).replaceAll("\\'","'")",
        "protocol": "$input.params('protocol')",
        "serverId": "$input.params('serverId')",
        "sourceIp": "$input.params('sourceIp')"
  }
  ```
+ `GetUserConfig`资源必须更改`RequestParameters`为使用`PasswordBase64`标题（斜体行是更新的行）：

  ```
  RequestParameters:
     method.request.header.PasswordBase64: false
     method.request.querystring.protocol: false
     method.request.querystring.sourceIp: false
  ```

**检查堆栈的模板是否是最新的**

1. 在 [https://console.aws.amazon.com/cloudformat](https://console.aws.amazon.com/cloudformation/) ion 上打开 CloudFormation 控制台。

1. 从堆栈列表中选择您的堆栈。

1. 在详细信息面板中，选择**模板**选项卡。

1. 寻找以下内容：
   + 搜索`RequestTemplates`并确保你有以下行：

     ```
     "password": "$util.escapeJavaScript($util.base64Decode($input.params('PasswordBase64'))).replaceAll("\\'","'")",
     ```
   + 搜索`RequestParameters`并确保你有以下行：

     ```
     method.request.header.PasswordBase64: false
     ```

如果您没有看到更新的行，请编辑您的堆栈。有关如何更新 CloudFormation 堆栈的详细信息，请参阅《*用户指南》*中的[AWS CloudFormation修改堆栈模板](https://docs.aws.amazon.com//AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-get-template.html)。

# 使用多种身份验证方法
<a name="custom-idp-mfa"></a>

当您使用多种身份验证方法时，Transfer Family 服务器会控制 AND 逻辑。Transfer Family 将其视为向您的自定义身份提供者发出的两个单独请求：但是，它们的效果是结合在一起的。

两个请求都必须成功返回并返回正确的响应，才能完成身份验证。Transfer Family 要求这两个响应必须完整，这意味着它们包含所有必需的元素（角色、主目录、策略和 POSIX 配置文件（如果您使用 Amazon EFS 进行存储）。Transfer Family 还要求密码响应中不得包含公钥。

公钥请求必须有来自身份提供者的单独响应。使用 “密码或密钥” **或 “**密码和**密钥**” 时，这种行为不会改变。

SSH/SFTP 协议首先向软件客户端发送公钥身份验证，然后请求密码身份验证。此操作要求在允许用户完成身份验证之前，两者都必须成功。

对于自定义身份提供商选项，您可以为如何进行身份验证指定以下任一选项。
+ **密码或密钥**-用户可以使用其密码或密钥进行身份验证。这是默认值。
+ **仅限密码**-用户必须提供密码才能连接。
+ **仅限密钥** — 用户必须提供私钥才能连接。
+ **密码和密钥** — 用户必须同时提供私钥和密码才能连接。服务器首先检查密钥，如果密钥有效，系统会提示输入密码。如果提供的私有密钥与存储的公有密钥不匹配，则身份验证失败。

# IPv6 支持自定义身份提供商
<a name="custom-idp-ipv6"></a>

AWS Transfer Family 自定义身份提供商完全支持 IPv6 连接。在实现自定义身份提供商时，您的 Lambda 函数无需任何额外配置即可接收和处理来自双方 IPv4 和 IPv6 客户端的身份验证请求。Lambda 函数在请求`sourceIp`字段中接收客户端的 IP 地址，该地址可以是 IPv4 地址（例如`203.0.113.42`），也可以是 IPv6地址（例如）。`2001:db8:85a3:8d3:1319:8a2e:370:7348`您的自定义身份提供商实现应适当地处理这两种地址格式。

**重要**  
如果您的自定义身份提供商执行基于 IP 的验证或记录，请确保您的实现正确处理 IPv6 地址格式。 IPv6 地址比 IPv4 地址长，并且使用不同的符号格式。

**注意**  
在自定义身份提供商中处理 IPv6 地址时，请确保使用正确 IPv6 的地址解析函数，而不是简单的字符串比较。 IPv6地址可以用各种规范格式表示（例如`fd00:b600::ec2`或`fd00:b600:0:0:0:0:0:ec2`）。使用您的实现语言中的相应 IPv6 地址库或函数来正确验证和比较 IPv6 地址。

**Example 在自定义身份提供商中同时处理 IPv4 和 IPv6 地址**  

```
def lambda_handler(event, context):
    # Extract the source IP address from the request
    source_ip = event.get('sourceIp', '')
    
    # Log the client IP address (works for both IPv4 and IPv6)
    print(f"Authentication request from: {source_ip}")
    
    # Example of IP-based validation that works with both IPv4 and IPv6
    if is_ip_allowed(source_ip):
        # Continue with authentication
        # ...
    else:
        # Reject the authentication request
        return {
            "Role": "",
            "HomeDirectory": "",
            "Status": "DENIED"
        }
```

有关实现自定义身份提供商的更多信息，请参阅[AWS Lambda 用于整合您的身份提供商](custom-lambda-idp.md)。

# 使用微软 Active Directory 的 AWS 目录服务
<a name="directory-services-users"></a>

您可以使用 AWS Transfer Family 对文件传输的最终用户进行身份验证 AWS Directory Service for Microsoft Active Directory。它可以无缝迁移依赖于活动目录身份验证的文件传输工作流程，而无需更改最终用户的凭证或需要自定义授权者。

使用 AWS Managed Microsoft AD，您可以通过 SFTP、FTPS 和 FTP 安全地为 Directory Service 用户和群组提供对存储在亚马逊简单存储服务 (Amazon S3) 或亚马逊弹性文件系统 (Amazon EFS) 中的数据的访问权限。如果您使用活动目录来存储用户的凭证，则现在可以更轻松地为这些用户启用文件传输功能。

您可以使用 Active Directory 连接器在本地环境 AWS Managed Microsoft AD 中或 AWS 云端提供对 Active Directory 组的访问权限。你可以为已经在你的 Microsoft Windows 环境（无论是在 AWS 云端还是在其本地网络中）中配置的用户提供访问 AWS Managed Microsoft AD 用于身份的 AWS Transfer Family 服务器的权限。 AWS 存储博客包含一篇文章，详细介绍了将 Active Directory 与 Transfer Family [配合使用的解决方案：使用自定义身份提供程序简化 Active Directory 身份](https://aws.amazon.com/blogs/storage/simplify-active-directory-authentication-with-a-custom-identity-provider-for-aws-transfer-family/)验证 AWS Transfer Family。

**注意**  
AWS Transfer Family 不支持 Simple AD。
Transfer Family 不支持跨区域活动目录配置：我们仅支持与 Transfer Family 服务器位于同一区域的活动目录集成。
Transfer Family 不支持使用 AD Connecto AWS Managed Microsoft AD r 为现有的基于 RADIUS 的 MFA 基础设施启用多因素身份验证 (MFA)。
AWS Transfer Family 不支持托管活动目录的复制区域。

要使用 AWS Managed Microsoft AD，必须执行以下步骤：

1. 使用 Directory Service 控制台创建一个或多个 AWS Managed Microsoft AD 目录。

1. 使用 Transfer Family 控制台创建 AWS Managed Microsoft AD 用作其身份提供者的服务器。

1. 使用 AWS Active Directory 连接器设置目录。

1. 添加来自一个或多个 Directory Service 群组的访问权限。

1. 尽管不是必需的，但我们建议您测试和验证用户访问权限。

**Topics**
+ [在你开始使用之前 AWS Directory Service for Microsoft Active Directory](#managed-ad-prereq)
+ [使用活动目录领域](#managed-ad-realms)
+ [选择 AWS Managed Microsoft AD 作为您的身份提供商](#managed-ad-identity-provider)
+ [正在连接到本地微软 Active Directory](#on-prem-ad)
+ [授予对组的访问权限](#directory-services-grant-access)
+ [测试用户](#directory-services-test-user)
+ [删除群组的服务器访问权限](#directory-services-misc)
+ [使用 SSH（安全外壳）连接到服务器](#directory-services-ssh-procedure)
+ [使用林和 AWS Transfer Family 信任连接到自我管理的 Active Directory](#directory-services-ad-trust)

## 在你开始使用之前 AWS Directory Service for Microsoft Active Directory
<a name="managed-ad-prereq"></a>

**注意**  
AWS Transfer Family 默认限制为每台服务器 100 个 Active Directory 组。如果您的用例需要超过 100 个群组，请考虑使用自定义身份提供商解决方案，如使用自定义身份提供商[简化 Active Directory 身份验证](https://aws.amazon.com/blogs/storage/simplify-active-directory-authentication-with-a-custom-identity-provider-for-aws-transfer-family/)中所述 AWS Transfer Family。

### 为您的 AD 组提供唯一标识符
<a name="add-identifier-adgroups"></a>

在使用之前 AWS Managed Microsoft AD，必须为 Microsoft AD 目录中的每个群组提供唯一标识符。您可以使用每个组的安全标识符 (SID) 来执行此操作。您关联的群组中的用户可以使用 AWS Transfer Family 通过启用的协议访问您的 Amazon S3 或 Amazon EFS 资源。

使用以下 Windows PowerShell 命令检索组的 SID，*YourGroupName*替换为该组的名称。

```
Get-ADGroup -Filter {samAccountName -like "YourGroupName*"} -Properties * | Select SamAccountName,ObjectSid
```

**注意**  
如果您使用 AWS Directory Service 作为身份提供商，并且如果`userPrincipalName`和`SamAccountName`具有不同的值，则 AWS Transfer Family 接受中的值`SamAccountName`。Transfer Family 不接受 `userPrincipalName` 中指定的值。

### 为您的角色添加 Directory Service 权限
<a name="add-active-directory-permissions"></a>

您还需要 Directory Service API 权限才能 AWS Directory Service 用作您的身份提供商。需要建议使用以下权限：
+ `ds:DescribeDirectories` 是 Transfer Family 查找目录所必需的
+ `ds:AuthorizeApplication` 是为 Transfer Family 添加授权所必需的
+ `ds:UnauthorizeApplication` 是移除所有临时创建的资源，以防服务器创建过程中出现问题所建议的

将这些权限添加到您用于创建 Transfer Family 服务器的角色中。有关这些权限的更多详细信息，请参阅 [Directory Service API 权限：操作、资源和条件参考](https://docs.aws.amazon.com//directoryservice/latest/admin-guide/UsingWithDS_IAM_ResourcePermissions.html)。

## 使用活动目录领域
<a name="managed-ad-realms"></a>

 在考虑如何让活动目录用户访问 AWS Transfer Family 服务器时，请记住用户的领域及其组的领域。理想情况下，用户的领域和他们所在群组的领域应该匹配。也就是说，用户和组都在默认领域中，或者两者都位于可信领域。如果不是这样，Transfer Family 将无法对用户进行身份验证。

您可以测试用户以确保配置正确。有关更多信息，请参阅 [测试用户](#directory-services-test-user)。如果 user/group 领域出现问题，您会收到错误消息，“找不到用户组的关联访问权限。

## 选择 AWS Managed Microsoft AD 作为您的身份提供商
<a name="managed-ad-identity-provider"></a>

本节介绍如何与服务器 AWS Directory Service for Microsoft Active Directory 配合使用。

**要与 Transfer Family AWS Managed Microsoft AD 一起使用**

1. 登录 AWS 管理控制台 并打开 Directory Service 控制台，网址为[https://console.aws.amazon.com/directoryservicev2/](https://console.aws.amazon.com/directoryservicev2/)。

   使用 Directory Service 控制台配置一个或多个托管目录。有关更多信息，请参阅《 Directory Service 管理员指南》中的 [AWS Managed Microsoft AD](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/directory_microsoft_ad.html)。  
![\[Directory Service 控制台显示目录列表及其详细信息。\]](http://docs.aws.amazon.com/zh_cn/transfer/latest/userguide/images/directory-services-AD-list.png)

1. 在打开 AWS Transfer Family 控制台 [https://console.aws.amazon.com/transfer/](https://console.aws.amazon.com/transfer/)，然后选择**创建服务器**。

1. 在**选择协议**页面上，从列表中选择一个或多个协议。
**注意**  
如果选择 **FTPS**，则必须提供 AWS Certificate Manager 证书。

1. 在**选择身份提供程序**中，选择 **AWS 目录服务**。  
![\[控制台屏幕截图显示“选择身份提供程序”部分，其中选择了“目录服务”。\]](http://docs.aws.amazon.com/zh_cn/transfer/latest/userguide/images/create-server-choose-idp-directory-services.png)

1. **目录**列表包含您配置的所有托管目录。从列表中选择目录，然后选择**下一步**。
**注意**  
 不支持跨账户目录和共享目录。 AWS Managed Microsoft AD
要设置以 Directory Service 作为身份提供者的服务器，您需要添加一些 Directory Service 权限。有关更多信息，请参阅 [在你开始使用之前 AWS Directory Service for Microsoft Active Directory](#managed-ad-prereq)。

1. 要完成服务器的创建，请使用下列过程之一：
   + [创建启用 SFTP 的服务器](create-server-sftp.md)
   + [创建启用 FTPS 的服务器](create-server-ftps.md)
   + [创建启用 FTP 的服务器](create-server-ftp.md)

   在这些步骤中，继续执行选择身份提供程序之后的步骤。

**重要**  
 Directory Service 如果你在 Transfer Family 服务器中使用了 Microsoft AD 目录，则无法将其删除。必须先删除服务器，然后才能删除目录。

## 正在连接到本地微软 Active Directory
<a name="on-prem-ad"></a>

本节介绍如何使用 AD Conn AWS ector 设置目录

**使用 AD Connector 设置您的 AWS 目录**

1. 打开 [Directory Service](https://console.aws.amazon.com/directoryservicev2/) 控制台并选择**目录**。

1. 选择**设置目录**。

1. 对于目录类型，请选择 **AD Connector**。

1. 选择目录大小，选择**下一步**，然后选择您的 VPC 和子网。

1. 选择 **下一步**，然后如下所示填写各字段：
   + **目录 DNS 名称**：输入你用于 Microsoft Active Directory 的域名。
   + **DNS IP 地址**：输入你的微软 Active Directory IP 地址。
   + **服务器帐户用户名**和**密码**：输入要使用的服务帐户的详细信息。

1. 完成屏幕内容以创建目录服务。

下一步是使用 SFTP 协议创建一个 Transfer Family 服务器，身份提供者类型为 **AWS Directory Service**。从**目录**下拉列表中，选择您在上一个过程中添加的目录。

## 授予对组的访问权限
<a name="directory-services-grant-access"></a>

 创建服务器后，必须使用已启用的协议选择目录中哪些组有权通过已启用的协议上传和下载文件 AWS Transfer Family。您可以通过创建*访问权限*来实现此目的。

**注意**  
AWS Transfer Family 默认限制为每台服务器 100 个 Active Directory 组。如果您的用例需要超过 100 个群组，请考虑使用自定义身份提供商解决方案，如使用自定义身份提供商[简化 Active Directory 身份验证](https://aws.amazon.com/blogs/storage/simplify-active-directory-authentication-with-a-custom-identity-provider-for-aws-transfer-family/)中所述 AWS Transfer Family。

**注意**  
用户必须*直接*属于您授予访问权限的群组。例如，假设 Bob 是用户并属于 GroupA，而 groupA 本身包含在 groupB 中。  
如果您向 GroupA 授予访问权限，Bob 就会被授予访问权限。
 如果您授予对 GroupB（而不是 GroupA）的访问权限，则 Bob 没有访问权限。

**向组授予访问权限**

1. 打开 AWS Transfer Family 控制台，网址为[https://console.aws.amazon.com/transfer/](https://console.aws.amazon.com/transfer/)。

1. 导航到您的服务器详细信息页面。

1.  在**访问权限**部分中，选择**添加访问权限**。

1.  输入您想要访问此服务器的 AWS Managed Microsoft AD 目录的 SID。
**注意**  
有关如何查找组的 SID 的信息，请参阅 [在你开始使用之前 AWS Directory Service for Microsoft Active Directory](#managed-ad-prereq)。

1. 对于**访问权限**，请为群组选择一个 AWS Identity and Access Management (IAM) 角色。

1.  在**策略**部分，选择一个策略。默认设置为**无**。

1. 对于**主目录**，选择与该组的主目录对应的 Amazon S3 存储桶。
**注意**  
您可以通过创建会话策略来限制用户在存储桶中看到的部分。例如，要将用户限制在 `/filetest` 目录下他们自己的文件夹中，请在框中输入以下文本。  

   ```
   /filetest/${transfer:UserName}
   ```
 要了解有关创建会话策略的更多信息，请参阅 [为 Amazon S3 存储桶创建会话策略](users-policies-session.md)。

1.  选择**添加**以创建关联。

1. 请选择您的服务器。

1. 选择**添加访问权限**。

   1.  输入该组的 SID。
**注意**  
有关如何查找 SID 的信息，请参阅 [在你开始使用之前 AWS Directory Service for Microsoft Active Directory](#managed-ad-prereq)。

1. 选择**添加访问权限**。

 在**访问权限**部分中，列出了服务器的访问权限。

![\[控制台显示“访问权限”部分，其中列出了服务器访问权限。\]](http://docs.aws.amazon.com/zh_cn/transfer/latest/userguide/images/accesses-list.png)


## 测试用户
<a name="directory-services-test-user"></a>

您可以测试用户是否有权访问您的服务器的 AWS Managed Microsoft AD 目录。

**注意**  
用户必须正好属于**端点配置**页面的**访问权限**部分中列出的一个组（外部 ID）。如果用户不属于任何群组，或者属于多个群组，则不会向该用户授予访问权限。

**测试特定用户是否具有访问权限**

1. 在服务器详细信息页面上，选择**操作**，然后选择**测试**。

1. 要进行**身份提供程序测试**，请输入其中一个具有访问权限的群组中的用户的登录凭证。

1.  选择**测试**。

您会看到身份提供程序测试成功，显示所选用户已被授予服务器访问权限。

![\[成功的身份提供程序测试响应的控制台屏幕截图。\]](http://docs.aws.amazon.com/zh_cn/transfer/latest/userguide/images/identity-provider-test-success.png)


如果用户属于多个具有访问权限的群组，则您会收到以下响应。

```
"Response":"",
"StatusCode":200,
"Message":"More than one associated access found for user's groups."
```

## 删除群组的服务器访问权限
<a name="directory-services-misc"></a>

**删除群组的服务器访问权限**

1. 在服务器详细信息页面上，选择**操作**，然后选择**删除访问权限**。

1. 在对话框中，确认您要移除该组的访问权限。

 返回到服务器详细信息页面时，您会看到不再列出该组的访问权限。

## 使用 SSH（安全外壳）连接到服务器
<a name="directory-services-ssh-procedure"></a>

配置服务器和用户后，您可以使用 SSH 连接到服务器，并使用具有访问权限的用户的完全限定用户名。

```
sftp user@active-directory-domain@vpc-endpoint
```

例如：`transferuserexample@mycompany.com@vpce-0123456abcdef-789xyz.vpc-svc-987654zyxabc.us-east-1.vpce.amazonaws.com`。

此格式以联合身份验证搜索为目标，限制了对可能很大的活动目录的搜索。

**注意**  
您可以指定简单的用户名。但是，在这种情况下，活动目录代码必须搜索联合身份验证中的所有目录。这可能会限制搜索，即使用户本应具有访问权限，身份验证也可能失败。

身份验证后，用户位于在配置用户时指定的主目录中。

## 使用林和 AWS Transfer Family 信任连接到自我管理的 Active Directory
<a name="directory-services-ad-trust"></a>

Directory Service 有以下选项可用于连接到自我管理的 Active Directory：
+ 单向林信任（来自本地 Active Directory 的传出 AWS Managed Microsoft AD 和传入）仅适用于根域。
+ 对于子域，您可以使用以下方法之一：
  + 在 AWS Managed Microsoft AD 和本地活动目录之间使用双向信任
  + 对每个子域使用单向外部信任。

例如，当使用可信域连接到服务器时，用户需要指定可信域，例如 `transferuserexample@mycompany.com`。

# 将 AWS Directory Service 用于 Entra ID 域服务
<a name="azure-sftp"></a>

 对于只需要 SFTP 传输且不想管理域的客户，可以使用 Simple Active Directory。或者，想要在完全托管的服务中享受 活动目录的好处和高可用性的客户可以使用 AWS 托管 Microsoft AD。最后，对于想要利用现有活动目录林进行 SFTP 传输的客户，可以使用 Active Directory Connector。

注意以下几点：
+ 要利用现有的活动目录林来满足 SFTP 传输需求，可以使用 [Active Directory Connector](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/directory_ad_connector.html)。
+ 如果您想在完全托管的服务中获得活动目录的好处和高可用性，则可以使用 AWS Directory Service for Microsoft Active Directory。有关更多信息，请参阅 [使用微软 Active Directory 的 AWS 目录服务](directory-services-users.md)。

本主题介绍如何使用 Active Directory 连接器和 E [ntra ID（以前称为 Azure AD）域服务](https://azure.microsoft.com/en-us/services/active-directory-ds/)对具有 Entra ID 的 SFTP Transfer 用户进行身份验证。

**Topics**
+ [在开始使用 Entra ID 域服务的 Di AWS rectory Service 之前](#azure-prereq)
+ [步骤 1：添加 Entra ID 域服务](#azure-add-adds)
+ [步骤 2：创建服务账号](#azure-create-service-acct)
+ [步骤 3：使用 AD Connector 设置 AWS 目录](#azure-setup-directory)
+ [步骤 4：设置 AWS Transfer Family 服务器](#azure-setup-transfer-server)
+ [步骤 5：授予对组的访问权限](#azure-grant-access)
+ [步骤 6：测试用户](#azure-test)

## 在开始使用 Entra ID 域服务的 Di AWS rectory Service 之前
<a name="azure-prereq"></a>

**注意**  
AWS Transfer Family 默认限制为每台服务器 100 个 Active Directory 组。如果您的用例需要超过 100 个群组，请考虑使用自定义身份提供商解决方案，如使用自定义身份提供商[简化 Active Directory 身份验证](https://aws.amazon.com/blogs/storage/simplify-active-directory-authentication-with-a-custom-identity-provider-for-aws-transfer-family/)中所述 AWS Transfer Family。

对于 AWS，你需要以下内容：
+ 位于您使用 Transfer Family 服务器的 AWS 区域中的虚拟私有云 (VPC)
+ 您的 VPC 中至少有两个私有子网
+ VPC 必须具备互联网连接
+ 用于与 Microsoft Entra 的 site-to-site VPN 连接的客户网关和虚拟专用网关

对于 Microsoft Entra，你需要以下内容：
+ Entra ID 和活动目录域服务
+ Entra 资源组
+ Entra 虚拟网络
+ 您的 Amazon VPC 和 Entra 资源组之间的 VPN 连接
**注意**  
这可以通过本地 IPSEC 隧道或使用 VPN 设备实现。在本主题中，我们使用 Entra 虚拟网络网关和本地网络网关之间的 IPSEC 隧道。必须将隧道配置为允许 Entra Domain Service 终端节点和容纳 VPC AWS 的子网之间的流量。
+ 用于与 Microsoft Entra 的 site-to-site VPN 连接的客户网关和虚拟专用网关

下图显示了在开始之前所需的配置。

![\[Entra/Azure AD 和架构图。 AWS Transfer Family 使用连接到 Entra 域服务的 Di AWS rectory Service 连接器，通过互联网连接到 Entra 虚拟网络的 AWS VPC。\]](http://docs.aws.amazon.com/zh_cn/transfer/latest/userguide/images/azure-architecture.png)


## 步骤 1：添加 Entra ID 域服务
<a name="azure-add-adds"></a>

 默认情况下，Entra ID 不支持域加入实例。要执行诸如加入域之类的操作以及使用组策略等工具，管理员必须启用 Entra ID 域服务。如果您尚未添加 Entra DS，或者您的现有实现与您希望 SFTP 传输服务器使用的域名没有关联，则必须添加一个新实例。

有关启用 Entra ID 域服务的信息，请参阅[教程：创建和配置 Microsoft Entra Domain Services 托管域](https://docs.microsoft.com/en-us/azure/active-directory-domain-services/active-directory-ds-getting-started)。

**注意**  
启用 Entra DS 时，请确保已为连接到 SFTP 传输服务器的资源组和 Entra 域进行了配置。

![\[显示资源组 bob. us 正在运行的 Entra 域服务屏幕。\]](http://docs.aws.amazon.com/zh_cn/transfer/latest/userguide/images/azure-ad-add-instance.png)


## 步骤 2：创建服务账号
<a name="azure-create-service-acct"></a>

 Entra 必须有一个属于 Entra DS 中管理员组的服务帐户。此帐户与 Act AWS ive Directory 连接器一起使用。请确保此账户与 Entra DS 同步。

![\[显示用户个人资料的进入屏幕。\]](http://docs.aws.amazon.com/zh_cn/transfer/latest/userguide/images/azure-service-acct.png)


**提示**  
使用 SFTP 协议的 Transfer Family 服务器不支持 Entra ID 的多重身份验证。在用户向 SFTP 进行身份验证后，Transfer Family 服务器无法提供 MFA 令牌。在尝试连接之前，请务必禁用 MFA。  

![\[输入多重身份验证详情，显示两个用户的 MFA 状态为已禁用。\]](http://docs.aws.amazon.com/zh_cn/transfer/latest/userguide/images/azure-ad-mfa-disable.png)


## 步骤 3：使用 AD Connector 设置 AWS 目录
<a name="azure-setup-directory"></a>

 在您配置 Entra DS 并在您的 VPC 和 Entra Virtual 网络之间创建具有 IPSE AWS C VPN 隧道的服务账户后，您可以通过从任何 EC2 实例执行 ping Entra DS DNS IP 地址来测试连接。 AWS 

在您确认连接处于活动状态后，您可以继续执行以下操作。

**使用 AD Connector 设置您的 AWS 目录**

1. 打开 [Directory Service](https://console.aws.amazon.com/directoryservicev2/) 控制台并选择**目录**。

1. 选择**设置目录**。

1. 对于目录类型，请选择 **AD Connector**。

1. 选择目录大小，选择**下一步**，然后选择您的 VPC 和子网。

1. 选择 **下一步**，然后如下所示填写各字段：
   + **目录 DNS 名称**：输入您用于 Entra DS 的域名。
   + **DNS IP 地址**：输入您的 Entra DS IP 地址。
   + **服务器账户用户名**和**密码**：输入您在*步骤 2：创建服务账户*中创建的服务账户的详细信息。

1. 完成屏幕内容以创建目录服务。

现在，目录状态应为**活动**，并且可以与 SFTP 传输服务器一起使用了。

![\[目录服务屏幕根据需要显示一个状态为 “活动” 的目录。\]](http://docs.aws.amazon.com/zh_cn/transfer/latest/userguide/images/azure-connector-ready.png)


## 步骤 4：设置 AWS Transfer Family 服务器
<a name="azure-setup-transfer-server"></a>

使用 SFTP 协议创建 Transfer Family 服务器，身份提供者类型为 **AWS Directory Service**。从**目录**下拉列表中，选择您在*步骤 3：使用 AD Connector 设置 AWS 目录*中添加的目录。

**注意**  
如果你在 Transfer Family 服务器中使用了 Microsoft AD AWS 目录，则无法将其删除。必须先删除服务器，然后才能删除目录。

## 步骤 5：授予对组的访问权限
<a name="azure-grant-access"></a>

 创建服务器后，必须使用已启用的协议选择目录中哪些组有权通过已启用的协议上传和下载文件 AWS Transfer Family。您可以通过创建*访问权限*来实现此目的。

**注意**  
用户必须*直接*属于您授予访问权限的群组。例如，假设 Bob 是用户并属于 GroupA，而 groupA 本身包含在 groupB 中。  
如果您向 GroupA 授予访问权限，Bob 就会被授予访问权限。
 如果您授予对 GroupB（而不是 GroupA）的访问权限，则 Bob 没有访问权限。

 要授予访问权限，您需要检索该组的 SID。

使用以下 Windows PowerShell 命令检索组的 SID，*YourGroupName*替换为该组的名称。

```
Get-ADGroup -Filter {samAccountName -like "YourGroupName*"} -Properties * | Select SamAccountName,ObjectSid
```

![\[Windows PowerShell 显示正在检索对象 SID。\]](http://docs.aws.amazon.com/zh_cn/transfer/latest/userguide/images/azure-grant-access.png)


**授予对组的访问权限**

1. 打开 [https://console.aws.amazon.com/transfer/](https://console.aws.amazon.com/transfer/)。

1. 导航到您的服务器详细信息页面，然后在**访问权限**部分中，选择**添加访问权限**。

1. 输入您从上一个过程的输出中收到的 SID。

1. 在 “**访问权限**” 中，为群组选择一个 AWS Identity and Access Management 角色。

1. 在**策略**部分，选择一个策略。默认值为 **None**（无）。

1. 对于**主目录**，选择与该组的主目录对应的 Amazon S3 存储桶。

1. 选择**添加**以创建关联。

您的 Transfer 服务器中的详细信息应类似于以下内容：

![\[Transfer Family 服务器详细信息屏幕的一部分，显示了身份提供者的目录 ID 示例。\]](http://docs.aws.amazon.com/zh_cn/transfer/latest/userguide/images/azure-assoc-1.png)


![\[Transfer Family 服务器详细信息屏幕的一部分，在屏幕的访问部分显示活动目录的外部 ID。\]](http://docs.aws.amazon.com/zh_cn/transfer/latest/userguide/images/azure-assoc-2.png)


## 步骤 6：测试用户
<a name="azure-test"></a>

您可以测试 ([测试用户](directory-services-users.md#directory-services-test-user)) 用户是否有权访问您的服务器的 AWS Managed Microsoft AD 目录。用户必须正好属于**端点配置**页面的**访问权限**部分中列出的一个组（外部 ID）。如果用户不属于任何群组，或者属于多个群组，则不会向该用户授予访问权限。