使用逻辑目录简化 Transfer Family 目录结构 - Amazon Transfer Family
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

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

使用逻辑目录简化 Transfer Family 目录结构

为了简化你的Amazon Transfer Family服务器目录结构,你可以使用逻辑目录。使用逻辑目录,您可以使用用户友好的名称来构建虚拟目录结构,用户在连接到您的 Amazon S3 存储桶或 Amazon EFS 文件系统时可以浏览这些名称。使用逻辑目录时,可以避免向最终用户泄露绝对目录路径、Amazon S3 存储桶名称和 EFS 文件系统名称。

您可以使用逻辑目录将用户的根目录设置到存储层次结构中的所需位置,方法是执行所谓的chroot操作。在此模式下,用户无法导航到您为其配置的主目录或根目录之外的目录。

例如,尽管 Amazon S3 用户的范围已缩小为只能访问/mybucket/home/${transfer:UserName},有些客户端允许用户向上遍历文件夹/mybucket/home. 在这种情况下,只有在注销并重新登录 Transfer Family 服务器后,用户才会回到预定的主目录。执行一段chroot操作可以防止这种情况发生。

您可以创建跨存储段和前缀创建自己的目录结构。如果您的工作流程需要特定的目录结构,而您无法通过存储桶前缀进行复制,则此功能非常有用。您也可以链接到 Amazon S3 中的多个非连续位置,类似于在 Linux 文件系统中创建符号链接,其中的目录路径引用文件系统中的不同位置。

使用逻辑目录的规则

在您创建逻辑目录映射之前,应了解以下规则:

  • Entry"/",只能有一个映射,因为不允许重叠路径。

  • 目标可以使用${transfer:UserName}如果已根据用户名对存储桶或文件系统路径进行了参数化,则变量。

  • 目标可以是不同存储桶或文件系统中的路径,但必须确保映射的 IAM 角色(Role响应中的参数)提供对这些存储桶或文件系统的访问权限。

  • 请勿指定此段HomeDirectory参数,因为这个值是隐含的Entry Target使用时配对LOGICAL字段HomeDirectoryType参数。

  • 目标应以斜杠 (/) 字符开头,但在指定Target. 例如,/DOC-EXAMPLE-BUCKET/images是可以接受的,而DOC-EXAMPLE-BUCKET/images/DOC-EXAMPLE-BUCKET/images/不是。

重要

启动时根目录必须存在。对于 Amazon S3,这意味着您必须已经创建了一个以结尾的空字节对象/创建根文件夹。

实现逻辑目录和 chroot

使用逻辑目录和chroot功能,您必须执行以下操作:

为每个用户打开逻辑目录。通过设置来执行此操作HomeDirectoryType参数为LOGICAL您创建或更新用户时。

"HomeDirectoryType": "LOGICAL"

Chroot

对于chroot,创建一个由单个目录构成的目录结构EntryTarget为每个用户配对。根文件夹是Entry点,还有Target是存储桶或文件系统中要映射到的位置。

Example for Amazon S3
[{"Entry": "/", "Target": "/mybucket/jane"}]
Example for Amazon EFS
[{"Entry": "/", "Target": "/fs-faa1a123/jane"}]

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

[{"Entry": "/", "Target": "/mybucket/${transfer:UserName}"}]

在前面的示例中,用户被锁定在其根目录中,无法在层次结构中向上遍历。

虚拟目录结构

对于虚拟目录结构,可以创建多个Entry Target配对,目标位于 S3 存储区或 EFS 文件系统中的任何位置,包括多个存储区或文件系统,前提是用户的 IAM 角色映射有权访问它们。

在以下虚拟结构示例中,当用户登录到AmazonSFTP,它们位于根目录中,子目录为/pics,/doc,/reporting,以及/anotherpath/subpath/financials.

[ {"Entry": "/pics", "Target": "/bucket1/pics"}, {"Entry": "/doc", "Target": "/bucket1/anotherpath/docs"}, {"Entry": "/reporting", "Target": "/reportingbucket/Q1"}, {"Entry": "/anotherpath/subpath/financials", "Target": "/reportingbucket/financials"}]

注意

您只可以将文件上传到您映射的特定文件夹。这意味着在前面的示例中,您无法上传到/anotherpath要么anotherpath/subpath目录;仅限anotherpath/subpath/financials. 您也不能直接映射到这些路径,因为不允许重叠路径。

例如,假设您创建以下映射:

{ "Entry": "/pics", "Target": "/mybucket/pics" }, { "Entry": "/doc", "Target": "/mybucket/mydocs" }, { "Entry": "/temp", "Target": "/mybucket" }

您只可以将文件上传到这些存储段。当你第一次通过连接时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为您的用户提供,包括Amazon CloudFormation您可以下载和使用的模板,请参阅简化您的Amazon包含 chroot 和逻辑目录的 SFTP 结构在Amazon存储博客。

CustomAmazon Lambda反应

您可以将逻辑目录与连接到您的自定义身份提供商的 Lambda 函数配合使用。为此,请在您的 Lambda 函数中指定HomeDirectoryType如同LOGICAL,然后添加EntryTarget字段HomeDirectoryDetails参数。例如:

HomDirectoryType: "LOGICAL" HomeDirectoryDetails: "[{\"Entry\": \"/\", \"Target\": \"/DOC-EXAMPLE-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\\\":\\\"/DOC-EXAMPLE-BUCKET/theRealFolder\\\"}]\",\"PublicKeys\": \"[ssh-rsa myrsapubkey]\"}", "StatusCode": 200 }
注意

这些区域有:"Url":仅当您使用 API Gateway 方法作为自定义身份提供商时,才会返回行。