

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

# 配置 SFTP、FTPS 或 FTP 服务器端点
<a name="sftp-for-transfer-family"></a>

本主题提供有关创建和使用一个或多个 SFTP、FTPS 和 FTP 协议的 AWS Transfer Family 服务器端点的详细信息。

**Topics**
+ [身份提供商选项](#identity-provider-details)
+ [AWS Transfer Family 端点类型矩阵](#endpoint-matrix)
+ [配置 SFTP、FTPS 或 FTP 服务器端点](tf-server-endpoint.md)
+ [FTP 和 FTPS 网络负载均衡器注意事项](#ftp-ftps-nlb-considerations)
+ [使用客户端通过服务器端点传输文件](transfer-file.md)
+ [管理服务器端点的用户](create-user.md)
+ [使用逻辑目录简化您的 Transfer Family 目录结构](logical-dir-mappings.md)
+ [使用 Transfer Family 访问 FSx 适用于 NetApp ONTAP 的文件系统](fsx-s3-access-points.md)

## 身份提供商选项
<a name="identity-provider-details"></a>

AWS Transfer Family 提供了几种对用户进行身份验证和管理的方法。下表比较了您可以与 Transfer Family 一起使用的可用身份提供商。


| Action | AWS Transfer Family 服务托管 | AWS Managed Microsoft AD | Amazon API Gateway | AWS Lambda | 
| --- | --- | --- | --- | --- | 
| 受支持的协议 | SFTP | SFTP、FTPS、FTP | SFTP、FTPS、FTP | SFTP、FTPS、FTP | 
|  基于密钥的身份验证  |  是  |  否  |  是  |  是  | 
|  密码验证  |  否  |  是  |  是  |  是  | 
|  AWS Identity and Access Management (IAM) 和 POSIX  |  支持  |  是  |  是  |  是  | 
|  逻辑主目录  |  支持  |  是  |  是  |  是  | 
| 参数化访问权限（基于用户名） | 支持 | 是 | 是 | 是 | 
|  临时访问结构  |  是  |  否  |  是  |  是  | 
|  AWS WAF  |  否  |  否  |  是  |  否  | 

备注：
+ IAM 用于控制 Amazon S3 后备存储的访问权限，Amazon EFS 使用 POSIX。
+ *Ad hoc* 是指在运行时发送用户配置文件的能力。例如，您可以通过将用户名作为变量传递来将用户置于他们的主目录中。
+ 有关的详细信息 AWS WAF，请参阅[添加 Web 应用程序防火墙](web-application-firewall.md)。
+ 有一篇博客文章描述了使用与微软 Entra ID（前身为 Azure AD）集成的 Lambda 函数作为 Transfer Family 身份提供商。有关详细信息，请参阅[使用 Azure 活动目录 AWS Transfer Family 进行身份验证和。 AWS Lambda](https://aws.amazon.com/blogs/storage/authenticating-to-aws-transfer-family-with-azure-active-directory-and-aws-lambda/)
+ 我们提供了多个 CloudFormation 模板来帮助您快速部署使用自定义身份提供程序的 Transfer Family 服务器。有关更多信息，请参阅 [Lambda 函数模板](custom-lambda-idp.md#lambda-idp-templates)。

在以下步骤中，您可以创建启用 SFTP 的服务器、启用 FTPS 的服务器、启用 FTP 的服务器或启用 FTP 的服务器。 AS2

**下一步**
+ [创建启用 SFTP 的服务器](create-server-sftp.md)
+ [创建启用 FTPS 的服务器](create-server-ftps.md)
+ [创建启用 FTP 的服务器](create-server-ftp.md)
+ [正在配置 AS2](create-b2b-server.md)

## AWS Transfer Family 端点类型矩阵
<a name="endpoint-matrix"></a>

创建 Transfer Family 服务器时，您需要选择要使用的端点类型。下表介绍了每种端点类型的特性。


**端点类型矩阵**  

| 特征 | Public | VPC - 互联网 | VPC - 内部 | VPC\$1Endpoint（已弃用） | 
| --- | --- | --- | --- | --- | 
| 受支持的协议 | SFTP | SFTP、FTPS、 AS2 | SFTP、FTP、FTPS、 AS2 | SFTP | 
| 访问 | 来自互联网。此端点类型不需要在您的 VPC 中进行任何特殊配置。 | 通过互联网以及在 VPC 和 VPC 连接的环境中，例如本地数据中心或 VPN。 Direct Connect  | 在 VPC 和与 VPC 连接的环境中，例如本地数据中心或 VPN。 Direct Connect  | 在 VPC 和与 VPC 连接的环境中，例如本地数据中心或 VPN。 Direct Connect  | 
| 静态 IP 地址 | 您无法附加静态 IP 地址。 AWS 提供随时可能更改的 IP 地址。 |  您可以将弹性 IP 地址附加到端点。这些地址可以是 AWS自有的 IP 地址或您自己的 IP 地址（[自带 IP 地址](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-byoip.html)）。附加到端点的弹性 IP 地址不会更改。 附加到服务器的私有 IP 地址也不会更改。  | 附加到端点的私有 IP 地址不会更改。 | 附加到端点的私有 IP 地址不会更改。 | 
| 源 IP 允许列表 |  此端点类型不支持按源 IP 地址列出的允许列表。 端点可公开访问并侦听端口 22 上的流量。  对于 VPC 托管的端点，SFTP Transfer Family 服务器可以通过端口 22（默认）、2222、2223 或 22000 运行。   |  要允许通过源 IP 地址进行访问，您可以使用连接到服务器端点的安全组以及 ACLs 连接到终端节点所在子网的网络。  |  要允许通过源 IP 地址进行访问，您可以使用连接到服务器端点的安全组以及连接到端点所在子网的网络访问控制列表（网络 ACLs）。  |  要允许通过源 IP 地址进行访问，您可以使用连接到服务器端点的安全组以及 ACLs 连接到终端节点所在子网的网络。  | 
| 客户端防火墙允许列表 |  您必须允许服务器的 DNS 名称。 由于 IP 地址可能会发生更改，因此请避免将 IP 地址用于您的客户端防火墙允许列表。  |  您可以允许服务器的 DNS 名称或附加到服务器的弹性 IP 地址。  |  您可以允许端点的私有 IP 地址或 DNS 名称。  |  您可以允许端点的私有 IP 地址或 DNS 名称。  | 
| IP 地址类型 | IPv4 （默认）或双堆栈（IPv4 和 IPv6） | IPv4 仅限（不支持双堆栈） | IPv4 （默认）或双堆栈（IPv4 和 IPv6） | IPv4 仅限（不支持双堆栈） | 

**注意**  
`VPC_ENDPOINT` 端点类型现已弃用，无法用于创建新的服务器。不使用`EndpointType=VPC_ENDPOINT`，而是使用 VPC 终端节点类型 (`EndpointType=VPC`)，您可以将其用作**内部**终端节点或**面向 Internet**，如上表所述。  
有关弃用的详细信息，请参阅[停止使用 VPC\$1ENDPOINT您可以使用 Transfer Family 控制台、 AWS CLI SDKs、API 或更改服务器的终端节点类型 CloudFormation。要更改服务器的端点类型，请参阅 [将 AWS Transfer Family 服务器终端节点类型从 VPC\$1ENDPOINT 更新到 VPC](update-endpoint-type-vpc.md)。](create-server-in-vpc.md#deprecate-vpc-endpoint)。
有关管理 VPC 终端节点权限的信息，请参阅[限制 Transfer Family 服务器的 VPC 终端节点访问权限](create-server-in-vpc.md#limit-vpc-endpoint-access)。

考虑以下选项来提高 AWS Transfer Family 服务器的安全状况：
+ 使用具有内部访问权限的 VPC 终端节点，这样只有您的 VPC 或 VPC 连接的环境（例如本地数据中心或 VPN）中的客户端才能访问服务器。 Direct Connect 
+ 要允许客户端通过互联网访问端点并保护您的服务器，请使用具有面向互联网访问权限的 VPC 端点。然后，修改 VPC 的安全组，使其仅允许来自托管用户客户端的某些 IP 地址的流量。
+ 如果您需要基于密码的身份验证，并且在服务器上使用自定义身份提供商，则最佳做法是，您的密码策略可以防止用户创建弱密码并限制失败的登录尝试次数。
+ AWS Transfer Family 是一项托管服务，因此它不提供 shell 访问权限。您无法直接访问底层 SFTP 服务器以在 Transfer Family 服务器上运行 OS 本机命令。
+ 在具有内部访问权限的 VPC 端点前使用网络负载均衡器。将负载均衡器上的侦听器端口从端口 22 更改为其他端口。这可以降低但不能消除端口扫描器和机器人探测服务器的风险，因为端口 22 最常用于扫描。有关详细信息，请参阅博客文章[网络负载均衡器现在支持安全组](https://aws.amazon.com/blogs/containers/network-load-balancers-now-support-security-groups/)。
**注意**  
如果您使用 Network Load Balancer，则 AWS Transfer Family CloudWatch 日志会显示 NLB 的 IP 地址，而不是实际的客户端 IP 地址。

# 配置 SFTP、FTPS 或 FTP 服务器端点
<a name="tf-server-endpoint"></a>

您可以使用该 AWS Transfer Family 服务创建文件传输服务器。以下文件传输协议可用：
+ Secure Shell (SSH) 文件传输协议 (SFTP) — 通过 SSH 的文件传输 有关更多信息，请参阅 [创建启用 SFTP 的服务器](create-server-sftp.md)。
**注意**  
我们提供了创建 SFTP Transfer Family 服务器的 AWS CDK 示例。该示例使用 TypeScript，可 GitHub [在此处](https://github.com/aws-samples/aws-cdk-examples/tree/master/typescript/aws-transfer-sftp-server)找到。
+ 文件传输协议安全 (FTPS) \$1— 使用 TLS 加密的文件传输功能 有关更多信息，请参阅 [创建启用 FTPS 的服务器](create-server-ftps.md)。
+ 文件传输协议 (FTP) — 未加密的文件传输功能 有关更多信息，请参阅 [创建启用 FTP 的服务器](create-server-ftp.md)。
+ 适用性声明 2 (AS2) — 用于传输结构化 business-to-business数据的文件传输。有关更多信息，请参阅 [正在配置 AS2](create-b2b-server.md)。对于 AS2，您可以快速创建 CloudFormation 堆栈以进行演示。有关此过程的说明，请参阅 [使用模板创建演示 Transfer Family AS2 堆栈](create-as2-transfer-server.md#as2-cfn-demo-template)。

您可以创建具有多个协议的服务器。

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

创建服务器时，您可以选择特定的服务器 AWS 区域 来执行分配给该服务器的用户的文件操作请求。除了为服务器分配一个或多个协议外，您还可以分配以下身份提供商类型之一：
+ **使用 SSH 密钥托管的服务**。有关更多信息，请参阅 [与服务托管用户合作](service-managed-users.md)。
+ **AWS Directory Service for Microsoft Active Directory (AWS Managed Microsoft AD)**。 此方法允许你整合 Microsoft Active Directory 群组以提供对 Transfer Family 服务器的访问权限。有关更多信息，请参阅 [使用微软 Active Directory 的 AWS 目录服务](directory-services-users.md)。
+ **自定义身份提供商**。Transfer Family 提供了多种使用自定义身份提供者的选项，如[使用自定义身份提供程序](custom-idp-intro.md)主题中所述。

您还可以使用默认服务器端点为服务器分配端点类型（可公开访问或 VPC 托管）和主机名，或者使用 Amazon Route 53 服务或使用您选择的域名系统 (DNS) 服务为服务器分配自定义主机名。服务器主机名在创建时 AWS 区域 必须是唯一的。

此外，您可以分配 Amazon CloudWatch CloudWatch 日志角色将事件推送到您的日志，选择包含可供服务器使用的加密算法的安全策略，并以键值对的标签形式向服务器添加元数据。

**重要**  
实例化的服务器和数据传输会产生费用。有关定价以及用于估算使用 AWS 定价计算器 Transfer Family 的成本的信息，请参阅[AWS Transfer Family 定价](https://aws.amazon.com/aws-transfer-family/pricing/)。

# 创建启用 SFTP 的服务器
<a name="create-server-sftp"></a>

Secure Shell (SSH) 文件传输协议 (SFTP) 是一种用于通过互联网安全传输数据的网络协议。该协议支持 SSH 的完整安全和身份验证功能。它被广泛应用于金融服务、医疗保健、零售和广告等各行各业的业务合作伙伴之间交换数据，包括敏感信息。

**请注意以下几点**
+ Transfer Family 的 SFTP 服务器通过端口 22 运行。对于 VPC 托管的端点，SFTP Transfer Family 服务器也可以通过端口 2222、2223 或 22000 运行。有关更多信息，请参阅 [在虚拟私有云中创建服务器](create-server-in-vpc.md)。
+ 公共端点无法通过安全组限制流量。要将安全组与 Transfer Family 服务器配合使用，您必须将服务器的终端节点托管在虚拟私有云 (VPC) 内，如中所述[在虚拟私有云中创建服务器](create-server-in-vpc.md)。

**另请参阅**
+ 我们提供了创建 SFTP Transfer Family 服务器的 AWS CDK 示例。该示例使用 TypeScript，可 GitHub [在此处](https://github.com/aws-samples/aws-cdk-examples/tree/master/typescript/aws-transfer-sftp-server)找到。
+ 有关如何在 VPC 内部署 Transfer Family 服务器的演练，请参阅[使用 IP 允许列表保护您的 AWS Transfer Family 服务器](https://aws.amazon.com/blogs//storage/use-ip-allow-list-to-secure-your-aws-transfer-for-sftp-servers/)。

**创建启用 SFTP 的服务器**

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

1. 在**选择协议**中，选择 **SFTP**，然后选择**下一步**。

1. 在**选择身份提供商**中，选择要用于管理用户访问权限的身份提供商。您有以下选项：
   + **服务托管**-您将用户身份和密钥存储在中 AWS Transfer Family。
   + **AWS Directory Service for Microsoft Active Directory**— 您提供用于访问端点的 Directory Service 目录。这样，您就可以使用存储在 Activity Directory 中的凭证对用户进行身份验证。要了解有关与 AWS Managed Microsoft AD 身份提供商合作的更多信息，请参阅[使用微软 Active Directory 的 AWS 目录服务](directory-services-users.md)。
**注意**  
 不支持跨账户目录和共享目录。 AWS Managed Microsoft AD
要设置以 Directory Service 作为身份提供者的服务器，您需要添加一些 Directory Service 权限。有关更多信息，请参阅 [在你开始使用之前 AWS Directory Service for Microsoft Active Directory](directory-services-users.md#managed-ad-prereq)。
   + **自定义身份提供商** — 请选择以下任一选项：
     + ** AWS Lambda 用于连接您的身份提供商**-您可以使用由 Lambda 函数支持的现有身份提供商。您提供 Lambda 函数名称。有关更多信息，请参阅 [AWS Lambda 用于整合您的身份提供商](custom-lambda-idp.md)。
     + **使用 Amazon API Gateway 连接您的身份提供商** — 您可以创建由 Lambda 函数支持的 API 网关方法以用作身份提供商。您提供一个 Amazon API Gateway URL 和一个调用角色。有关更多信息，请参阅 [使用 Amazon API Gateway 整合您的身份提供程序](authentication-api-gateway.md)。  
![\[在选择身份提供商控制台部分，已选择自定义身份提供商。还选择了默认值，即用户可以使用其密码或密钥进行身份验证。\]](http://docs.aws.amazon.com/zh_cn/transfer/latest/userguide/images/custom-lambda-console.png)

1. 选择**下一步**。

1. 在**选择端点**中，执行以下操作：

   1. 对于**端点类型**，选择**可公开访问**的端点类型。有关 **VPC 托管**的端点，请参阅 [在虚拟私有云中创建服务器](create-server-in-vpc.md)。

   1.  对于 **IP 地址类型**，选择 **IPv4**（默认）以实现向后兼容，或者选择 Dual-**Stack** 以同时启用两者 IPv4 以及与终 IPv6端节点的连接。
**注意**  
双栈模式允许你的 Transfer Family 端点 IPv4 与两个 IPv6 已启用的客户端通信。这使您无需同时切换所有系统即可逐步从 IPv4 IPv6 基于系统的过渡。

   1. （可选）对于**自定义主机名**，选择**无**。

      您将获得由提供的服务器主机名 AWS Transfer Family。服务器主机名使用格式 `serverId.server.transfer.regionId.amazonaws.com`。

      对于自定义主机名，您可以为服务器端点指定自定义别名。要了解有关使用自定义主机名的更多信息，请参阅[使用自定义主机名](requirements-dns.md)。

   1. （可选）对于**启用 FIPS**，请选中**启用 FIPS 端点**复选框以确保端点符合联邦信息处理标准 (FIPS)。
**注意**  
启用 FIPS 的端点仅在北美 AWS 地区可用。有关可用区域，请参阅 *AWS 一般参考* 中的 [AWS Transfer Family 端点和限额](https://docs.aws.amazon.com/general/latest/gr/transfer-service.html)。有关 FIPS 的更多信息，请参阅[联邦信息处理标准 (FIPS) 140-2](https://aws.amazon.com/compliance/fips/)。

   1. 选择**下一步**。

1. 在 **“选择域**” 页面上，选择要用于通过所选协议 AWS 存储和访问数据的存储服务：
   + 选择 **Amazon S3**，通过所选协议将您的文件作为对象存储和访问。
   + 选择 **Amazon EFS**，通过所选协议在 Amazon EFS 文件系统中存储和访问您的文件。

   选择**下一步**。

1. 在**配置其他详细信息**中，执行以下操作：

   1. 对于日志记录，指定现有日志组或创建新日志组（默认选项）。如果您选择现有日志组，则必须选择与您的日志组关联的日志组 AWS 账户。  
![\[在创建服务器向导中配置其他详细信息的日志记录窗格。选择“选择现有日志组”。\]](http://docs.aws.amazon.com/zh_cn/transfer/latest/userguide/images/logging-server-choose-existing-group.png)

      如果选择 “**创建日志组**”，则 CloudWatch 控制台 ([https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/)) 将打开 “**创建日志组**” 页面。有关详细信息，请参阅[在 Log CloudWatch s 中创建日志组](https://docs.aws.amazon.com//AmazonCloudWatch/latest/logs/Working-with-log-groups-and-streams.html#Create-Log-Group)。

   1.  （可选）对于**托管工作流程**，选择 Tr IDs ansfer Family 在执行工作流程时应担任的工作流程（和相应的角色）。您可以选择一个工作流程在完成上传后执行，选择另一个工作流程在部分上传时执行。要了解有关使用托管工作流程处理文件的更多信息，请参阅 [AWS Transfer Family 托管工作流程](transfer-workflows.md)。  
![\[托管工作流程控制台部分。\]](http://docs.aws.amazon.com/zh_cn/transfer/latest/userguide/images/workflows-addtoserver.png)

   1. 对于**加密算法选项**，请选择包含允许服务器使用的加密算法的安全策略。我们的最新安全策略是默认策略：有关详细信息，请参阅[AWS Transfer Family 服务器的安全策略](security-policies.md)。

   1. （可选）在**服务器主机密钥**中，输入一个 RSA ED25519、或 ECDSA 私钥，当客户端通过 SFTP 连接到服务器时，该私钥将用于识别您的服务器。您还可以添加描述以区分多个主机密钥。

      创建服务器后，您可以添加其他主机密钥。如果您想轮换密钥或想要使用不同类型的密钥（例如 RSA 密钥和 ECDSA 密钥），则拥有多个主机密钥非常有用。
**注意**  
**服务器主机密钥**部分仅用于从启用 SFTP 的现有服务器迁移用户。

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

   1. 选择**下一步**。

   1. 您可以优化 Amazon S3 目录的性能。例如，假设您进入主目录，并且有 10,000 个子目录。换句话说，您的亚马逊 S3 存储桶有 10,000 个文件夹。在这种情况下，如果您运行 `ls` (list) 命令，则列表操作需要六到八分钟。但是，如果您优化目录，则此操作只需要几秒钟。

      使用控制台创建服务器时，默认情况下会启用优化的目录。如果您使用 API 创建服务器，则默认情况下不启用此行为。  
![\[优化的目录控制台部分。\]](http://docs.aws.amazon.com/zh_cn/transfer/latest/userguide/images/optimized-directories.png)

   1. （可选）配置 AWS Transfer Family 服务器以向最终用户显示自定义消息，例如组织政策或条款和条件。对于**显示横幅**，在**预身份验证显示横幅**文本框中，输入要在用户进行身份验证之前向其显示的短信。

   1. （可选）您可以配置以下其他选项。
      + **SetStat 选项**：启用此选项可忽略客户端尝试对您上传到 Amazon S3 存储桶的文件使用`SETSTAT`时生成的错误。有关更多详细信息，请参阅中的`SetStatOption`文档[ProtocolDetails](https://docs.aws.amazon.com/transfer/latest/APIReference/API_ProtocolDetails.html)。
      + **TLS 会话恢复**：仅当您启用 FTPS 作为该服务器的协议之一时，此选项才可用。
      + **被动 IP**：仅当您启用 FTPS 或 FTP 作为该服务器的协议之一时，此选项才可用。  
![\[服务器详细信息页面的其他选项屏幕。\]](http://docs.aws.amazon.com/zh_cn/transfer/latest/userguide/images/create-server-configure-additional-items-sftp.png)

1. 在**审核和创建**页面上，审核您的选择。
   + 如果要编辑其中任何一个，请选择该步骤旁边的**编辑**。
**注意**  
在选择编辑的步骤之后，您必须审核每个步骤。
   + 如果没有任何更改，请选择**创建服务器**来创建您的服务器。您将转至如下所示的**服务器**页面，其中列出了您的新服务器。

您的新服务器状态更改为**在线**可能需要几分钟时间。此时，您的服务器可以执行文件操作，但您需要先创建一个用户。有关创建用户的详细信息，请参阅[管理服务器端点的用户](create-user.md)。

# 创建启用 FTPS 的服务器
<a name="create-server-ftps"></a>

安全文件传输协议 (FTPS) 是 FTP 的扩展。它使用传输层安全性协议 (TLS)/安全套接字层 (SSL) 加密协议对流量进行加密。FTPS 允许同时或独立地对控制和数据通道连接进行加密。

**注意**  
有关网络负载均衡器的重要注意事项，请参阅[避免将服务器放在 NLBs AWS Transfer Family 服务器前面 NATs](infrastructure-security.md#nlb-considerations)。

**创建启用 FTPS 的服务器**

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

1. 在**选择协议**中，选择 **FTPS**。

   **对于**服务器证书**，请选择存储在 AWS Certificate Manager (ACM) 中的证书，当客户端通过 FTPS 连接到服务器时，该证书将用于识别您的服务器，然后选择下一步。**

   要请求新的公有证书，请参阅 *AWS Certificate Manager 用户指南*中的[请求公有证书](https://docs.aws.amazon.com/acm/latest/userguide/gs-acm-request-public.html)。

   要将现有证书导入到 ACM 中，请参阅 *AWS Certificate Manager 用户指南*中的[将证书导入到 ACM](https://docs.aws.amazon.com/acm/latest/userguide/import-certificate.html)。

   要请求私有证书以通过私有 IP 地址使用 FTPS，请参阅 *AWS Certificate Manager 用户指南*中的[请求私有证书](https://docs.aws.amazon.com/acm/latest/userguide/gs-acm-request-private.html)。

   支持具有以下加密算法和密钥大小的证书：
   + 2048 位 RSA (RSA\$12048)
   + 4096 位 RSA (RSA\$14096)
   + Elliptic Prime Curve 256 位 (EC\$1prime256v1)
   + Elliptic Prime Curve 384 位 (EC\$1secp384r1)
   + Elliptic Prime Curve 521 位 (EC\$1secp521r1)
**注意**  
该证书必须是指定了 FQDN 或 IP 地址的有效 SSL/TLS X.509 版本 3 证书，并包含有关颁发者的信息。

1. 在**选择身份提供商**中，选择要用于管理用户访问权限的身份提供商。您有以下选项：
   + **AWS Directory Service for Microsoft Active Directory**— 您提供用于访问终端节点的 Directory Service 目录。这样，您就可以使用存储在 Activity Directory 中的凭证对用户进行身份验证。要了解有关与 AWS Managed Microsoft AD 身份提供商合作的更多信息，请参阅[使用微软 Active Directory 的 AWS 目录服务](directory-services-users.md)。
**注意**  
 不支持跨账户目录和共享目录。 AWS Managed Microsoft AD
要设置以 Directory Service 作为身份提供者的服务器，您需要添加一些 Directory Service 权限。有关更多信息，请参阅 [在你开始使用之前 AWS Directory Service for Microsoft Active Directory](directory-services-users.md#managed-ad-prereq)。
   + **自定义身份提供商** — 请选择以下任一选项：
     + ** AWS Lambda 用于连接您的身份提供商**-您可以使用由 Lambda 函数支持的现有身份提供商。您提供 Lambda 函数名称。有关更多信息，请参阅 [AWS Lambda 用于整合您的身份提供商](custom-lambda-idp.md)。
     + **使用 Amazon API Gateway 连接您的身份提供商** — 您可以创建由 Lambda 函数支持的 API 网关方法以用作身份提供商。您提供一个 Amazon API Gateway URL 和一个调用角色。有关更多信息，请参阅 [使用 Amazon API Gateway 整合您的身份提供程序](authentication-api-gateway.md)。  
![\[在选择身份提供商控制台部分，已选择自定义身份提供商。\]](http://docs.aws.amazon.com/zh_cn/transfer/latest/userguide/images/custom-lambda-console-no-sftp.png)

1. 选择**下一步**。

1. 在**选择端点**中，执行以下操作：
**注意**  
 Transfer Family 的 FTPS 服务器通过端口 21（控制通道）和端口范围 8192–8200（数据通道）运行。

   1. 对于**端点类型**，选择托管服务器端点的 **VPC 托管**端点类型。有关设置 VPC 主机端点的信息，请参阅 [在虚拟私有云中创建服务器](create-server-in-vpc.md)。
**注意**  
不支持可公共访问的端点。

   1. （可选）对于**启用 FIPS**，请选中**启用 FIPS 端点**复选框以确保端点符合联邦信息处理标准 (FIPS)。
**注意**  
启用 FIPS 的端点仅在北美 AWS 地区可用。有关可用区域，请参阅 *AWS 一般参考* 中的 [AWS Transfer Family 端点和限额](https://docs.aws.amazon.com/general/latest/gr/transfer-service.html)。有关 FIPS 的更多信息，请参阅[联邦信息处理标准 (FIPS) 140-2](https://aws.amazon.com/compliance/fips/)。

   1. 选择**下一步**。  
![\[在选择端点控制台部分，已选择 VPC 托管。\]](http://docs.aws.amazon.com/zh_cn/transfer/latest/userguide/images/create-server-choose-endpoint-vpc-internal.png)

1. 在 **“选择域**” 页面上，选择要用于通过所选协议 AWS 存储和访问数据的存储服务：
   + 选择 **Amazon S3**，通过所选协议将您的文件作为对象存储和访问。
   + 选择 **Amazon EFS**，通过所选协议在 Amazon EFS 文件系统中存储和访问您的文件。

   选择**下一步**。

1. 在**配置其他详细信息**中，执行以下操作：

   1. 对于日志记录，指定现有日志组或创建新日志组（默认选项）。  
![\[在创建服务器向导中配置其他详细信息的日志记录窗格。选择“选择现有日志组”。\]](http://docs.aws.amazon.com/zh_cn/transfer/latest/userguide/images/logging-server-choose-existing-group.png)

      如果选择 “**创建日志组**”，则 CloudWatch 控制台 ([https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/)) 将打开 “**创建日志组**” 页面。有关详细信息，请参阅[在 Log CloudWatch s 中创建日志组](https://docs.aws.amazon.com//AmazonCloudWatch/latest/logs/Working-with-log-groups-and-streams.html#Create-Log-Group)。

   1.  （可选）对于**托管工作流程**，选择 Tr IDs ansfer Family 在执行工作流程时应担任的工作流程（和相应的角色）。您可以选择一个工作流程在完成上传后执行，选择另一个工作流程在部分上传时执行。要了解有关使用托管工作流程处理文件的更多信息，请参阅 [AWS Transfer Family 托管工作流程](transfer-workflows.md)。  
![\[托管工作流程控制台部分。\]](http://docs.aws.amazon.com/zh_cn/transfer/latest/userguide/images/workflows-addtoserver.png)

   1. 对于**加密算法选项**，请选择包含允许服务器使用的加密算法的安全策略。我们的最新安全策略是默认策略：有关详细信息，请参阅[AWS Transfer Family 服务器的安全策略](security-policies.md)。

   1. 对于**服务器主机密钥**，请将其留空。

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

   1. 您可以优化 Amazon S3 目录的性能。例如，假设您进入主目录，并且有 10,000 个子目录。换句话说，您的亚马逊 S3 存储桶有 10,000 个文件夹。在这种情况下，如果您运行 `ls` (list) 命令，则列表操作需要六到八分钟。但是，如果您优化目录，则此操作只需要几秒钟。

      使用控制台创建服务器时，默认情况下会启用优化的目录。如果您使用 API 创建服务器，则默认情况下不启用此行为。  
![\[优化的目录控制台部分。\]](http://docs.aws.amazon.com/zh_cn/transfer/latest/userguide/images/optimized-directories.png)

   1. 选择**下一步**。

   1. （可选）您可以将 AWS Transfer Family 服务器配置为向最终用户显示自定义消息，例如组织政策或条款和条件。您还可以向成功通过身份验证的用户显示自定义的每日消息 (MOTD)。

      对于**显示横幅**，在**预身份验证显示横幅**文本框中，输入要在用户进行身份验证之前向他们显示的短信，然后在**后身份验证显示横幅**文本框中，输入要在用户成功进行身份验证后向他们显示的文本。

   1. （可选）您可以配置以下其他选项。
      + **SetStat 选项**：启用此选项可忽略客户端尝试对您上传到 Amazon S3 存储桶的文件使用`SETSTAT`时生成的错误。有关其他详细信息，请参阅[ProtocolDetails](https://docs.aws.amazon.com/transfer/latest/APIReference/API_ProtocolDetails.html)主题中的`SetStatOption`文档。
      + **TLS 会话恢复**：提供一种机制来恢复或共享 FTPS 会话的控制和数据连接之间协商的私有密钥。有关其他详细信息，请参阅[ProtocolDetails](https://docs.aws.amazon.com/transfer/latest/APIReference/API_ProtocolDetails.html)主题中的`TlsSessionResumptionMode`文档。
      + **被动 IP**：表示 FTP 和 FTPS 协议的被动模式。输入单个 IPv4 地址，例如防火墙、路由器或负载均衡器的公有 IP 地址。有关其他详细信息，请参阅[ProtocolDetails](https://docs.aws.amazon.com/transfer/latest/APIReference/API_ProtocolDetails.html)主题中的`PassiveIp`文档。  
![\[其他配置屏幕显示 SetStat、TLS 会话恢复和被动 IP 参数。\]](http://docs.aws.amazon.com/zh_cn/transfer/latest/userguide/images/create-server-configure-additional-items-all.png)

1. 在**审核和创建**页面上，审核您的选择。
   + 如果要编辑其中任何一个，请选择该步骤旁边的**编辑**。
**注意**  
在选择编辑的步骤之后，您必须审核每个步骤。
   + 如果没有任何更改，请选择**创建服务器**来创建您的服务器。您将转至如下所示的**服务器**页面，其中列出了您的新服务器。

您的新服务器状态更改为**在线**可能需要几分钟时间。到时候，您的服务器可以执行用户的文件操作。

**后续步骤**：对于下一步，请继续前往 [使用自定义身份提供程序](custom-idp-intro.md) 设置用户。

# 创建启用 FTP 的服务器
<a name="create-server-ftp"></a>

文件传输协议 (FTP) 是一种用于数据传输的网络协议。FTP 使用单独的通道进行控制和数据传输。控制通道保持打开状态，直至终止或不活动超时状态。数据通道在传输期间处于活动状态。FTP 使用明文且不支持流量加密。

**注意**  
启用 FTP 时，必须为托管 VPC 的终端节点选择内部访问选项。如果您需要服务器让数据通过公共网络，则必须使用安全协议，例如 SFTP 或 FTPS。

**注意**  
有关网络负载均衡器的重要注意事项，请参阅[避免将服务器放在 NLBs AWS Transfer Family 服务器前面 NATs](infrastructure-security.md#nlb-considerations)。

**创建启用 FTP 的服务器**

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

1. 在**选择协议**中，选择 **FTP**，然后选择**下一步**。

1. 在**选择身份提供商**中，选择要用于管理用户访问权限的身份提供商。您有以下选项：
   + **AWS Directory Service for Microsoft Active Directory**— 您提供用于访问终端节点的 Directory Service 目录。这样，您就可以使用存储在 Activity Directory 中的凭证对用户进行身份验证。要了解有关与 AWS Managed Microsoft AD 身份提供商合作的更多信息，请参阅[使用微软 Active Directory 的 AWS 目录服务](directory-services-users.md)。
**注意**  
 不支持跨账户目录和共享目录。 AWS Managed Microsoft AD
要设置以 Directory Service 作为身份提供者的服务器，您需要添加一些 Directory Service 权限。有关更多信息，请参阅 [在你开始使用之前 AWS Directory Service for Microsoft Active Directory](directory-services-users.md#managed-ad-prereq)。
   + **自定义身份提供商** — 请选择以下任一选项：
     + ** AWS Lambda 用于连接您的身份提供商**-您可以使用由 Lambda 函数支持的现有身份提供商。您提供 Lambda 函数名称。有关更多信息，请参阅 [AWS Lambda 用于整合您的身份提供商](custom-lambda-idp.md)。
     + **使用 Amazon API Gateway 连接您的身份提供商** — 您可以创建由 Lambda 函数支持的 API 网关方法以用作身份提供商。您提供一个 Amazon API Gateway URL 和一个调用角色。有关更多信息，请参阅 [使用 Amazon API Gateway 整合您的身份提供程序](authentication-api-gateway.md)。  
![\[在选择身份提供商控制台部分，已选择自定义身份提供商。\]](http://docs.aws.amazon.com/zh_cn/transfer/latest/userguide/images/custom-lambda-console-no-sftp.png)

1. 选择**下一步**。

1. 在**选择端点**中，执行以下操作：
**注意**  
Transfer Family 的 FTP 服务器通过端口 21（控制通道）和端口范围 8192–8200（数据通道）运行。

   1. 对于**端点类型**，选择托管服务器端点的 **VPC 托管**。有关设置 VPC 主机端点的信息，请参阅 [在虚拟私有云中创建服务器](create-server-in-vpc.md)。
**注意**  
不支持可公共访问的端点。

   1. 对于**启用 FIPS**，请清除**启用 FIPS 端点**复选框。
**注意**  
FTP 服务器不支持启用 FIPS 的端点。

   1. 选择**下一步**。  
![\[在选择端点控制台部分，已选择 VPC 托管。\]](http://docs.aws.amazon.com/zh_cn/transfer/latest/userguide/images/create-server-choose-endpoint-vpc-internal.png)

1. 在 **“选择域**” 页面上，选择要用于通过所选协议 AWS 存储和访问数据的存储服务。
   + 选择 **Amazon S3**，通过所选协议将您的文件作为对象存储和访问。
   + 选择 **Amazon EFS**，通过所选协议在 Amazon EFS 文件系统中存储和访问您的文件。

   选择**下一步**。

1. 在**配置其他详细信息**中，执行以下操作：

   1. 对于日志记录，指定现有日志组或创建新日志组（默认选项）。  
![\[在创建服务器向导中配置其他详细信息的日志记录窗格。选择“选择现有日志组”。\]](http://docs.aws.amazon.com/zh_cn/transfer/latest/userguide/images/logging-server-choose-existing-group.png)

      如果选择 “**创建日志组**”，则 CloudWatch 控制台 ([https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/)) 将打开 “**创建日志组**” 页面。有关详细信息，请参阅[在 Log CloudWatch s 中创建日志组](https://docs.aws.amazon.com//AmazonCloudWatch/latest/logs/Working-with-log-groups-and-streams.html#Create-Log-Group)。

   1.  （可选）对于**托管工作流程**，选择 Tr IDs ansfer Family 在执行工作流程时应担任的工作流程（和相应的角色）。您可以选择一个工作流程在完成上传后执行，选择另一个工作流程在部分上传时执行。要了解有关使用托管工作流程处理文件的更多信息，请参阅 [AWS Transfer Family 托管工作流程](transfer-workflows.md)。  
![\[托管工作流程控制台部分。\]](http://docs.aws.amazon.com/zh_cn/transfer/latest/userguide/images/workflows-addtoserver.png)

   1. 对于**加密算法选项**，请选择包含允许服务器使用的加密算法的安全策略。
**注意**  
Transfer Family 会将最新的安全策略分配给你的 FTP 服务器。但是，由于 FTP 协议不使用任何加密，因此 FTP 服务器不使用任何安全策略算法。除非您的服务器也使用 FTPS 或 SFTP 协议，否则安全策略将保持未使用状态。

   1. 对于**服务器主机密钥**，请将其留空。

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

   1. 您可以优化 Amazon S3 目录的性能。例如，假设您进入主目录，并且有 10,000 个子目录。换句话说，您的亚马逊 S3 存储桶有 10,000 个文件夹。在这种情况下，如果您运行 `ls` (list) 命令，则列表操作需要六到八分钟。但是，如果您优化目录，则此操作只需要几秒钟。

      使用控制台创建服务器时，默认情况下会启用优化的目录。如果您使用 API 创建服务器，则默认情况下不启用此行为。  
![\[优化的目录控制台部分。\]](http://docs.aws.amazon.com/zh_cn/transfer/latest/userguide/images/optimized-directories.png)

   1. 选择**下一步**。

   1. （可选）您可以将 AWS Transfer Family 服务器配置为向最终用户显示自定义消息，例如组织政策或条款和条件。您还可以向成功通过身份验证的用户显示自定义的每日消息 (MOTD)。

      对于**显示横幅**，在**预身份验证显示横幅**文本框中，输入要在用户进行身份验证之前向他们显示的短信，然后在**后身份验证显示横幅**文本框中，输入要在用户成功进行身份验证后向他们显示的文本。

   1. （可选）您可以配置以下其他选项。
      + **SetStat 选项**：启用此选项可忽略客户端尝试对您上传到 Amazon S3 存储桶的文件使用`SETSTAT`时生成的错误。有关其他详细信息，请参阅[ProtocolDetails](https://docs.aws.amazon.com/transfer/latest/APIReference/API_ProtocolDetails.html)主题中的`SetStatOption`文档。
      + **TLS 会话恢复**：提供一种机制来恢复或共享 FTPS 会话的控制和数据连接之间协商的私有密钥。有关其他详细信息，请参阅[ProtocolDetails](https://docs.aws.amazon.com/transfer/latest/APIReference/API_ProtocolDetails.html)主题中的`TlsSessionResumptionMode`文档。
      + **被动 IP**：表示 FTP 和 FTPS 协议的被动模式。输入单个 IPv4 地址，例如防火墙、路由器或负载均衡器的公有 IP 地址。有关其他详细信息，请参阅[ProtocolDetails](https://docs.aws.amazon.com/transfer/latest/APIReference/API_ProtocolDetails.html)主题中的`PassiveIp`文档。  
![\[其他配置屏幕显示 SetStat、TLS 会话恢复和被动 IP 参数。\]](http://docs.aws.amazon.com/zh_cn/transfer/latest/userguide/images/create-server-configure-additional-items-all.png)

1. 在**审核和创建**页面上，审核您的选择。
   + 如果要编辑其中任何一个，请选择该步骤旁边的**编辑**。
**注意**  
在选择编辑的步骤之后，您必须审核每个步骤。
   + 如果没有任何更改，请选择**创建服务器**来创建您的服务器。您将转至如下所示的**服务器**页面，其中列出了您的新服务器。

您的新服务器状态更改为**在线**可能需要几分钟时间。到时候，您的服务器可以执行用户的文件操作。

**后续步骤** — 对于下一步，请继续前往 [使用自定义身份提供程序](custom-idp-intro.md) 设置用户。

# 在虚拟私有云中创建服务器
<a name="create-server-in-vpc"></a>

您可以将服务器的端点托管在虚拟私有云 (VPC) 中，用于在不通过公共互联网的情况下向 Amazon S3 存储桶或 Amazon EFS 文件系统传输数据和从 Amazon S3 存储桶或 Amazon EFS 文件系统中传输数据。

**注意**  
 2021 年 5 月 19 日之后，如果您的 AWS 账户`EndpointType=VPC_ENDPOINT`在 2021 年 5 月 19 日之前尚未使用您的账户创建服务器，则您将无法创建服务器。如果您已`EndpointType=VPC_ENDPOINT`在 2021 年 2 月 21 日当天或之前使用 AWS 账户创建服务器，则不会受到影响。在此日期之后，使用 `EndpointType` = **VPC**。有关更多信息，请参阅 [停止使用 VPC\$1ENDPOINT](#deprecate-vpc-endpoint)。

如果您使用亚马逊虚拟私有云（Amazon VPC）托管 AWS 资源，则可以在您的 VPC 和服务器之间建立私有连接。然后，您可以使用此服务器通过客户端将数据传输到您的 Amazon S3 存储桶或从您的 Amazon S3 存储桶中传输数据，而无需使用公有 IP 地址或需要互联网网关。

使用 Amazon VPC，您可以在自定义虚拟网络中启动 AWS 资源。可以使用 VPC 控制您的网络设置，例如 IP 地址范围、子网、路由表和网络网关。有关更多信息 VPCs，请参阅[什么是 Amazon VPC？](https://docs.aws.amazon.com/vpc/latest/userguide/what-is-amazon-vpc.html) 在《*亚马逊 VPC 用户指南》*中。

在下一部分中，查找如何创建 VPC 并将其连接到服务器的说明。作为概述，您可以按如下方式执行此操作：

1. 使用 VPC 端点设置服务器。

1. 使用 VPC 内的客户端通过 VPC 端点连接到您的服务器。这样，您就可以使用 AWS Transfer Family通过客户端传输存储在 Amazon S3 存储桶中的数据。即使网络已与公共互联网断开连接，您也可以执行此传输。

1.  此外，如果您选择将服务器的端点设为面向互联网，则可以将弹性 IP 地址与您的端点相关联。这样做可以让 VPC 之外的客户端连接到您的服务器。您可以使用 VPC 安全组以控制请求仅来自允许地址的经过身份验证的用户的访问权限。

**注意**  
AWS Transfer Family 支持双栈端点，允许您的服务器通过 IPv4 和 IPv6进行通信。要启用双堆栈支持，请在创建 VPC 终端节点时选择**启用 DNS 双堆栈终端节点**选项。请注意，您的 VPC 和子网都必须配置为支持， IPv6 然后才能使用此功能。当您的客户端需要使用任一协议进行连接时，双栈支持特别有用。  
有关双栈（IPv4 和 IPv6）服务器端点的信息，请参见[IPv6 支持 Transfer Family 服务器](ipv6-support.md)。

**Topics**
+ [创建仅在您的 VPC 内访问的服务器端点](#create-server-endpoint-in-vpc)
+ [为服务器创建面向互联网的端点](#create-internet-facing-endpoint)
+ [更改 SFTP 服务器的端点类型](#change-server-endpoint-type)
+ [停止使用 VPC\$1ENDPOINT](#deprecate-vpc-endpoint)
+ [限制 Transfer Family 服务器的 VPC 终端节点访问权限](#limit-vpc-endpoint-access)
+ [其他联网功能](#additional-networking-features)
+ [将 AWS Transfer Family 服务器终端节点类型从 VPC\$1ENDPOINT 更新到 VPC](update-endpoint-type-vpc.md)

## 创建仅在您的 VPC 内访问的服务器端点
<a name="create-server-endpoint-in-vpc"></a>

在以下步骤中，您将创建仅由您的 VPC 内的资源访问的服务器端点。

**在 VPC 内创建服务器端点**

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

1. 从导航窗格中，选择**服务器**，然后选择**创建服务器**。

1. 在**选择协议**中，选择一个或多个协议，然后选择**下一步**。有关协议的更多信息，请参阅 [步骤 2：创建启用 SFTP 的服务器](getting-started.md#getting-started-server)。

1. 在**选择身份提供商**中，选择**管理服务**以存储用户身份和密钥 AWS Transfer Family，然后选择**下一步**。

   此过程使用服务托管选项。如果您选择**自定义**，则提供 Amazon API Gateway 端点和 AWS Identity and Access Management IAM 角色来访问端点。执行此操作后，您可以集成目录服务，用于对用户进行身份验证和授权。要了解有关使用自定义身份提供商的更多信息，请参阅 [使用自定义身份提供程序](custom-idp-intro.md)。

1. 在**选择端点**中，执行以下操作：

   1. 对于**端点类型**，选择托管服务器端点的 **VPC 托管**端点类型。

   1. 对于**访问**，请选择**内部**，使您的端点仅可由使用端点的私有 IP 地址的客户端访问。

      有关**面向互联网**选项的详细信息，请参阅 [为服务器创建面向互联网的端点](#create-internet-facing-endpoint)。在 VPC 中创建的仅用于内部访问的服务器不支持自定义主机名。

   1. 对于 **VPC**，选择现有 VPC ID 或选择**创建 VPC** 以创建新的 VPC。

   1. 在**可用区**部分，最多选择三个可用区和关联的子网。

   1. 在**安全组**部分，选择现有安全组 ID IDs 或选择**创建安全组**来创建新的安全组。有关安全组的更多信息，请参阅 *Amazon Virtual Private Cloud 用户指南*中的 [VPC 的安全组](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html)。要创建安全组，请参阅 *Amazon Virtual Private Cloud 用户指南*中的[创建安全组](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html#CreatingSecurityGroups)。
**注意**  
您的 VPC 会自动带有默认的安全组。如果您在启动服务器时没有指定其他安全组或组，我们会将默认安全组与您的服务器相关联。
      + 对于安全组的入站规则，您可以将 SSH 流量配置为使用端口 22、2222、22000 或任意组合。默认情况下，端口 22 已配置。要使用端口 2222 或端口 22000，您需要向安全组添加入站规则。对于类型，选择 “**自定义 TCP**”，然后在 “**端口范围**” 中输入**2222**或**22000**，对于源，输入与 SSH 端口 22 规则相同的 CIDR 范围。
      + 对于安全组的入站规则，请将 FTP 和 FTPS 流量配置**21**为使用控制通道和数据通道**8192-8200**的**端口范围**。
**注意**  
对于需要 TCP “搭载” 的客户端，也可以使用端口 2223 ACKs，或者让 TCP 三向握手的最终确认也包含数据。  
某些客户端软件可能与端口 2223 不兼容：例如，客户端要求服务器在客户端发送 SFTP 标识字符串之前发送 SFTP 标识字符串。  
![\[示例安全组的入站规则，显示了端口 22 上的 SSH 规则和端口 2222 上的 Custom TCP 规则。\]](http://docs.aws.amazon.com/zh_cn/transfer/latest/userguide/images/alternate-port-rule.png)

   1. （可选）对于**启用 FIPS**，请选中**启用 FIPS 的端点**复选框以确保端点符合联邦信息处理标准 (FIPS)。
**注意**  
启用 FIPS 的端点仅在北美 AWS 地区可用。有关可用区域，请参阅 *AWS 一般参考* 中的 [AWS Transfer Family 端点和限额](https://docs.aws.amazon.com/general/latest/gr/transfer-service.html)。有关 FIPS 的更多信息，请参阅[联邦信息处理标准 (FIPS) 140-2](https://aws.amazon.com/compliance/fips/)。

   1. 选择**下一步**。

1. 在**配置其他详细信息**中，执行以下操作：

   1. 要进行**CloudWatch 日志记录**，请选择以下选项之一以启用 Amazon CloudWatch 记录您的用户活动：
      + **创建一个新角色**，允许 Transfer Family 自动创建 IAM 角色，前提是您拥有创建新角色的相应权限。创建的 IAM 角色被称为`AWSTransferLoggingAccess`。
      + **选择现有角色**以从您的帐户中选择现有 IAM 角色。在**日志记录角色**下，选择该角色。此 IAM 角色应包括将**服务**设置为 `transfer.amazonaws.com` 的信任策略。

        有关 CloudWatch 日志记录的更多信息，请参阅[配置 CloudWatch 日志记录角色](configure-cw-logging-role.md)。
**注意**  
如果您未指定日志记录角色， CloudWatch 则无法在中查看最终用户活动。
如果您不想设置 CloudWatch 日志记录角色，请选择**选择现有角色**，但不要选择日志记录角色。

   1. 对于**加密算法选项**，请选择包含允许服务器使用的加密算法的安全策略。
**注意**  
默认情况下，除非选择不同的服务器，否则 `TransferSecurityPolicy-2024-01` 安全策略将连接到服务器。

      有关安全策略的更多信息，请参阅 [AWS Transfer Family 服务器的安全策略](security-policies.md)。

   1. （可选：本部分仅适用于从启用 SFTP 的现有服务器迁移用户。） 在**服务器主机密钥**中，输入一个 RSA ED25519、或 ECDSA 私钥，当客户端通过 SFTP 连接到服务器时，该私钥将用于识别您的服务器。

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

   1. 选择**下一步**。

1. 在**审核和创建**页面上，审核您的选择。如果您：
   + 要编辑其中任何一个，请选择该步骤旁边的**编辑**。
**注意**  
在选择编辑的步骤之后，您将需要查看每个步骤。
   + 如果没有更改，请选择**创建服务器**来创建您的服务器。您将转至如下所示的**服务器**页面，其中列出了您的新服务器。

您的新服务器状态更改为**在线**可能需要几分钟时间。此时，您的服务器可以执行文件操作，但您需要先创建一个用户。有关创建用户的详细信息，请参阅[管理服务器端点的用户](create-user.md)。

## 为服务器创建面向互联网的端点
<a name="create-internet-facing-endpoint"></a>

在以下过程中，创建服务器端点。只有在您的 VPC 默认安全组中允许其源 IP 地址的客户端才能通过互联网访问此端点。此外，通过使用弹性 IP 地址使您的端点面向互联网，您的客户可以使用弹性 IP 地址来允许在其防火墙中访问您的端点。

**注意**  
在面向互联网的 VPC 托管端点上，只能使用 SFTP 和 FTPS。

**创建面向互联网的端点**

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

1. 从导航窗格中，选择**服务器**，然后选择**创建服务器**。

1. 在**选择协议**中，选择一个或多个协议，然后选择**下一步**。有关协议的更多信息，请参阅 [步骤 2：创建启用 SFTP 的服务器](getting-started.md#getting-started-server)。

1. 在**选择身份提供商**中，选择**管理服务**以存储用户身份和密钥 AWS Transfer Family，然后选择**下一步**。

   此过程使用服务托管选项。如果您选择**自定义**，则提供 Amazon API Gateway 端点和 AWS Identity and Access Management IAM 角色来访问端点。执行此操作后，您可以集成目录服务，用于对用户进行身份验证和授权。要了解有关使用自定义身份提供商的更多信息，请参阅 [使用自定义身份提供程序](custom-idp-intro.md)。

1. 在**选择端点**中，执行以下操作：

   1. 对于**端点类型**，选择托管服务器端点的 **VPC 托管**端点类型。

   1. 对于**访问**，请选择**面向互联网**，使客户端可以通过互联网访问您的端点。
**注意**  
选择**面向互联网**时，可以在每个子网或多个子网中选择一个现有的弹性 IP 地址。或者，您可以前往 VPC 控制台 ([https://console.aws.amazon.com/vpc/](https://console.aws.amazon.com/vpc/)) 分配一个或多个新的弹性 IP 地址。这些地址可以归您所有，也可以归您所有。 AWS 您无法将已在使用的弹性 IP 地址与您的端点相关联。

   1. （可选）对于**自定义主机名**，请选择以下选项之一：
**注意**  
 AWS GovCloud (US) 需要直接通过弹性 IP 地址进行连接的客户，或者在商用 Route 53 中创建指向其 EIP 的主机名记录。有关将 Route 53 用于 GovCloud 终端节点的更多信息，请参阅*AWS GovCloud (US) 用户指南*中的使用[您的 AWS GovCloud (US) 资源设置 Amazon Route 53](https://docs.aws.amazon.com/govcloud-us/latest/UserGuide/setting-up-route53.html)。
      + **Amazon Route 53 DNS 别名**— 如果要使用的主机名已注册到 Route 53。然后，您可以输入主机名。
      + **其他 DNS**— 如果要使用的主机名已注册到另一个 DNS 提供商。然后，您可以输入主机名。
      + **无** — 使用服务器的端点，而不是使用自定义主机名。服务器主机名使用格式 `server-id.server.transfer.region.amazonaws.com`。
**注意**  
对于中的客户 AWS GovCloud (US)，选择 “**无**” 不会以这种格式创建主机名。

      要了解有关使用自定义主机名的更多信息，请参阅 [使用自定义主机名](requirements-dns.md)。

   1. 对于 **VPC**，选择现有 VPC ID 或选择**创建 VPC** 以创建新的 VPC。

   1. 在**可用区**部分，最多选择三个可用区和关联的子网。对于**IPv4地址**，为每个子网选择一个**弹性 IP 地址**。这是您的客户端可用来允许在其防火墙中访问您的端点的 IP 地址。

      **提示：**您必须为可用区使用公有子网，或者如果要使用私有子网，请先设置互联网网关。

   1. 在**安全组**部分，选择现有安全组 ID IDs 或选择**创建安全组**来创建新的安全组。有关安全组的更多信息，请参阅 *Amazon Virtual Private Cloud 用户指南*中的 [VPC 的安全组](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html)。要创建安全组，请参阅 *Amazon Virtual Private Cloud 用户指南*中的[创建安全组](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html#CreatingSecurityGroups)。
**注意**  
您的 VPC 会自动带有默认的安全组。如果您在启动服务器时没有指定其他安全组或组，我们会将默认安全组与您的服务器相关联。
      + 对于安全组的入站规则，您可以将 SSH 流量配置为使用端口 22、2222、22000 或任意组合。默认情况下，端口 22 已配置。要使用端口 2222 或端口 22000，您需要向安全组添加入站规则。对于类型，选择 “**自定义 TCP**”，然后在 “**端口范围**” 中输入**2222**或**22000**，对于源，输入与 SSH 端口 22 规则相同的 CIDR 范围。
      + 对于安全组的入站规则，请将 FTPS 流量配置**21**为使用控制信道和数据通道**8192-8200**的**端口范围**。
**注意**  
对于需要 TCP “搭载” 的客户端，也可以使用端口 2223 ACKs，或者让 TCP 三向握手的最终确认也包含数据。  
某些客户端软件可能与端口 2223 不兼容：例如，客户端要求服务器在客户端发送 SFTP 标识字符串之前发送 SFTP 标识字符串。  
![\[示例安全组的入站规则，显示了端口 22 上的 SSH 规则和端口 2222 上的 Custom TCP 规则。\]](http://docs.aws.amazon.com/zh_cn/transfer/latest/userguide/images/alternate-port-rule.png)

   1. （可选）对于**启用 FIPS**，请选中**启用 FIPS 的端点**复选框以确保端点符合联邦信息处理标准 (FIPS)。
**注意**  
启用 FIPS 的端点仅在北美 AWS 地区可用。有关可用区域，请参阅 *AWS 一般参考* 中的 [AWS Transfer Family 端点和限额](https://docs.aws.amazon.com/general/latest/gr/transfer-service.html)。有关 FIPS 的更多信息，请参阅[联邦信息处理标准 (FIPS) 140-2](https://aws.amazon.com/compliance/fips/)。

   1. 选择**下一步**。

1. 在**配置其他详细信息**中，执行以下操作：

   1. 要进行**CloudWatch 日志记录**，请选择以下选项之一以启用 Amazon CloudWatch 记录您的用户活动：
      + **创建一个新角色**，允许 Transfer Family 自动创建 IAM 角色，前提是您拥有创建新角色的相应权限。创建的 IAM 角色被称为`AWSTransferLoggingAccess`。
      + **选择现有角色**以从您的帐户中选择现有 IAM 角色。在**日志记录角色**下，选择该角色。此 IAM 角色应包括将**服务**设置为 `transfer.amazonaws.com` 的信任策略。

        有关 CloudWatch 日志记录的更多信息，请参阅[配置 CloudWatch 日志记录角色](configure-cw-logging-role.md)。
**注意**  
如果您未指定日志记录角色， CloudWatch 则无法在中查看最终用户活动。
如果您不想设置 CloudWatch 日志记录角色，请选择**选择现有角色**，但不要选择日志记录角色。

   1. 对于**加密算法选项**，请选择包含允许服务器使用的加密算法的安全策略。
**注意**  
默认情况下，除非选择不同的服务器，否则 `TransferSecurityPolicy-2024-01` 安全策略将连接到服务器。

      有关安全策略的更多信息，请参阅 [AWS Transfer Family 服务器的安全策略](security-policies.md)。

   1. （可选：本部分仅适用于从启用 SFTP 的现有服务器迁移用户。） 在**服务器主机密钥**中，输入一个 RSA ED25519、或 ECDSA 私钥，当客户端通过 SFTP 连接到服务器时，该私钥将用于识别您的服务器。

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

   1. 选择**下一步**。

   1.  （可选）对于**托管工作流程**，选择 Tr IDs ansfer Family 在执行工作流程时应担任的工作流程（和相应的角色）。您可以选择一个工作流程在完成上传后执行，选择另一个工作流程在部分上传时执行。要了解有关使用托管工作流程处理文件的更多信息，请参阅 [AWS Transfer Family 托管工作流程](transfer-workflows.md)。  
![\[托管工作流程控制台部分。\]](http://docs.aws.amazon.com/zh_cn/transfer/latest/userguide/images/workflows-addtoserver.png)

1. 在**审核和创建**页面上，审核您的选择。如果您：
   + 要编辑其中任何一个，请选择该步骤旁边的**编辑**。
**注意**  
在选择编辑的步骤之后，您将需要查看每个步骤。
   + 如果没有更改，请选择**创建服务器**来创建您的服务器。您将转至如下所示的**服务器**页面，其中列出了您的新服务器。

您可以选择服务器 ID，以查看您已创建的服务器的详细设置。填充 “**公共 IPv4 地址**” 列后，您提供的弹性 IP 地址将成功关联到服务器的终端节点。

**注意**  
当 VPC 中的服务器处于联机状态时，只能通过 [UpdateServer](https://docs.aws.amazon.com/transfer/latest/APIReference/API_UpdateServer.html)API 修改子网。必须[停止服务器](edit-server-config.md#edit-online-offline)才能添加或更改服务器端点的弹性 IP 地址。

## 更改 SFTP 服务器的端点类型
<a name="change-server-endpoint-type"></a>

如果您现有的服务器可通过互联网访问（即，具有公有端点类型），您可以将其端点更改为 VPC 端点。

**注意**  
如果您在 VPC 中有一台显示为 `VPC_ENDPOINT` 的现有服务器，建议您将其修改为新的 VPC 端点类型。有了这种新的端点类型，您就不再需要使用网络负载均衡器 (NLB) 将弹性 IP 地址与服务器的端点关联起来。此外，您还可以使用 VPC 安全组来限制对服务器端点的访问。不过，您可以按需继续使用 `VPC_ENDPOINT` 端点类型。

以下过程假设您具有使用当前公有端点类型或较旧 `VPC_ENDPOINT` 类型的服务器。

**更改服务器的端点类型**

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

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

1. 选中要更改其端点类型的服务器的复选框。
**重要**  
您必须先停止服务器，然后才能更改其终端节点。

1. 对于**操作**，选择**停止**。

1. 在出现的确认对话框中，通过选择**停止**来确认您要停止服务器。
**注意**  
在继续下一步之前，在**端点详细信息**中，等待服务器的**状态**更改为**离线**；这可能需要几分钟时间。您可能必须在**服务器**页面上选择**刷新**才能查看状态更改。  
服务器**离线**之前，您无法进行任何编辑。

1. 在**端点详细信息**中，选择**编辑**。

1. 在**编辑端点配置**中，执行以下操作：

   1. 对于**端点类型**，选择 **VPC 托管**。

   1. 对于**访问权限**，请选择下列选项之一：
      + **内部**，使您的端点只能由使用端点的私有 IP 地址的客户端访问。
      + **面向互联网**，使客户端可以通过公共互联网访问您的端点。
**注意**  
选择**面向互联网**时，可以在每个子网或多个子网中选择一个现有的弹性 IP 地址。或者，您可以前往 VPC 控制台 ([https://console.aws.amazon.com/vpc/](https://console.aws.amazon.com/vpc/)) 分配一个或多个新的弹性 IP 地址。这些地址可以归您所有，也可以归您所有。 AWS 您无法将已在使用的弹性 IP 地址与您的端点相关联。

   1. （仅适用于面向互联网的访问权限是可选的）对于**自定义主机名**，请选择以下选项之一：
      + **Amazon Route 53 DNS 别名**— 如果要使用的主机名已注册到 Route 53。然后，您可以输入主机名。
      + **其他 DNS**— 如果要使用的主机名已注册到另一个 DNS 提供商。然后，您可以输入主机名。
      + **无** — 使用服务器的端点，而不是使用自定义主机名。服务器主机名使用格式 `serverId.server.transfer.regionId.amazonaws.com`。

        要了解有关使用自定义主机名的更多信息，请参阅 [使用自定义主机名](requirements-dns.md)。

   1. 对于 **VPC**，选择现有 VPC ID 或选择**创建 VPC** 以创建新的 VPC。

   1. 在**可用区**部分，最多选择三个可用区和关联的子网。如果选择**面向互联网**，则还要为每个子网选择一个弹性 IP 地址。
**注意**  
如果您想要最多三个可用区，但可用区域不足，请在 VPC 控制台中创建它们（[https://console.aws.amazon.com/vpc/](https://console.aws.amazon.com/vpc/)）。  
如果您修改子网或弹性 IP 地址，则服务器需要几分钟才能更新。在服务器更新完成之前，您无法保存更改。

   1. 选择**保存**。

1. 在**操作**中，选择**启动**，然后等待服务器状态更改为**在线**；这可能需要几分钟。
**注意**  
如果您将公有端点类型更改为 VPC 端点类型，请注意您的服务器的**端点类型**已更改为 **VPC**。

默认安全组已附加到端点。要更改或添加其他安全组，请参阅[创建安全组](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html#CreatingSecurityGroups)。

## 停止使用 VPC\$1ENDPOINT
<a name="deprecate-vpc-endpoint"></a>

AWS Transfer Family 已停止使用新 AWS 帐户创建服务器`EndpointType=VPC_ENDPOINT`的功能。自 2021 年 5 月 19 日起，不拥有终端节点类型为的 AWS Transfer Family 服务器的 AWS 账户`VPC_ENDPOINT`将无法使用创建新服务器`EndpointType=VPC_ENDPOINT`。如果您已经拥有使用该 `VPC_ENDPOINT` 端点类型的服务器，建议您 `EndpointType=VPC` 尽快开始使用。有关详细信息，请参阅[将您的 AWS Transfer Family 服务器终端节点类型从 VPC\$1ENDPOINT 更新为 VPC](https://aws.amazon.com/blogs/storage/update-your-aws-transfer-family-server-endpoint-type-from-vpc_endpoint-to-vpc/)。

我们在 2020 年初推出了新的 `VPC` 端点类型。有关更多信息，请参阅 [AWS Transfer Family for SFTP 支持 VPC 安全组和弹性 IP 地址](https://aws.amazon.com/about-aws/whats-new/2020/01/aws-transfer-for-sftp-supports-vpc-security-groups-and-elastic-ip-addresses/)。这个新的端点功能更丰富，更具成本效益，而且不 PrivateLink 收费。有关更多信息，请参阅[AWS PrivateLink 定价](https://aws.amazon.com/privatelink/pricing/)。

此端点类型在功能上等同于以前的端点类型 (`VPC_ENDPOINT`)。您可以将弹性 IP 地址直接附加到端点，使其面向互联网，并使用安全组进行源 IP 筛选。有关更多信息，请参阅 “[使用 IP 允许列表来保护您 AWS Transfer Family 的 SFTP 服务器安全](https://aws.amazon.com/blogs/storage/use-ip-whitelisting-to-secure-your-aws-transfer-for-sftp-servers/)” 博客文章。

您也可以在共享 VPC 环境中托管此端点。有关更多信息，请参阅[AWS Transfer Family 现在支持共享服务 VPC 环境](https://aws.amazon.com/about-aws/whats-new/2020/11/aws-transfer-family-now-supports-shared-services-vpc-environments/)。

除了 SFTP 之外，您还可以使用 VPC `EndpointType` 来启用 FTPS 和 FTP。我们不打算将这些功能和 FTPS/FTP 支持添加到`EndpointType=VPC_ENDPOINT`。我们还从 AWS Transfer Family 控制台中删除了此端点类型作为选项。

<a name="deprecate-vpc-endpoint.title"></a>您可以使用 Transfer Family 控制台、 AWS CLI SDKs、API 或更改服务器的终端节点类型 CloudFormation。要更改服务器的端点类型，请参阅 [将 AWS Transfer Family 服务器终端节点类型从 VPC\$1ENDPOINT 更新到 VPC](update-endpoint-type-vpc.md)。

如果您有任何疑问，请联系 AWS 支持 或您的 AWS 客户团队。

**注意**  
我们不打算在 EndpointType =VPC\$1ENDPOINT 中添加这些功能以及 FTPS 或 FTP 支持。我们不再在 AWS Transfer Family 控制台上将其作为选项提供。

如果您还有其他问题，可以通过 AWS 支持 或您的客户团队联系我们。

## 限制 Transfer Family 服务器的 VPC 终端节点访问权限
<a name="limit-vpc-endpoint-access"></a>

创建具有 VPC 终端节点类型的 AWS Transfer Family 服务器时，您的 IAM 用户和委托人需要权限才能创建和删除 VPC 终端节点。但是，贵组织的安全策略可能会限制这些权限。您可以使用 IAM 策略允许专门为 Transfer Family 创建和删除 VPC 终端节点，同时保持对其他服务的限制。

**重要**  
以下 IAM 策略仅允许用户为 Transfer Family 服务器创建和删除 VPC 终端节点，同时拒绝对其他服务执行这些操作：

```
{
    "Effect": "Deny",
    "Action": [
        "ec2:CreateVpcEndpoint",
        "ec2:DeleteVpcEndpoints"
    ],
    "Resource": ["*"],
    "Condition": {
        "ForAnyValue:StringNotLike": {
            "ec2:VpceServiceName": [
                "com.amazonaws.INPUT-YOUR-REGION.transfer.server.*"
            ]
        },
        "StringNotLike": {
            "aws:PrincipalArn": [
                "arn:aws:iam::*:role/INPUT-YOUR-ROLE"
            ]
        }
    }
}
```

*INPUT-YOUR-REGION*替换为您的 AWS 区域（例如**us-east-1**）和*INPUT-YOUR-ROLE*您要向其授予这些权限的 IAM 角色。

## 其他联网功能
<a name="additional-networking-features"></a>

AWS Transfer Family 提供了多项高级联网功能，可在使用 VPC 配置时增强安全性和灵活性：
+ **共享 VPC 环境支持** ——您可以在共享 VPC 环境中托管 Transfer Family 服务器终端节点。有关更多信息，请参阅[ VPCs 与共享中的使用 VPC 托管的终端节点 AWS Transfer Family](https://aws.amazon.com/blogs/storage/using-vpc-hosted-endpoints-in-shared-vpcs-with-aws-transfer-family/)。
+ **身份验证和安全**-您可以使用 AWS Web 应用程序防火墙来保护您的 Amazon API Gateway 终端节点。有关更多信息，请参阅[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/)。

# 将 AWS Transfer Family 服务器终端节点类型从 VPC\$1ENDPOINT 更新到 VPC
<a name="update-endpoint-type-vpc"></a>

你可以使用 AWS 管理控制台 CloudFormation、或 Transfer Family API 将服务器`EndpointType`从更新`VPC_ENDPOINT`为`VPC`。以下各部分提供了使用每种方法更新服务器端点类型的详细过程和示例。如果您在多个 AWS 区域和多个 AWS 账户中拥有服务器，则可以使用下一节中提供的示例脚本进行修改，使用需要更新的`VPC_ENDPOINT`类型来识别服务器。

**Topics**
+ [使用 `VPC_ENDPOINT` 端点类型识别服务器](#id-servers)
+ [使用更新服务器端点类型 AWS 管理控制台](#update-endpoint-console)
+ [使用更新服务器端点类型 CloudFormation](#update-endpoint-cloudformation)
+ [EndpointType 使用 API 更新服务器](#update-endpoint-cli)

## 使用 `VPC_ENDPOINT` 端点类型识别服务器
<a name="id-servers"></a>

您可以使用 `VPC_ENDPOINT` 来识别哪些服务器正在使用 AWS 管理控制台。

**识别通过控制台使用 `VPC_ENDPOINT` 端点类型的服务器**

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

1. 在导航窗格中选择**服务器**，显示该区域中您账户中的服务器列表。

1. 按**端点类型**对服务器列表进行排序，以查看所有使用 `VPC_ENDPOINT` 的服务器。

**要识别`VPC_ENDPOINT`跨多个 AWS 区域和账户使用的服务器**

如果您在多个 AWS 区域和多个 AWS 账户中拥有服务器，则可以使用以下示例脚本（经过修改）来识别使用`VPC_ENDPOINT`终端节点类型的服务器。示例脚本使用 Amazon EC2 [DescribeRegions](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeRegions.html)和 Transfer Famil [https://docs.aws.amazon.com/transfer/latest/APIReference/API_ListServers.html](https://docs.aws.amazon.com/transfer/latest/APIReference/API_ListServers.html)y API 操作。如果您有许多 AWS 账户，如果您使用身份提供商的会话配置文件进行身份验证，则可以使用具有只读审计员访问权限的 IAM 角色遍历您的账户。

1. 以下是一个简单示例。

   ```
   import boto3
   
   profile = input("Enter the name of the AWS account you'll be working in: ")
   session = boto3.Session(profile_name=profile)
   
   ec2 = session.client("ec2")
   
   regions = ec2.describe_regions()
   
   for region in regions['Regions']:
       region_name = region['RegionName']
       if region_name=='ap-northeast-3': #https://github.com/boto/boto3/issues/1943
           continue
       transfer = session.client("transfer", region_name=region_name)
       servers = transfer.list_servers()
       for server in servers['Servers']:
          if server['EndpointType']=='VPC_ENDPOINT':
              print(server['ServerId'], region_name)
   ```

1. 获得要更新的服务器列表后，您可以使用以下各部分中描述的方法之一将 `EndpointType` 更新为 `VPC`。

## 使用更新服务器端点类型 AWS 管理控制台
<a name="update-endpoint-console"></a>

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

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

1. 选中要更改其端点类型的服务器的复选框。
**重要**  
您必须先停止服务器，然后才能更改其终端节点。

1. 对于**操作**，选择**停止**。

1. 在出现的确认对话框中，通过选择**停止**来确认您要停止服务器。
**注意**  
在继续下一步之前，请等待服务器的**状态**变为**离线**；这可能需要几分钟。您可能必须在**服务器**页面上选择**刷新**才能查看状态更改。

1. 状态更改为**离线**后，选择服务器以显示服务器详细信息页面。

1. 在**端点详细信息**部分中，选择**编辑**。

1. 为**端点类型**选择 **VPC 托管**。

1. 选择**保存**

1. 在**操作**中，选择**启动**，然后等待服务器状态更改为**在线**；这可能需要几分钟。

## 使用更新服务器端点类型 CloudFormation
<a name="update-endpoint-cloudformation"></a>

本节介绍 CloudFormation 如何使用将服务器更新`EndpointType`为`VPC`。对于使用部署的 Transfer Family 服务器，请使用此过程 CloudFormation。在此示例中，用于部署 Transfer Family 服务器的原始 CloudFormation 模板如下所示：

```
AWS TemplateFormatVersion: '2010-09-09'
Description: 'Create AWS Transfer Server with VPC_ENDPOINT endpoint type'
Parameters:
  SecurityGroupId:
    Type: AWS::EC2::SecurityGroup::Id
  SubnetIds:
    Type: List<AWS::EC2::Subnet::Id>
  VpcId:
    Type: AWS::EC2::VPC::Id
Resources:
  TransferServer:
    Type: AWS::Transfer::Server
    Properties:
      Domain: S3
      EndpointDetails:
        VpcEndpointId: !Ref VPCEndpoint
      EndpointType: VPC_ENDPOINT
      IdentityProviderType: SERVICE_MANAGED
      Protocols:
        - SFTP
  VPCEndpoint:
    Type: AWS::EC2::VPCEndpoint
    Properties:
      ServiceName: com.amazonaws.us-east-1.transfer.server
      SecurityGroupIds:
        - !Ref SecurityGroupId
      SubnetIds:
        - !Select [0, !Ref SubnetIds]
        - !Select [1, !Ref SubnetIds]
        - !Select [2, !Ref SubnetIds]
      VpcEndpointType: Interface
      VpcId: !Ref VpcId
```

模板已更新，其中包含以下更改：
+ `EndpointType` 已更改为 `VPC`。
+ `AWS::EC2::VPCEndpoint` 资源已删除。
+ `SecurityGroupId`、`SubnetIds`、和 `VpcId` 已移至`EndpointDetails`资源`AWS::Transfer::Server`部分，
+ `VpcEndpointId` 的 `EndpointDetails` 属性已删除。

更新后的模板如下所示：

```
AWS TemplateFormatVersion: '2010-09-09'
Description: 'Create AWS Transfer Server with VPC endpoint type'
Parameters:
  SecurityGroupId:
    Type: AWS::EC2::SecurityGroup::Id
  SubnetIds:
    Type: List<AWS::EC2::Subnet::Id>
  VpcId:
    Type: AWS::EC2::VPC::Id
Resources:
  TransferServer:
    Type: AWS::Transfer::Server
    Properties:
      Domain: S3
      EndpointDetails:
        SecurityGroupIds:
          - !Ref SecurityGroupId
        SubnetIds:
          - !Select [0, !Ref SubnetIds]
          - !Select [1, !Ref SubnetIds]
          - !Select [2, !Ref SubnetIds]
        VpcId: !Ref VpcId
      EndpointType: VPC
      IdentityProviderType: SERVICE_MANAGED
      Protocols:
        - SFTP
```

**更新使用部署的 Transfer Family 服务器的端点类型 CloudFormation**

1. 使用以下步骤停止要更新的服务器。

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

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

   1. 选中要更改其端点类型的服务器的复选框。
**重要**  
您必须先停止服务器，然后才能更改其终端节点。

   1. 对于**操作**，选择**停止**。

   1. 在出现的确认对话框中，通过选择**停止**来确认您要停止服务器。
**注意**  
在继续下一步之前，请等待服务器的**状态**变为**离线**；这可能需要几分钟。您可能必须在**服务器**页面上选择**刷新**才能查看状态更改。

1. 更新堆 CloudFormation 栈

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

   1. 选择用于创建 Transfer Family 服务器的堆栈。

   1. 选择**更新**。

   1. 选择**替换当前模板**

   1. 上传新模板。 CloudFormation 更改集可帮助您在实施模板更改之前了解模板更改将如何影响正在运行的资源。在此示例中，将修改传输服务器资源，并删除该 VPCEndpoint 资源。VPC 端点类型服务器代表您创建 VPC 端点，替换原始 `VPCEndpoint` 资源。

      上传新模板后，更改集将与以下所示类似：  
![\[显示用于替换当前 CloudFormation 模板的更改集预览页面。\]](http://docs.aws.amazon.com/zh_cn/transfer/latest/userguide/images/vpc-endpoint-update-cfn.png)

   1. 更新堆栈。

1. 堆栈更新完成后，导航至 Transfer Family 管理控制台，网址为[https://console.aws.amazon.com/transfer/](https://console.aws.amazon.com/transfer/)。

1. 重新启动服务器。选择您更新的服务器 CloudFormation，然后从 “**操作**” 菜单中选择 “**启动**”。

## EndpointType 使用 API 更新服务器
<a name="update-endpoint-cli"></a>

您可以使用 [describe-server](https://docs.aws.amazon.com/cli/latest/reference/transfer/update-server.html) AWS CLI 命令或 [UpdateServer](https://docs.aws.amazon.com/transfer/latest/APIReference/API_UpdateServer.html) API 命令。以下示例脚本停止 Transfer Family 服务器、更新 EndpointType、移除 VPC\$1ENDPOINT 并启动服务器。

```
import boto3
import time

profile = input("Enter the name of the AWS account you'll be working in: ")
region_name = input("Enter the AWS Region you're working in: ")
server_id = input("Enter the AWS Transfer Server Id: ")

session = boto3.Session(profile_name=profile)

ec2 = session.client("ec2", region_name=region_name)
transfer = session.client("transfer", region_name=region_name)

group_ids=[]

transfer_description = transfer.describe_server(ServerId=server_id)
if transfer_description['Server']['EndpointType']=='VPC_ENDPOINT':
    transfer_vpc_endpoint = transfer_description['Server']['EndpointDetails']['VpcEndpointId']
    transfer_vpc_endpoint_descriptions = ec2.describe_vpc_endpoints(VpcEndpointIds=[transfer_vpc_endpoint])
    for transfer_vpc_endpoint_description in transfer_vpc_endpoint_descriptions['VpcEndpoints']:
        subnet_ids=transfer_vpc_endpoint_description['SubnetIds']
        group_id_list=transfer_vpc_endpoint_description['Groups']
        vpc_id=transfer_vpc_endpoint_description['VpcId']
        for group_id in group_id_list:
             group_ids.append(group_id['GroupId'])
    if transfer_description['Server']['State']=='ONLINE':
        transfer_stop = transfer.stop_server(ServerId=server_id)
        print(transfer_stop)
        time.sleep(300) #safe
        transfer_update = transfer.update_server(ServerId=server_id,EndpointType='VPC',EndpointDetails={'SecurityGroupIds':group_ids,'SubnetIds':subnet_ids,'VpcId':vpc_id})
        print(transfer_update)
        time.sleep(10) 
        transfer_start = transfer.start_server(ServerId=server_id)
        print(transfer_start)
        delete_vpc_endpoint = ec2.delete_vpc_endpoints(VpcEndpointIds=[transfer_vpc_endpoint])
```

# 使用自定义主机名
<a name="requirements-dns"></a>

*服务器主机名*是用户连接到服务器时在客户端中输入的主机名。使用时，您可以使用已注册的自定义域作为服务器主机名 AWS Transfer Family。例如，您可以使用类似于 `mysftpserver.mysubdomain.domain.com` 的自定义主机名。

要将流量从注册的自定义域重定向到您的服务器端点，您可以使用 Amazon Route 53 或任何域名系统 (DNS) 提供商。Route 53 是 AWS Transfer Family 原生支持的 DNS 服务。

**Topics**
+ [使用 Amazon Route 53 作为 DNS 提供商](#requirements-use-r53)
+ [使用其他 DNS 提供商](#requirements-use-alt-dns)
+ [非控制台创建的服务器的自定义主机名](#tag-custom-hostname-cdk)

在控制台上，您可以选择下列选项之一来设置自定义主机名：
+ **Amazon Route 53 DNS 别名**— 如果要使用的主机名已注册到 Route 53。然后，您可以输入主机名。
+ **其他 DNS**— 如果要使用的主机名已注册到另一个 DNS 提供商。然后，您可以输入主机名。
+ **无** — 使用服务器的端点，而不是使用自定义主机名。

在创建新的服务器或编辑现有服务器的配置时设置此选项。有关创建新的服务器的更多信息，请参阅 [步骤 2：创建启用 SFTP 的服务器](getting-started.md#getting-started-server)。有关编辑现有服务器配置的更多信息，请参阅 [编辑服务器详细信息](edit-server-config.md)。

有关使用自己的域作为服务器主机名以及如何 AWS Transfer Family 使用 Route 53 的更多详细信息，请参阅以下各节。

## 使用 Amazon Route 53 作为 DNS 提供商
<a name="requirements-use-r53"></a>

当您创建服务器时，您可以使用 Amazon Route 53 作为您的 DNS 提供程序。在将一个域用于 Route 53 之前，请先注册该域。有关更多信息，请参阅 *Amazon Route 53 开发人员指南*中的[域注册工作原理](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/welcome-domain-registration.html)。

当您使用 Route 53 为服务器提供 DNS 路由时，会 AWS Transfer Family 使用您输入的自定义主机名来提取其托管区域。 AWS Transfer Family 提取托管区域时，可能会发生三种情况：

1. 如果您是 Route 53 的新手并且没有托管区域，请 AWS Transfer Family 添加新的托管区域和`CNAME`记录。此 `CNAME` 记录的值为服务器的端点主机名。*CNAME *为备用域名。

1. 如果您在 Route 53 中有一个不带任何 `CNAME` 记录的托管区域，则 AWS Transfer Family 会向该托管区域添加一条 `CNAME` 记录。

1. 如果服务检测到该托管区域中已有一条 `CNAME` 记录，则会显示一个错误，指示 `CNAME` 记录已存在。在此情况下，请将 `CNAME` 记录的值更改为服务器的主机名。

有关 Route 53 中托管区域的更多信息，请参阅 [Amazon Route 53 开发人员指南](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/CreatingHostedZone.html)中的*托管区域*。

## 使用其他 DNS 提供商
<a name="requirements-use-alt-dns"></a>

在创建服务器时，您还可以使用 Amazon Route 53 之外的 DNS 提供商。如果您使用替代 DNS 提供商，请确保域中的流量被定向到服务器端点。

为此，请将域设置为服务器的端点主机名。
+ 对于 IPv4 端点，控制台中的主机名如下所示：

   `serverid.server.transfer.region.amazonaws.com` 
+ 对于双栈端点，主机名在控制台中如下所示：

   `serverid.transfer-server.region.on.aws` 

**注意**  
如果您的服务器有 VPC 终端节点，则主机名的格式与上述格式不同。要查找您的 VPC 端点，请在服务器的详细信息页面上选择 VPC，然后在 VPC 控制面板上选择 **VPC 端点 ID**。端点是列出的第一个 DNS 名称。

## 非控制台创建的服务器的自定义主机名
<a name="tag-custom-hostname-cdk"></a>

使用 AWS Cloud Development Kit (AWS CDK) CloudFormation、或 CLI 创建服务器时，如果您希望该服务器具有自定义主机名，则必须添加标记。当您使用控制台创建 Transfer Family 服务器时，会自动完成标记。

**注意**  
您还需要创建 DNS 记录，以将流量从您的域名重定向到服务器端点。有关详细信息，请参阅《*Amazon Route 53 开发者指南》*中的[处理记录](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/rrsets-working-with.html)。

使用以下密钥作为您的自定义主机名：
+ 添加 `transfer:customHostname` 以在控制台中显示自定义主机名。
+ 如果您使用 Route 53 作为 DNS 提供商，请添加 `transfer:route53HostedZoneId`。此标签将自定义主机名链接到您的 Route 53 托管区 ID。

要添加自定义主机名，请发出以下 CLI 命令。

```
aws transfer tag-resource --arn arn:aws:transfer:region:AWS 账户:server/server-ID --tags Key=transfer:customHostname,Value="custom-host-name"
```

例如：

```
aws transfer tag-resource --arn arn:aws:transfer:us-east-1:111122223333:server/s-1234567890abcdef0 --tags Key=transfer:customHostname,Value="abc.example.com"
```

如果您使用的是 Route 53，请发出以下命令将您的自定义主机名链接到您的 Route 53 托管区 ID。

```
aws transfer tag-resource --arn server-ARN:server/server-ID --tags Key=transfer:route53HostedZoneId,Value=HOSTED-ZONE-ID
```

例如：

```
aws transfer tag-resource --arn arn:aws:transfer:us-east-1:111122223333:server/s-1234567890abcdef0 --tags Key=transfer:route53HostedZoneId,Value=ABCDE1111222233334444
```

假设上一个命令中的示例值，运行以下命令来查看标签：

```
aws transfer list-tags-for-resource --arn arn:aws:transfer:us-east-1:111122223333:server/s-1234567890abcdef0
```

```
"Tags": [
   {
      "Key": "transfer:route53HostedZoneId",
      "Value": "/hostedzone/ABCDE1111222233334444"
   },
   {
      "Key": "transfer:customHostname",
      "Value": "abc.example.com"
   }
 ]
```

**注意**  
 您的公共、托管区域及其 IDs 在 Amazon Route 53 上可用。  
登录 AWS 管理控制台 并打开 Route 53 控制台，网址为[https://console.aws.amazon.com/route53/](https://console.aws.amazon.com/route53/)。

## FTP 和 FTPS 网络负载均衡器注意事项
<a name="ftp-ftps-nlb-considerations"></a>

尽管我们建议避免在 AWS Transfer Family 服务器前面使用网络负载均衡器，但如果您的 FTP 或 FTPS 实施需要在客户端的通信路由中使用 NLB 或 NAT，请遵循以下建议：
+ 对于 NLB，请使用端口 21 而不是端口 8192-8200 进行运行状况检查。
+ 对于 AWS Transfer Family 服务器，通过设置启用 TLS 会话恢复`TlsSessionResumptionMode = ENFORCED`。
**注意**  
这是推荐的模式，因为它提供了增强的安全性：  
要求客户端在后续连接中使用 TLS 会话恢复。
通过确保一致的加密参数来提供更强的安全保障。
有助于防止潜在的降级攻击。
在优化性能的同时保持对安全标准的合规性。
+ 如果可能，请停止使用 NLB，以充分利用 AWS Transfer Family 性能和连接限制。

有关 NLB 替代方案的更多指导，请通过 AWS Support 联系 AWS Transfer Family 产品管理团队。有关改善安全状况的更多信息，请参阅博客文章《[提高 AWS Transfer Family 服务器安全性的六个技巧》](https://aws.amazon.com/blogs/security/six-tips-to-improve-the-security-of-your-aws-transfer-family-server/)。

 中提供了安全指南[避免将服务器放在 NLBs AWS Transfer Family 服务器前面 NATs](infrastructure-security.md#nlb-considerations)。 NLBs 

# 使用客户端通过服务器端点传输文件
<a name="transfer-file"></a>

通过在客户端中指定传输操作，您可以通过 AWS Transfer Family 服务传输文件。 AWS Transfer Family 支持以下客户端：
+ 我们支持 SFTP 协议的第 3 版。
+ OpenSSH (macOS 和 Linux)
**注意**  
此客户端仅适用于启用了 Secure Shell (SSH) 文件传输协议 (SFTP) 的服务器。
+ WinSCP（仅 Microsoft Windows）
+ Cyberduck（Windows、macOS 和 Linux）
+ FileZilla （Windows、macOS 和 Linux）

以下限制适用于每个客户端：
+ 不支持 SCP 协议，因为它被认为是不安全的。您可以按中所述使用 OpenSSH `scp` 命令。[使用 `scp` 命令](#openssh-scp)
+ 每个连接的并发、多路复用、SFTP 会话的最大数量为 10。
+ 对于空闲连接，所有协议 () 的超时值均为 1800 秒（30 分钟SFTP/FTP/FTPS）。如果在此期间之后没有任何活动，则客户端可能会断开连接。对于无响应的连接：
  + 当客户端完全无响应时，SFTP 会有 300 秒（5 分钟）的超时时间。
  + FTPS 和 FTP 有大约 10 分钟的无响应超时，由底层库处理。
+ 亚马逊 S3 和 Amazon EFS（由于 NFSv4 协议）要求文件名采用 UTF-8 编码。使用不同的编码可能会导致意想不到的结果。对于 Amazon S3，请参阅[对象密钥命名指南](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-keys.html#object-key-guidelines)。
+ 对于 安全文件传输协议 (FTPS)，仅支持显式模式。不支持隐式模式。
+ 对于文件传输协议 (FTP) 和 FTPS，仅支持被动模式。
+ 对于 FTP 和 FTPS，仅支持流模式。
+ 对于 FTP 和 FTPS，仅支持 Image/Binary 模式。
+ 对于 FTP 和 FTPS，数据连接的 TLS-PROT C（未受保护）TLS 是默认值，但是 AWS Transfer Family FTPS 协议不支持端口 C。因此，对于 FTPS，您需要发出 PROT P，您的数据操作才能被接受。
+ 如果您使用 Amazon S3 作为服务器存储，并且您的客户端包含使用多个连接进行单次传输的选项，请务必禁用该选项。否则，上传大文件可能会突然失败。请注意，如果您使用 Amazon EFS 作为存储后端，EFS *确实*支持多个连接进行单次传输。

以下是 FTP 和 FTPS 的可用命令列表：


| 可用命令 | 
| --- | 
| ABOR | FEAT | MLST | PASS | RETR | STOR | 
| AUTH | LANG | MKD | PASV | RMD | STOU | 
| CDUP | LIST | MODE | PBSZ | RNFR | STRU | 
| CWD | MDTM | NLST | PROT | RNTO | SYST | 
| DELE | MFMT | NOOP | PWD | SIZE | TYPE | 
| EPSV | MLSD | OPTS | QUIT | STAT | USER | 

**注意**  
不支持 APPE。

对于 SFTP，目前不支持在使用 Amazon Elastic File System (Amazon EFS) 的服务器上使用逻辑主目录的用户执行以下操作。


| SFTP 命令不受支持 | 
| --- | 
| SSH\$1FXP\$1READLINK | SSH\$1FXP\$1SYMLINK | SSH\$1FXP\$1STAT（当请求的文件是符号链接时） | SSH\$1FXP\$1REALPATH（当请求的路径包含任何符号链接组件时） | 

**生成公有-私有密钥对**  
 在传输文件之前，必须有可用的公有-私有密钥对。如果您之前没有生成过密钥对，请参阅 [为服务托管用户生成 SSH 密钥](sshkeygen.md)。

**Topics**
+ [可用SFTP/FTPS/FTP命令](#transfer-sftp-commands)
+ [查找您的 Amazon VPC 端点](#find-vpc-endpoint)
+ [避免 `setstat` 错误](#avoid-set-stat)
+ [使用 OpenSSH](#openssh)
+ [使用 WinSCP](#winscp)
+ [使用 Cyberduck](#cyberduck)
+ [使用 FileZilla](#filezilla)
+ [使用 Perl 客户端](#using-clients-with-perl-modules)
+ [使用 LFTP](#using-client-lftp)
+ [上传后处理](#post-processing-upload)
+ [SFTP 消息](#sftp-transfer-activity-types)

## 可用SFTP/FTPS/FTP命令
<a name="transfer-sftp-commands"></a>

下表描述了 SFTP AWS Transfer Family、FTPS 和 FTP 协议的可用命令。

**注意**  
该表提到了仅支持存储桶和对象的 Amazon S3 的*文件*和*目录*：无层次结构。但是，您可以在对象键名称中使用前缀来暗示层次结构，并以类似于文件夹的方式组织数据。*Amazon Simple Storage Service 用户指南*中的[使用对象元数据](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingMetadata.html)中描述了该行为。


**SFTP/FTPS/FTP 命令**  

| 命令 | Amazon S3 | Amazon EFS | 
| --- | --- | --- | 
| cd | 支持 | 支持 | 
| chgrp | 不支持  | 支持（仅 root 或 owner） | 
| chmod | 不支持 | 支持（仅 root） | 
| chmtime | 不支持 | 支持 | 
| chown | 不支持 | 支持（仅 root） | 
| get | 支持 | 支持（包括解析符号链接） | 
| ln -s | 不支持  | 支持 | 
| ls/dir | 支持 | 支持 | 
| mkdir | 支持 | 支持 | 
| put | 支持 | 支持 | 
| pwd | 支持 | 支持 | 
| rename |  仅支持文件  不支持会覆盖现有文件的重命名。   | 支持  不支持会覆盖现有文件或目录的重命名。  | 
| rm | 支持 | 支持 | 
| rmdir | 支持（仅限空目录） | 支持 | 
| version | 支持 | 支持 | 

## 查找您的 Amazon VPC 端点
<a name="find-vpc-endpoint"></a>

如果您的 Transfer Family 服务器的端点类型是 VPC，则识别用于传输文件的端点并不简单。在这种情况下，使用以下过程查找您的 Amazon VPC 端点。

**查找您的亚马逊 VPC 终端节点**

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

1. 在**端点详细信息**窗格中，选择 **VPC**。  
![\[\]](http://docs.aws.amazon.com/zh_cn/transfer/latest/userguide/images/server-details-endpoint-vpc.png)

1. 在 Amazon VPC 控制面板中，选择 **VPC 端点 ID**。

1. 在 **DNS 名称**列表中，您的服务器端点是第一个列出的端点。  
![\[\]](http://docs.aws.amazon.com/zh_cn/transfer/latest/userguide/images/server-details-endpoint-vpc-2.png)

## 避免 `setstat` 错误
<a name="avoid-set-stat"></a>

一些 SFTP 文件传输客户端可以在上传文件时尝试使用命令（例如 SETSTAT）更改远程文件的属性，包括时间戳和权限。但是，这些命令与 Amazon S3 等对象存储系统不兼容。由于这种不兼容性，即使文件以其他方式成功上传，从这些客户端上传文件也可能导致错误。
+ 当您调用 `CreateServer` 或 `UpdateServer` API 时，使用 `ProtocolDetails` 选项 `SetStatOption` 可以忽略当客户端尝试对要上传到 S3 存储桶的文件使用 SETSTAT 时生成的错误。
+ 将该值设置为 `ENABLE_NO_OP` 以使 Transfer Family 服务器忽略 SETSTAT 命令，并上传文件而无需对您的 SFTP 客户端进行任何更改。
+ 请注意，虽然该`SetStatOption``ENABLE_NO_OP`设置忽略了错误，但它*确实*会在日志中 CloudWatch 生成一个日志条目，因此您可以确定客户端何时进行 SETSTAT 调用。

 有关此选项的 API 详细信息，请参阅[ProtocolDetails](https://docs.aws.amazon.com/transfer/latest/APIReference/API_ProtocolDetails.html)。

## 使用 OpenSSH
<a name="openssh"></a>

本节包含使用 OpenSSH 从命令行传输文件的说明。

**注意**  
此客户端仅适用于启用 SFTP 的服务器。

**Topics**
+ [使用 OpenSSH](#openssh-use)
+ [使用 `scp` 命令](#openssh-scp)

### 使用 OpenSSH
<a name="openssh-use"></a>

**AWS Transfer Family 使用 OpenSSH 命令行实用程序传输文件**

1. 在 Linux、macOS 或 Windows 上，打开命令终端。

1. 在提示符中，输入以下命令：

   `sftp -i transfer-key sftp_user@service_endpoint`

   在前面的命令中，`sftp_user` 是用户名，`transfer-key` 是 SSH 私有密钥。此处`service_endpoint`是服务器的终端节点，如所选服务器的 AWS Transfer Family 控制台中所示。
**注意**  
此命令使用默认`ssh_config`文件中的设置。除非您之前编辑过此文件，否则 SFTP 使用端口 22。您可以通过在命令中添加**-P**标志来指定其他端口（例如 2222），如下所示。  

   ```
   sftp -P 2222 -i transfer-key sftp_user@service_endpoint
   ```
或者，如果您一直想使用端口 2222 或端口 22000，则可以更新文件中的`ssh_config`默认端口。

   此时应显示 `sftp` 提示符。

1.  （可选）要查看用户的主目录，请在 `sftp` 提示符下输入以下命令：

   `pwd` 

1. 要将文件从您的文件系统上传到 Transfer Family 服务器，请使用 `put` 命令。例如，要上传 `hello.txt`（假设该文件位于文件系统的当前目录中），请在 `sftp` 提示符下运行以下命令：

   `put hello.txt` 

   此时将显示类似于下文的消息，指示文件传输正在进行或者已完成。

   `Uploading hello.txt to /amzn-s3-demo-bucket/home/sftp_user/hello.txt`

   `hello.txt 100% 127 0.1KB/s 00:00`

**注意**  
在您的服务器创建之后，环境中的 DNS 服务可能需要几分钟时间才能解析服务器端点主机名。

### 使用 `scp` 命令
<a name="openssh-scp"></a>

Transfer Family 不支持 SCP 协议。但是，如果您需要此功能，则可以使用 OpenSSH `scp` 命令。

通过 SFTP 使用 SCP 的建议是使用 OpenSSH 版本 9.0 或更高版本。在 OpenSSH 版本 9 及更高版本中，该`scp`命令默认使用 SFTP 协议进行文件传输，而不是传统的 SCP 协议。

**重要**  
确保您的 Transfer Family 服务器已配置为使用 S3 优化的目录访问权限。

## 使用 WinSCP
<a name="winscp"></a>

按照下文中的说明，使用 WinSCP 从命令行传输文件。

**注意**  
如果您使用的是 WinSCP 5.19，则可以使用您的证书和文件直接连接到 Amazon S3。 AWS upload/download 有关更多详细信息，请参阅[连接到 Amazon S3 服务](https://winscp.net/eng/docs/guide_amazon_s3)。

**AWS Transfer Family 使用 WinSCP 传输文件**

1. 打开 WinSCP 客户端。

1. 在**登录**对话框中，为**文件协议**选择一个协议：**SFTP** 或 **FTP**。

   如果您选择了**加密**，请选择下列选项之一：
   + FTP **没有加密**
   + 适用于 FTPS 的 **TLS/SSL 显式加密**

1. 对于**主机名**，输入您的服务器端点。服务器端点位于**服务器详细信息**页面。有关更多信息，请参阅 [查看 SFTP、FTPS 和 FTP 服务器的详细信息](configuring-servers-view-info.md)。

   如果您的服务器使用 VPC 端点，请参阅 [查找您的 Amazon VPC 端点](#find-vpc-endpoint)。

1. 在**端口号**中，输入以下内容：
   + 适用于 SFTP 的 **22**
   + 适用于 FTP/FTPS 的 **21**

1. 在**用户名**中，输入您为特定身份提供商创建的用户名称。

   **提示：**用户名应是您为身份提供商创建或配置的用户之一。 AWS Transfer Family 提供以下身份提供商：
   + [与服务托管用户合作](service-managed-users.md)
   + [使用微软 Active Directory 的 AWS 目录服务](directory-services-users.md)
   + [使用自定义身份提供程序](custom-idp-intro.md)

1. 选择**高级**打开**高级站点设置**对话框。在 **SSH** 部分中，选择**身份验证**。

1. 对于**私有密钥文件**，从文件系统中浏览并选择 SSH 私有密钥文件。

   如果 WinSCP 提供将 SSH 私有密钥转换为 PPK 格式，请选择**确定**。

1. 选择**确定**以返回到**登录**对话框，然后选择**保存**。

1. 在**将会话保存为站点**对话框中，选择**确定**以完成您的连接设置。

1. 在**登录**对话框中，选择**工具**，然后选择**首选项**。

1. 在**首选项**对话框中的**传输**中，选择**耐力**。

   对于 “**允许传输 resume/transfer 到临时文件名**” 选项，选择 “**禁用**”。
**重要**  
如果您启用此选项，则会增加上传成本，从而显著降低上传性能。它还可能导致大文件上传失败。

1. 对于**传输**，选择**背景**，然后清除**使用多个连接进行单次传输**复选框。

   **提示：**如果选择此选项，则上传大文件可能会以不可预知的方式失败。例如，可以创建会产生 Amazon S3 费用的孤立分段上传。还可能发生静默数据损坏。

1. 执行文件传输。

   您可以使用 drag-and-drop方法在目标窗口和源窗口之间复制文件。在 WinSCP 中，您可以使用工具栏图标来上传、下载、删除、编辑或修改文件的属性。

**注意**  
如果您使用 Amazon EFS 进行存储，则本说明不适用。  
尝试更改远程文件属性（包括时间戳）的命令与 Amazon S3 等对象存储系统不兼容。因此，如果您使用 Amazon S3 进行存储，请务必在执行文件传输之前禁用 WinSCP 时间戳设置（或按 `SetStatOption` 中所述使用 [避免 `setstat` 错误](#avoid-set-stat)）。为此，请在 **WinSCP 传输设置**对话框中，禁用**设置权限**上传选项和**保留时间戳**常用选项。

## 使用 Cyberduck
<a name="cyberduck"></a>

按照下文中的说明，使用 Cyberduck 从命令行传输文件。

**AWS Transfer Family 使用 Cyberduck 传输文件**

1. 打开 [Cyberduck](https://cyberduck.io/download/) 客户端。

1. 选择**打开连接**。

1. 在**打开连接**对话框中，选择协议：**SFTP（SSH 文件传输协议）**、**FTP-SSL（显式身份验证 TLS）**或 **FTP（文件传输协议）**。

1. 对于**服务器**，输入您的服务器端点。服务器端点位于**服务器详细信息**页面。有关更多信息，请参阅 [查看 SFTP、FTPS 和 FTP 服务器的详细信息](configuring-servers-view-info.md)。

   如果您的服务器使用 VPC 端点，请参阅 [查找您的 Amazon VPC 端点](#find-vpc-endpoint)。

1. 在**端口号**中，输入以下内容：
   + 适用于 SFTP 的 **22**
   + 适用于 FTP/FTPS 的 **21**

1. 对于**用户名**，输入您在[管理服务器端点的用户](create-user.md)中创建的用户的名称。

1. 如果选择了 SFTP，则在 **SSH 私有密钥**中，选择或输入 SSH 私有密钥。

1. 选择**连接**。

1. 执行文件传输。

   根据您的文件所在的位置，执行以下操作之一：
   + 在您的本地目录（源）中，选择您要传输的文件，然后将这些文件拖放到 Amazon S3 目录（目标）中。
   + 在 Amazon S3 目录（源）中，选择您要传输的文件，然后将这些文件拖放到您的本地目录（目标）中。

## 使用 FileZilla
<a name="filezilla"></a>

按照以下说明使用传输文件 FileZilla。

**设置 FileZilla 文件传输**

1. 打开 FileZilla 客户端。

1. 选择**文件**，然后选择**站点管理器**。

1. 在**站点管理器**对话框中，选择**新建站点**。

1. 在**常规**选项卡的**协议**中选择一个协议：**SFTP** 或 **FTP**。

   如果您选择了**加密**，请选择下列选项之一：
   + **仅使用纯 FTP（不安全）**— 用于 FTP
   + **使用 TLS 上的显式 FTP（如果可用**）— 用于 FTPS

1. 在**主机名**中，输入您正在使用的协议，然后输入您的服务器端点。服务器端点位于**服务器详细信息**页面。有关更多信息，请参阅 [查看 SFTP、FTPS 和 FTP 服务器的详细信息](configuring-servers-view-info.md)。
   + 如果您使用的是 SFTP，请输入：`sftp://hostname`
   +  如果您使用的是 FTPS，请输入：`ftps://hostname`

   请务必*hostname*替换为实际的服务器端点。

   如果您的服务器使用 VPC 端点，请参阅 [查找您的 Amazon VPC 端点](#find-vpc-endpoint)。

1. 在**端口号**中，输入以下内容：
   + 适用于 SFTP 的 **22**
   + 适用于 FTP/FTPS 的 **21**

1. 如果选择了 SFTP，则选择**密钥文件**作为**登录类型**。

   对于**密钥文件**，选择或输入 SSH 私有密钥。

1. 对于**用户名**，输入您在 [管理服务器端点的用户](create-user.md) 中创建的用户的名称。

1. 选择**连接**。

1. 执行文件传输。
**注意**  
如果您中断正在进行的文件传输， AWS Transfer Family 可能会在您的 Amazon S3 存储桶中写入部分对象。如果您中断上传，在继续之前，请检查 Amazon S3 存储桶中文件大小是否与源对象的文件大小相符。

## 使用 Perl 客户端
<a name="using-clients-with-perl-modules"></a>

如果您使用 NET::SFTP::Foreign perl 客户端，则必须将设置`queue_size`为。`1`例如：

`my $sftp = Net::SFTP::Foreign->new('user@s-12345.server.transfer.us-east-2.amazonaws.com', queue_size => 1);`

**注意**  
 [1.92.02](https://metacpan.org/changes/release/SALVA/Net-SFTP-Foreign-1.93#L12) 之前的 `Net::SFTP::Foreign` 修订版本需要使用此解决方法。

## 使用 LFTP
<a name="using-client-lftp"></a>

LFTP 是一个免费的 FTP 客户端，它允许用户通过命令行界面从大多数 Linux 计算机上执行文件传输。

 对于大文件下载，LFTP 存在已知的乱序数据包问题，导致文件传输失败。

## 上传后处理
<a name="post-processing-upload"></a>

您可以查看上传后的处理信息，包括 Amazon S3 对象元数据和事件通知。

**Topics**
+ [Amazon S3 对象元数据](#post-processing-S3-object-metadata)
+ [Amazon S3 事件通知](#post-processing-S3-event-notifications)

### Amazon S3 对象元数据
<a name="post-processing-S3-object-metadata"></a>

作为对象元数据的一部分，您会看到一个名为 `x-amz-meta-user-agent` 的密钥，其值为 `AWSTransfer`，`x-amz-meta-user-agent-id` 的值为 `username@server-id`。`username` 是上传文件的 Transfer Family 用户，`server-id` 也是用于上传的服务器。可以使用对 Lambda 函数中的 S3 对象进行[HeadObject](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectHEAD.html)操作来访问这些信息。

![\[“元数据” 屏幕显示有关 Amazon S3 对象元数据的信息 AWS Transfer Family。\]](http://docs.aws.amazon.com/zh_cn/transfer/latest/userguide/images/s3-object-metadata.png)


### Amazon S3 事件通知
<a name="post-processing-S3-event-notifications"></a>

当使用 Transfer Family 将对象上传到您的 S3 存储桶时，`RoleSessionName` 作为 `[AWS:Role Unique Identifier]/username.sessionid@server-id` 包含在 [S3 事件通知结构](https://docs.aws.amazon.com/AmazonS3/latest/dev/notification-content-structure.html)的请求者字段中。例如，以下是来自 S3 访问权限日志的、用于复制到 S3 存储桶中的请求者字段示例内容。

`arn:aws:sts::AWS-Account-ID:assumed-role/IamRoleName/username.sessionid@server-id`

在上述中请求者字段中，它显示了名为 `IamRoleName` 的 IAM 角色。有关配置 S3 事件通知的更多信息，请参阅 *Amazon Simple Storage Service 开发人员指南*中的[配置 Amazon S3 事件通知](https://docs.aws.amazon.com/AmazonS3/latest/dev/NotificationHowTo.html)。有关 AWS Identity and Access Management (IAM) 角色唯一标识符的更多信息，请参阅*AWS Identity and Access Management 用户指南*中的[唯一标识符](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html#identifiers-unique-ids)。

## SFTP 消息
<a name="sftp-transfer-activity-types"></a>

本节介绍使用 Transfer Family 服务器时，您在传输 SFTP 文件期间或之后可能收到的客户端消息。有关任何 SFTP 事件的更多信息，请查看您的 SFTP 客户端日志。您可以使用该信息对任何错误进行故障排除，也可以将该信息转发给您的网络团队，以帮助他们识别问题。


**SFTP 客户端消息**  

| Activity | 说明 | 
| --- | --- | 
| 身份验证失败 | 用户身份验证失败。这可能是来自自定义身份提供商或服务托管用户的任何类型的故障。事件中的详细信息有助于阐明失败的根本原因。 | 
| CLOSE | 表示已成功关闭打开的文件或目录。 | 
| 已连接/已断开 | 表示正常连接成功和断开连接。 | 
| 创建符号链接  | 符号链接已创建（成功或失败）。 | 
| DELETE | 文件已删除（成功或失败）。 | 
| ERROR | 一个一般的、意想不到的错误。相关的描述包含可以帮助您或您的网络管理员识别具体问题的信息。 | 
| 退出原因 | 当意外错误导致您的 SFTP 会话终止时发出。与事件关联的消息描述了原因。 | 
| MKDIR | 目录已创建（成功或失败）。 | 
| OPEN | 已打开文件进行读取或写入（成功或失败） | 
| 部分关闭 | 当文件仍处于打开状态但未收到 CLOSE 消息时，客户端与服务器断开了连接。Transfer Family 存储文件中收到的部分（实际上可能是完整的文件），并发出 PARTIAL\$1CLOSE 事件以提醒客户注意问题。工作流集成还会收到一个onPartialClose事件，以适当地处理文件。 | 
| RENAME | 文件已重命名（成功或失败） | 
| RMDIR | 目录已删除（成功或失败） | 
| SETSTAT |  文件的属性已更改（成功或失败）。  如果你使用亚马逊 S3 进行存储，Transfer Family 不支持 SETSTAT。本[避免 `setstat` 错误](#avoid-set-stat)节详细介绍了如何通过关闭设置来避免`SetStat`错误。这样可以避免你收到`fail unsupported error`：相反，你会收到`success but do nothing`消息。   | 
| TLS\$1恢复失败  | 服务器配置为强制执行 TLS 会话恢复，但客户端不支持。 | 

# 管理服务器端点的用户
<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）。如果用户不属于任何群组，或者属于多个群组，则不会向该用户授予访问权限。

# 使用逻辑目录简化您的 Transfer Family 目录结构
<a name="logical-dir-mappings"></a>

逻辑目录简化了您的 AWS Transfer Family 服务器目录结构。使用逻辑目录，您可以创建具有用户友好名称的虚拟目录结构，用户在连接到 Amazon S3 存储桶或 Amazon EFS 文件系统时可以浏览该结构。这可以防止用户看到实际的目录路径、存储桶名称和文件系统名称。

**注意**  
您应该使用会话策略，以便您的最终用户只能执行您允许他们执行的操作。  
您应该使用逻辑目录为最终用户创建用户友好的虚拟目录，并抽象存储桶名称。逻辑目录映射仅允许用户访问其指定的逻辑路径和子目录，禁止使用遍历逻辑根目录的相对路径。  
Transfer Family 会验证可能包含相对元素的每条路径，并在我们将这些路径传递给 Amazon S3 之前主动阻止解析这些路径；这样可以防止您的用户超越其逻辑映射。  
尽管 Transfer Family 会阻止您的最终用户访问其逻辑目录之外的目录，但我们也建议您使用唯一的角色或会话策略在存储级别强制执行最低权限。

## 了解 chroot 和目录结构
<a name="chroot-dir-structure"></a>

**chroot** 操作允许您将用户的根目录设置为存储层次结构中的任何位置。这会将用户限制在他们配置的主目录或根目录中，从而阻止访问更高级别的目录。

假设一个 Amazon S3 用户仅限于`amzn-s3-demo-bucket/home/${transfer:UserName}`。如果没有 **chroot**，某些客户端可能会允许用户向上移至 /amzn-s3-demo-bucket/home，需要注销并登录才能返回到正确的目录。执行 **chroot** 操作可以防止出现此问题。

您可以跨多个存储桶和前缀创建自定义目录结构。如果您的工作流程需要仅靠存储桶前缀无法提供的特定目录布局，则此功能非常有用。您还可以链接到 Amazon S3 中的多个非连续位置，类似于在 Linux 文件系统中创建符号链接，其中您的目录路径引用文件系统中的不同位置。

## 使用逻辑目录的规则
<a name="logical-dir-rules"></a>

本节介绍使用逻辑目录的一些规则和其他注意事项。

### 映射限制
<a name="key-mapping-rules"></a>
+ 如果`Entry`是，则只允许一个映射`"/"`（不允许重叠路径）。
+ 对于自定义 IDP 和 AD 用户，逻辑目录支持最大 2.1 MB 的映射，为服务管理的用户支持最大 2,000 个条目的映射。您可以按如下方式计算映射大小：

  1. 用格式写出一个典型的映射`{"Entry":"/entry-path","Target":"/target-path"}`，其中`entry-path`和`target-path`是你将要使用的实际值。

  1. 计算该字符串中的字符，然后添加一 (1)。

  1. 将该数字乘以服务器的近似映射数。

  如果您在步骤 3 中估计的数字小于 2.1 MB，则您的映射在可接受的限制范围内。

### 目标路径要求
<a name="target-path"></a>
+ 如果存储桶或文件系统路径已根据用户名进行了参数化，则使用`${transfer:UserName}`变量。
+ 只要关联的 IAM 角色具有访问这些存储位置的必要权限，就可以将目标配置为指向不同的 Amazon S3 存储桶或文件系统。
+ 所有目标必须以正斜杠 (`/`) 开头，但不能以正斜杠 () 结尾。例如，`/amzn-s3-demo-bucket/images`是正确的，while `amzn-s3-demo-bucket/images ` an `/amzn-s3-demo-bucket/images/` d 不是。

### 存储注意事项
<a name="storage-considerations"></a>
+ Amazon S3 是一个对象存储，其中的文件夹仅作为虚拟概念存在。使用 Amazon S3 存储时，即使没有带有尾部斜杠的零字节对象，Transfer Family 也会在 STAT 操作中将前缀报告为目录。在 STAT 操作中，带有尾部斜杠的正确零字节对象也被报告为目录。《亚马逊*简单存储服务用户指南*[》中的使用文件夹在 Amazon S3 控制台中组织对象](https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-folders.html)中描述了此行为。
+ 对于需要区分文件和文件夹的应用程序，请使用亚马逊弹性文件系统 (Amazon EFS) 作为您的 Transfer Family 存储选项。
+ 如果您为用户指定逻辑目录值，则使用的参数取决于用户的类型：
  + 对于服务托管的用户，请在 `HomeDirectoryMappings` 中提供逻辑目录值。
  + 对于自定义身份提供商用户，请在中提供逻辑目录值`HomeDirectoryDetails`。

### 用户目录值
<a name="user-dir-values"></a>
+ 用于指定逻辑目录值的参数取决于您的用户类型：
  + 对于服务托管的用户，请在 `HomeDirectoryMappings` 中提供逻辑目录值。
  + 对于自定义身份提供商用户，请在中提供逻辑目录值`HomeDirectoryDetails`。
+ 使用 LOGICAL 时 HomeDirectoryType，您可以为服务托管用户、Active Directory 访问权限和自定义身份提供者实现指定一个 HomeDirectory值， HomeDirectoryDetails 这些实现将在响应中提供。如果未指定， HomeDirectory 则默认为`/`。

有关如何实现逻辑目录的详细信息，请参阅[实现逻辑目录](implement-log-dirs.md)。

# 实现逻辑目录
<a name="implement-log-dirs"></a>

**重要**  
**根目录要求**
如果您未使用 Amazon S3 性能优化设置，则启动时必须存在根目录。
对于 Amazon S3，这意味着创建一个以正斜杠 () `/` 结尾的零字节对象。
为避免此要求，请考虑在创建或更新服务器时启用 Amazon S3 性能优化。
 HomeDirectory 使用 LOGICAL 指定 a 时 HomeDirectoryType，该值必须映射到您的一个逻辑目录映射。该服务在用户创建和更新过程中都会对此进行验证，以防止配置失效。
**逻辑主目录配置**
使用 LOGICAL 作为您的时 HomeDirectoryType，请注意以下几点：  
该 HomeDirectory 值必须对应于您现有的逻辑目录映射之一。
在用户创建和更新过程中，系统会自动对此进行验证。
此验证可防止可能导致访问问题的配置。

## 启用逻辑目录
<a name="enable-log-dirs-small"></a>

要为用户使用逻辑目录，请将`HomeDirectoryType`参数设置为`LOGICAL`。在创建新用户或更新现有用户时执行此操作。

```
"HomeDirectoryType": "LOGICAL"
```

## `chroot`为用户启用
<a name="chroot"></a>

对于 **chroot**，创建一个由每个用户的单个 `Entry` 和 `Target` 配对组成的目录结构。Entry**/**代表根文件夹，而 **Targ** et 则指定存储桶或文件系统中的实际位置。

------
#### [ Example for Amazon S3 ]

```
[{"Entry": "/", "Target": "/amzn-s3-demo-bucket/jane"}]
```

------
#### [ Example for Amazon EFS ]

```
[{"Entry": "/", "Target": "/fs-faa1a123/jane"}]
```

------

您可以像前面的示例一样使用绝对路径，也可以使用 `${transfer:UserName}` 动态替换用户名，如下例所示。

```
[{"Entry": "/", "Target":
"/amzn-s3-demo-bucket/${transfer:UserName}"}]
```

在前面的示例中，用户被锁定到其根目录，且无法在层次结构中向上移动。

## 虚拟目录结构
<a name="virtual-dirs"></a>

对于虚拟目录结构，只要用户的 IAM 角色映射有权访问它们，您就可以创建多个 `Entry` `Target` 配对，目标位于您的 S3 存储桶或 EFS 文件系统的任意位置，包括跨多个存储桶或文件系统。

在以下虚拟结构示例中，当用户登录 AWS SFTP 时，他们位于根目录中，子目录为`/pics`、`/doc``/reporting`、和。`/anotherpath/subpath/financials`

**注意**  
除非您选择优化 Amazon S3 目录的性能（当您创建或更新服务器时），否则如果目录尚不存在，则用户或管理员需要创建这些目录。避免这个问题是考虑优化 Amazon S3 性能的理由。  
对于 Amazon EFS，您仍然需要管理员来创建逻辑映射或`/`目录。

```
[
{"Entry": "/pics", "Target": "/amzn-s3-demo-bucket1/pics"}, 
{"Entry": "/doc", "Target": "/amzn-s3-demo-bucket1/anotherpath/docs"},
{"Entry": "/reporting", "Target": "/amzn-s3-demo-bucket2/Q1"},
{"Entry": "/anotherpath/subpath/financials", "Target": "/amzn-s3-demo-bucket2/financials"}]
```



**注意**  
 您只可以将文件上传到映射的特定文件夹。这意味着，在前面的示例中，您不能上传到 `/anotherpath` 或 `anotherpath/subpath` 目录；仅限 `anotherpath/subpath/financials`。您也无法直接映射到这些路径，因为不允许重叠路径。  
 例如，假设您创建以下映射：  

```
{
   "Entry": "/pics", 
   "Target": "/amzn-s3-demo-bucket/pics"
}, 
{
   "Entry": "/doc", 
   "Target": "/amzn-s3-demo-bucket/mydocs"
}, 
{
   "Entry": "/temp", 
   "Target": "/amzn-s3-demo-bucket2/temporary"
}
```
 您只可以将文件上传到这些存储桶中。当您首次通过 `sftp` 连接时，您会被放到根目录 `/` 中。如果您尝试将文件上传到该目录，则上传将失败。以下命令显示了一个示例序列：  

```
sftp> pwd
Remote working directory: /
sftp> put file
Uploading file to /file
remote open("/file"): No such file or directory
```
要上传到任何 `directory/sub-directory`，必须将路径明确映射到 `sub-directory`。

有关配置逻辑目录以及**chroot**为用户配置逻辑目录的更多信息，包括您可以下载和使用的 AWS CloudFormation 模板，请参阅 AWS 存储博客中的使用 [chroot 和逻辑目录简化 AWS SFTP 结构](https://aws.amazon.com/blogs/storage/simplify-your-aws-sftp-structure-with-chroot-and-logical-directories/)。

# 配置逻辑目录示例
<a name="logical-dir-example"></a>

在此示例中，我们创建一个用户并分配两个逻辑目录。以下命令使用逻辑目录 `pics` 和 `doc` 创建新用户（适用于现有的 Transfer Family 服务器）。

```
aws transfer create-user \
    --user-name marymajor \
    --server-id s-11112222333344445 \
    --role arn:aws:iam::1234abcd5678:role/marymajor-role \
    --home-directory-type LOGICAL \
    --home-directory-mappings "[{\"Entry\":\"/pics\", \"Target\":\"/amzn-s3-demo-bucket1/pics\"}, {\"Entry\":\"/doc\", \"Target\":\"/amzn-s3-demo-bucket2/test/mydocs\"}]" \
    --ssh-public-key-body file://~/.ssh/id_rsa.pub
```

如果 **marymajor** 是现有用户并且她的主目录类型是 `PATH`，则您可以使用与前一个命令类似的命令将其更改为 `LOGICAL`。

```
aws transfer update-user \
    --user-name marymajor \
    --server-id s-11112222333344445 \
    --role arn:aws:iam::1234abcd5678:role/marymajor-role \
    --home-directory-type LOGICAL \
    --home-directory-mappings "[{\"Entry\":\"/pics\", \"Target\":\"/amzn-s3-demo-bucket1/pics\"}, {\"Entry\":\"/doc\", \"Target\":\"/amzn-s3-demo-bucket2/test/mydocs\"}]"
```

注意以下几点：
+ 如果目录 `/amzn-s3-demo-bucket1/pics` 和 `/amzn-s3-demo-bucket2/test/mydocs` 尚未存在，则用户（或管理员）需要创建这些目录。
**注意**  
如果您配置了优化的目录，则这些目录将由 Transfer Family 服务器自动创建。
+ **marymajor**连接到服务器并运行`ls -l`命令时，Mary 会看到以下内容：

  ```
  drwxr--r--   1        -        -        0 Mar 17 15:42 doc
  drwxr--r--   1        -        -        0 Mar 17 16:04 pics
  ```
+ **marymajor** 无法在此级别创建任何文件或目录。但是，在 `pics` 和 `doc` 中，她可以添加子目录。
+ Mary 添加`pics`和添加到 Amazon S3 路径的文件将`doc``/amzn-s3-demo-bucket2/test/mydocs`分别添加到 Amazon S3 路径`/amzn-s3-demo-bucket1/pics`和。
+ 在此示例中，我们指定两个不同的存储桶来说明这种可能性。但是，您可以将同一个存储桶用于为用户指定的多个或所有逻辑目录。

此示例为逻辑主路径提供了另一种配置。

```
aws transfer create-user \
    --user-name marymajor \
    --server-id s-11112222333344445 \
    --role arn:aws:iam::1234abcd5678:role/marymajor-role \
    --home-directory-type LOGICAL \
    --home-directory /home/marymajor \
    --home-directory-mappings "[{\"Entry\":\"/home/marymajor/pics\", \"Target\":\"/amzn-s3-demo-bucket1/pics\"}, {\"Entry\":\"/home/marymajor/doc\", \"Target\":\"/amzn-s3-demo-bucket2/test/mydocs\"}]" \
    --ssh-public-key-body file://~/.ssh/id_rsa.pub
```

注意以下几点：
+ 映射提供了一个公共路径`/home/marymajor`，即两个逻辑路径的第一部分。然后可以将文件添加到`pics`和`doc`文件夹。
+ 与前面的示例一样，主目录是只读的。`/home/marymajor`

## 为 Amazon EFS 配置逻辑目录
<a name="logical-dir-efs"></a>

如果 Transfer Family 服务器使用 Amazon EFS，则必须先创建具有读写访问权限的用户主目录，然后用户才能在其逻辑主目录中工作。用户无法自己创建此目录，因为他们将缺乏 `mkdir` 对逻辑主目录的权限。

如果用户的主目录不存在，并且他们运行了 `ls` 命令，则系统会按如下方式做出响应：

```
sftp> ls
remote readdir ("/"): No such file or directory
```

对父目录具有管理访问权限的用户需要创建该用户的逻辑主目录。

## 自定义 AWS Lambda 响应
<a name="auth-lambda-response"></a>

您可以将逻辑目录与连接到自定义身份提供商的 Lambda 函数一起使用。为此，在 Lambda 函数中，将 `HomeDirectoryType` 指定为 **LOGICAL**，并为 `HomeDirectoryDetails` 参数添加 `Entry` 和 `Target` 值。例如：

```
HomeDirectoryType: "LOGICAL"
HomeDirectoryDetails: "[{\"Entry\": \"/\", \"Target\": \"/amzn-s3-demo-bucket/theRealFolder"}]"
```

以下代码是来自自定义 Lambda 身份验证调用的成功响应示例。

```
aws transfer test-identity-provider \
    --server-id s-1234567890abcdef0 \
    --user-name myuser
{
    "Url": "https://a1b2c3d4e5.execute-api.us-east-2.amazonaws.com/prod/servers/s-1234567890abcdef0/users/myuser/config", 
    "Message": "", 
    "Response": "{\"Role\": \"arn:aws:iam::123456789012:role/bob-usa-role\",
                  \"HomeDirectoryType\": \"LOGICAL\",
                  \"HomeDirectoryDetails\": \"[{\\\"Entry\\\":\\\"/myhome\\\",\\\"Target\\\":\\\"/amzn-s3-demo-bucket/theRealFolder\\\"}]\",
                  \"PublicKeys\": \"[ssh-rsa myrsapubkey]\"}", 
    "StatusCode": 200
}
```

**注意**  
仅当您使用 API Gateway 方法作为自定义身份提供商时，才会返回该 `"Url":` 行。

# 使用 Transfer Family 访问 FSx 适用于 NetApp ONTAP 的文件系统
<a name="fsx-s3-access-points"></a>



**Contents**
+ [概述](#fsx-overview)
+ [先决条件](#fsx-prerequisites)
  + [FSx 针对 NetApp ONTAP 的要求](#fsx-ontap-requirements)
  + [所需的 IAM 权限](#required-iam-permissions)
+ [Trans FSx fer Family 如何使用存储空间](#how-fsx-storage-works)
  + [文件系统用户身份](#file-system-user-identity)
+ [为创建 S3 接入点 FSx](#creating-s3-access-point)
  + [接入点命名](#access-point-naming)
  + [为 NetApp ONTAP 创建接入点 FSx](#creating-access-point-ontap)
  + [配置文件系统权限](#configuring-file-system-permissions)
+ [将 S3 接入点别名与 FSx](#using-s3-access-point-aliases)
  + [关于接入点别名](#about-access-point-aliases)
  + [查找您的接入点别名](#finding-access-point-alias)
+ [配置 Transfer Family 以进行 FSx 存储](#configuring-transfer-family-fsx)
  + [创建 IAM 角色](#creating-iam-role-fsx)
+ [管理用户以进行 FSx 存储](#managing-users-fsx)
  + [创建用户](#creating-user-fsx)
  + [配置多个目录映射](#multiple-directory-mappings)
+ [配置文件传输客户端](#configuring-file-transfer-clients)
  + [WinSCP 配置](#winscp-configuration)
  + [其他 SFTP 客户端](#other-sftp-clients)
+ [FSx 存储疑难解答](#troubleshooting-fsx-storage)
  + [文件操作问题](#file-operation-issues)

## 概述
<a name="fsx-overview"></a>

Transfer Family 通过 S3 接入点支持 Amaz FSx on for NetApp ONTAP。Amazon FSx f NetApp or ONTAP 是一项完全托管的服务，它基于广受欢迎的 ONTAP 文件系统提供高度可靠、可扩展、高性能和功能丰富的文件存储。 NetApp在使用 FSx 文件系统配置 Transfer Family 时，您的用户将使用标准文件传输客户端连接到 Transfer Family 端点。Transfer Family 通过连接到您的 FSx 卷的 S3 接入点路由文件操作，而您的数据则保留在 FSx 文件系统上。要了解有关 NetApp ONTAP FSx 的更多信息，请参阅 [ NetApp ONTAP FSx 的亚马逊是什么？](https://docs.aws.amazon.com/fsx/latest/ONTAPGuide/what-is-fsx-ontap.html)

此集成使您能够：
+ 使用 SFTP、FTPS 或 FTP 协议将文件传输到企业级文件存储
+ 通过多种协议（SFTP、NFS、SMB）访问相同的数据
+ 使用快照、备份和数据分层等 FSx 功能

**重要**  
在 Transfer Family 中使用 FSx 文件系统时，不支持某些文件操作，包括重命名和追加操作。对于上传操作，文件大小限制为 5 GB。有关限制的完整列表，请参阅[接入点兼容性](https://docs.aws.amazon.com/fsx/latest/ONTAPGuide/access-points-for-fsxn-object-api-support.html)。

## 先决条件
<a name="fsx-prerequisites"></a>

在使用亚马逊配置 Transfer Family 之前 FSx，您必须满足以下要求。

### FSx 针对 NetApp ONTAP 的要求
<a name="fsx-ontap-requirements"></a>

要使用带有 T FSx ransfer Family 的 NetApp ONTAP，您需要：
+  FSx 适用于运行 NetApp ONTAP 版本 9.17.1 或更高版本的 ONTAP 文件系统
+ 同一 AWS 区域中的文件系统和 S3 接入点
+ 同时拥有文件系统和接入点的同一个 AWS 帐户

要了解更多信息，请参阅[亚马逊 FSx NetApp ONTAP 版入门](https://docs.aws.amazon.com/fsx/latest/ONTAPGuide/getting-started.html)。

### 所需的 IAM 权限
<a name="required-iam-permissions"></a>

您可以为每个 S3 接入点配置不同的权限和网络控制，S3 适用于使用该接入点发出的任何请求。S3 接入点支持 IAM 资源策略，您可以使用这些策略按资源、用户或其他条件控制接入点的使用。要使应用程序或用户通过接入点访问文件，接入点和底层卷都必须允许该请求。有关更多信息，请参阅 [IAM 接入点策略](https://docs.aws.amazon.com/fsx/latest/ONTAPGuide/s3-ap-manage-access-fsxn.html)。

Amazon S3 接入点 FSx 使用双层授权模型，将 IAM 权限与文件系统级权限相结合。这种方法可确保在 AWS 服务级别和底层文件系统级别对数据访问请求进行适当授权。

要使应用程序或用户成功地通过接入点访问数据，S3 接入点策略和底层 FSx 卷都必须允许该请求。

要创建和配置此集成，您需要以下权限：
+ `fsx:CreateAndAttachS3AccessPoint`
+ `s3:CreateAccessPoint`
+ `s3:GetAccessPoint`
+ `s3:PutAccessPointPolicy`（如果创建可选的接入点策略）

## Trans FSx fer Family 如何使用存储空间
<a name="how-fsx-storage-works"></a>

在使用 FSx 文件系统配置 Transfer Family 时，以下组件协同工作以启用文件传输：

1. 用户使用 SFTP、FTPS 或 FTP 客户端连接到 Transfer Family 服务器。

1. Transfer Family 使用服务托管身份、自定义身份提供者或对用户进行身份验证。 AWS Directory Service for Microsoft Active Directory经过身份验证后，Transfer Family 将担任与该用户关联的 IAM 角色。

1. 对于每个文件操作，Transfer Family 都充当标准的 S3 API 客户端，使用用户假设的 IAM 角色向 S3 接入点发出请求，并根据 S3 接入点策略验证权限。

1.  FSx 文件系统验证与接入点关联的文件系统用户是否有权执行所请求的操作。然后对该 FSx 卷执行文件操作。

要使文件操作成功，两个授权层都必须允许该请求。

**注意**  
将 S3 接入点连接到 FSx 卷不会改变直接通过 NFS 或 SMB 访问该卷时的行为。现有文件协议访问权限继续保持不变。

### 文件系统用户身份
<a name="file-system-user-identity"></a>

每个接入点都使用您在创建接入点时指定的文件系统用户身份。此身份授权通过该接入点发出的所有文件访问请求。文件系统用户是底层 Amazon FSx 文件系统上的用户账户。如果文件系统用户具有只读访问权限，则只有使用访问点发出的读取请求才会获得授权，写入请求会被阻止。如果文件系统用户具有读写访问权限，则使用访问点对连接的卷发出的读取和写入请求都将获得授权。

## 为创建 S3 接入点 FSx
<a name="creating-s3-access-point"></a>

在配置 Transfer Family 之前，必须创建连接到 FSx 卷的 S3 接入点。S3 接入点被命名为连接到数据源（例如存储桶或 Amazon for ONTAP 卷） FSx 的网络终端节点。您可以使用亚马逊 FSx 控制台、CLI 或 AP AWS I 创建接入 NetApp 点并将其附加到 for ONTAP。 FSx 附加后，您可以使用 S3 对象 APIs 访问您的文件数据。您的数据将继续存储在 Amazon FSx 文件系统中，并且可以继续直接访问您的现有工作负载。您可以继续使用所有 FSx 适用于 NetApp ONTAP 的存储管理功能来管理存储，包括备份、快照、用户和组配额以及压缩。

有关更多信息，请参阅[创建接入点](https://docs.aws.amazon.com/fsx/latest/ONTAPGuide/create-access-points.html)。

### 接入点命名
<a name="access-point-naming"></a>

命名接入点时，请遵循以下准则：
+ 接入点名称在您的 AWS 账户和地区内必须是唯一的。
+ 名称不能以`-ext-s3alias`（为别名保留）结尾。
+ 避免在名称中包含敏感信息，因为这些信息是在 DNS 中发布的。

有关命名规则的完整列表，请参阅[接入点命名规则、限制和限制](https://docs.aws.amazon.com/fsx/latest/ONTAPGuide/access-point-for-fsxn-restrictions-limitations-naming-rules.html)。

### 为 NetApp ONTAP 创建接入点 FSx
<a name="creating-access-point-ontap"></a>

使用以下步骤为适用于 NetApp ONTAP 的卷创建 S3 接入点。 FSx 

**创建接入点（控制台）**

1. 打开 Amazon FSx 控制台，网址为[https://console.aws.amazon.com/fsx/](https://console.aws.amazon.com/fsx/)。

1. 在导航窗格中选择**文件系统**。

1.  FSx 为 NetApp ONTAP 文件系统选择你的。

1. 选择**卷**选项卡。

1. 选择要连接的音量。

1. 在 “**操作**” 中，选择 “**创建 S3 接入点**”。

1. 在**接入点名称**中，输入描述性名称（例如，`transfer-family-ap`）。

1. 对于**文件系统用户身份类型**，请选择以下选项之一：
   + **UNIX 身份**-适用于具有 UNIX 安全风格的卷
   + **Windows 身份**-适用于具有 NTFS 安全风格的卷

1. （可选）在**接入点策略**中，输入一个 IAM 策略，该策略定义了哪些 IAM 委托人可以对通过此接入点访问的对象执行哪些操作。有关更多信息，请参阅[管理接入点接入](https://docs.aws.amazon.com/fsx/latest/ONTAPGuide/s3-ap-manage-access-fsxn.html)。

1. 选择**创建**。

1. 创建后，记下接入点别名，以便在 Transfer Family 配置中使用。

**注意**  
代表连接的 SFTP/FTPS 用户 AWS Transfer Family 访问 S3 资源时，请求来自 AWS Transfer Family 基础架构，而不是来自您的 VPC。因此，配置有 VPC 网络源的 S3 接入点将拒绝这些请求。但是，即使您使用配置了互联网网络来源的接入点，Transfer Family 和接入点之间的所有流量仍保持私密性，并通过 AWS 主干网络传输，它不会通过公共互联网。

### 配置文件系统权限
<a name="configuring-file-system-permissions"></a>

您指定的文件系统用户决定了 Transfer Family 用户可以执行的操作。您必须在 FSx 卷上配置适当的权限。

**UNIX 示例：**

```
# Create a directory for Transfer Family users
mkdir -p /vol1/transfer-users

# Set ownership to match the access point user
chown 1001:1001 /vol1/transfer-users

# Set permissions
chmod 755 /vol1/transfer-users
```

**Windows 示例：**

```
# Create a directory for Transfer Family users
New-Item -Path "D:\vol1\transfer-users" -ItemType Directory

# Set permissions for the file system user associated with the access point
# Replace DOMAIN\TransferUser with your Windows user identity
icacls "D:\vol1\transfer-users" /grant "DOMAIN\TransferUser:(OI)(CI)M" /T

# Verify permissions
icacls "D:\vol1\transfer-users"
```

## 将 S3 接入点别名与 FSx
<a name="using-s3-access-point-aliases"></a>

在 Transfer Family 中使用 FSx 文件系统时，必须使用 S3 接入点别名。Transfer Family 不支持使用接入点 ARNs 或其他参考方法进行 FSx 存储。

**重要**  
AWS Transfer Family 仅在使用 FSx 文件系统时支持 S3 接入点别名。您不能使用接入点 ARNs 或 virtual-hosted-style URIs。

**重要**  
接入点必须与卷位于同一区域。

### 关于接入点别名
<a name="about-access-point-aliases"></a>

当您创建连接到 FSx 卷的 S3 接入点时，Amazon S3 会自动生成接入点别名。此别名是一个唯一标识符，您可以在任何使用 S3 存储桶名称的地方使用该标识符。

对于连接到 FSx 卷的接入点，别名使用以下格式：

```
access-point-name-metadata-ext-s3alias
```

**别名示例：**

```
my-fsx-ap-aqfqprnstn7aefdfbarligizwgyfouse1a-ext-s3alias
```

**注意**  
后`-ext-s3alias`缀是为 FSx 接入点别名保留的。您不能在接入点名称中使用此后缀。

### 查找您的接入点别名
<a name="finding-access-point-alias"></a>

您可以在创建接入点后找到接入点别名。

**查找接入点别名（控制台）**

1. 打开 Amazon FSx 控制台，网址为[https://console.aws.amazon.com/fsx/](https://console.aws.amazon.com/fsx/)。

1. 在导航窗格中选择**文件系统**。

1. 选择文件系统。

1. 选择 “**卷**” 选项卡，然后选择您为其创建接入点的卷。

1. 转到 **S3 接入点详细信息**列。

1. 别名显示在 “**别名**” 列中。

**查找接入点别名 (CLI)**

使用 `describe-s3-access-point-attachments` 命令。

```
aws fsx describe-s3-access-point-attachments \
    --filters Name=file-system-id,Values=fs-0123456789abcdef0
```

响应中包含别名：

```
{
    "S3AccessPointAttachments": [
        {
            "S3AccessPoint": {
                "ResourceARN": "arn:aws:s3:us-east-1:111122223333:accesspoint/my-fsx-ap",
                "Alias": "my-fsx-ap-aqfqprnstn7aefdfbarligizwgyfouse1a-ext-s3alias"
            }
        }
    ]
}
```

配置 Transfer Family 用户时，请在主目录映射中使用接入点别名。

**主目录格式：**

```
/access-point-alias/path/to/directory
```

**示例**：

```
/my-fsx-ap-aqfqprnstn7aefdfbarligizwgyfouse1a-ext-s3alias/users/jsmith
```

## 配置 Transfer Family 以进行 FSx 存储
<a name="configuring-transfer-family-fsx"></a>

创建 S3 接入点后，将 Transfer Family 服务器配置为使用该接入点。

### 创建 IAM 角色
<a name="creating-iam-role-fsx"></a>

您必须创建一个 IAM 角色来授予 Transfer Family 对 S3 接入点的访问权限。

**重要**  
IAM 策略要求使用接入点 ARN 格式，而不是别名。使用 IAM 策略资源声明`arn:aws:s3:region:account-id:accesspoint/access-point-name`中的格式。接入点别名（结尾为`-ext-s3alias`）仅用于主目录映射。

**创建 IAM 角色**

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

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

1. 在**可信实体类型**中选择 **AWS 服务**。

1. 对于 “**用例**”，选择 “**传输**”。

1. 选择**下一步**。

1. 选择**创建策略**并输入您的政策（参见下面的政策示例）。

1. 将策略附加到角色并选择**创建角色**。

**IAM 策略示例：**

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowFileOperations",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:DeleteObject",
                "s3:GetObjectTagging",
                "s3:PutObjectTagging"
            ],
            "Resource": "arn:aws:s3:us-east-2:111122223333:accesspoint/my-fsx-ap/object/*"
        },
        {
            "Sid": "AllowDirectoryOperations",
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:GetBucketLocation"
            ],
            "Resource": "arn:aws:s3:us-east-2:111122223333:accesspoint/my-fsx-ap"
        }
    ]
}
```

## 管理用户以进行 FSx 存储
<a name="managing-users-fsx"></a>

使用使用 S3 接入点别名的主目录映射创建 Transfer Family 用户。

### 创建用户
<a name="creating-user-fsx"></a>

创建 FSx 存储用户时，请在主目录映射中使用接入点别名。

**创建服务托管用户（控制台）**

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

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

1. 请选择您的服务器。

1. 在 “用户” 部分中，选择 “**添加用户**”。

1. 对于**用户名**，输入用户名。

1. 对于**角色**，选择您创建的 IAM 角色。

1. 对于 “**主目录**”，选择 “**受限**”。

1. 对于**主目录映射**，请使用接入点别名添加映射：

   ```
   [{"Entry": "/", "Target": "/my-fsx-ap-aqfqprnstn7aefdfbarligizwgyfouse1a-ext-s3alias/users/jsmith"}]
   ```

**创建用户 (CLI)**

使用 `create-user` 命令。用您的别名替换接入点别名。

```
aws transfer create-user \
    --server-id s-0123456789abcdef0 \
    --user-name jsmith \
    --role arn:aws:iam::111122223333:role/TransferFamilyFSxRole \
    --home-directory-type LOGICAL \
    --home-directory-mappings '[
        {
            "Entry": "/",
            "Target": "/my-fsx-ap-aqfqprnstn7aefdfbarligizwgyfouse1a-ext-s3alias/users/jsmith"
        }
    ]'
```

### 配置多个目录映射
<a name="multiple-directory-mappings"></a>

您可以将多个虚拟目录映射到 FSx 卷上的不同路径。

**示例：单独的上传和下载目录**

```
aws transfer create-user \
    --server-id s-0123456789abcdef0 \
    --user-name jsmith \
    --role arn:aws:iam::111122223333:role/TransferFamilyFSxRole \
    --home-directory-type LOGICAL \
    --home-directory-mappings '[
        {
            "Entry": "/inbox",
            "Target": "/my-fsx-ap-aqfqprnstn7aefdfbarligizwgyfouse1a-ext-s3alias/users/jsmith/inbox"
        },
        {
            "Entry": "/outbox",
            "Target": "/my-fsx-ap-aqfqprnstn7aefdfbarligizwgyfouse1a-ext-s3alias/users/jsmith/outbox"
        }
    ]'
```

## 配置文件传输客户端
<a name="configuring-file-transfer-clients"></a>

在 Transfer Family 中使用 FSx 文件系统时，必须将文件传输客户端配置为禁用不支持的功能。

### WinSCP 配置
<a name="winscp-configuration"></a>

WinSCP 默认使用临时重命名功能，S3 接入点不支持该功能。 FSx

**警告**  
如果您不在 WinSCP 中禁用临时重命名功能，文件上传将失败。

**在 WinSCP 中禁用临时重命名**

1. 打开 WinSCP。

1. 在 “登录” 对话框中，选择 **“编辑”** 以修改您的会话设置。

1. 选择 **Advanced**（高级）。

1. 在左侧导航栏的 “**传输**” 下，选择 “**耐力**”。

1. 对于 “**允许传输 resume/transfer 到临时文件名**”，选择 “**禁用**”。

1. 选择**确定**保存设置。

或者，您可以为现有会话禁用此设置：

1. 连接到你的 Transfer Family 服务器。

1. 选择**选项**，然后选择**首选项**。

1. 选择**传输**，然后选择**耐力**。

1. 对于 “**允许传输 resume/transfer 到临时文件名**”，选择 “**禁用**”。

1. 选择**确定**。

### 其他 SFTP 客户端
<a name="other-sftp-clients"></a>

对于其他 SFTP 客户端，请禁用以下功能（如果有）：
+ 上传临时文件（上传到临时文件，然后重命名）
+ 使用临时文件恢复传输
+ 使用重命名操作进行原子上传
+ 上传的追加模式

有关具体的配置步骤，请查阅您的客户端文档。

## FSx 存储疑难解答
<a name="troubleshooting-fsx-storage"></a>

本节介绍如何识别和解决在 FSx 文件系统中使用 Transfer Family 时的常见问题。

### 文件操作问题
<a name="file-operation-issues"></a>

**权限被拒绝**

如果您收到权限被拒绝的错误：

1. 验证 IAM 角色是否具有接入点别名的正确权限。您可以通过直接使用 S3 进行测试来做到这一点 APIs。

1. 检查接入点策略是否允许 IAM 角色。

1. 验证文件系统用户是否具有目标路径的权限。

1. 确认主目录映射使用正确的接入点别名。

**使用 WinSCP 上传失败**

如果使用 WinSCP 上传文件失败，请禁用临时重命名：

1. **在 WinSCP 中，选择选项，**然后选择首**选项。**

1. 选择**传输**，然后选择**耐力**。

1. 对于 “**允许传输 resume/transfer 到临时文件名**”，选择 “**禁用**”。

有关更多信息，请参阅 [配置文件传输客户端](#configuring-file-transfer-clients)。

**文件上传失败**

如果文件上传失败：

1. 验证文件大小是否低于 5 GB。

1. 检查该 FSx 卷是否有足够的可用存储空间。

1. 监控限制 CloudWatch 指标。