本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用逻辑目录简化您的 Transfer Family 目录结构
要简化 Amazon Transfer Family 服务器目录结构,可以使用逻辑目录。使用逻辑目录,您可以使用用户在连接您的 Amazon S3 存储桶或 Amazon EFS 文件系统时浏览的用户名称来构建虚拟目录结构。使用逻辑目录时,可以避免向最终用户泄露绝对目录路径、Amazon S3 存储桶名称和EFS文件系统名称。
注意
尽管这取决于您对会话策略的使用和其他内部要求,但通常不需要同时使用会话策略和逻辑目录来确保您的用户只能访问您想要访问的文件。如果要设置逻辑目录,则不要同时创建会话策略,因为两者兼而有之可能会导致权限被拒绝的错误。
通过执行所谓的 chroot 操作,您可以使用逻辑目录将用户的根目录设置为存储层次结构中的所需位置。在此模式下,用户无法导航到您为其配置的主目录或根目录之外的目录。
例如,尽管 Amazon S3 用户的范围已缩小为仅限访问 /
,但有些客户端允许用户向上遍历文件夹至 mybucket
/home
/${transfer:UserName
}/
。在这种情况下,用户只有在注销并再次登录 Transfer Family 服务器后才会重新进入其预期的主目录。执行 chroot 操作可以防止这种情况的发生。mybucket
/home
您可以跨存储桶和前缀创建自己的目录结构。如果您的工作流程需要一个无法通过存储桶前缀复制的特定目录结构,则此功能适用。您还可以链接到 Amazon S3 中的多个非连续位置,类似于在 Linux 文件系统中创建符号链接,其中您的目录路径引用文件系统中的不同位置。
逻辑目录FILE映射
HomeDirectoryMapEntry
数据类型现在包括一个Type
参数。在此参数存在之前,您可能已经创建了以文件为目标的逻辑目录映射。如果您之前创建过任何此类逻辑目录映射,则必须将显式设置Type
为FILE
,否则这些映射将无法正常运行。
实现此目的的一种方法是调用 UpdateUser
API,并将现有映射FILE
的Type
设置为。
使用逻辑目录的规则
在构建逻辑目录映射之前,应了解以下规则:
-
如果
Entry
是"/"
,则只能有一个映射,因为不允许重叠路径。 -
逻辑目录支持最大 2.1 MB 的映射(对于服务管理用户,此限制为 2,000 个条目)。也就是说,包含映射的数据结构的最大大小为 2.1 MB。如果您有很多映射,则可以按如下方式计算映射的大小:
-
用格式写出一个典型的映射
{"Entry":"/
,其中entry-path
","Target":"/target-path
"}
和entry-path
是你将要使用的实际值。target-path
-
计算该字符串中的字符,然后添加一 (1)。
-
将该数字乘以服务器的近似映射数。
如果您在步骤 3 中估计的数字小于 2.1 MB,则您的映射在可接受的限制范围内。
-
-
如果存储桶或文件系统路径已根据用户名参数化,则目标可以使用该
${transfer:UserName}
变量。 -
目标可以是不同存储桶或文件系统中的路径,但您必须确保 mapped Amazon Identity and Access Management (IAM) 角色(响应中的
Role
参数)提供对这些存储桶或文件系统的访问权限。 -
不要指定
HomeDirectory
参数,因为当你使用HomeDirectoryType
参数的值时,Entry
Target
成对会暗示这个LOGICAL
值。 -
目标必须以正斜杠 (
/
) 字符开头,但在指定时不要使用尾部的正斜杠 (/
)。Target
例如,/
可以接受DOC-EXAMPLE-BUCKET
/images
,但不DOC-EXAMPLE-BUCKET
/images/
是。DOC-EXAMPLE-BUCKET
/images/ -
Amazon S3 是一个对象存储,这意味着文件夹是一个虚拟概念,没有实际的目录层次结构。如果您的应用程序从客户端发出
stat
操作,则当您使用 Amazon S3 进行存储时,所有内容都将归类为文件。《亚马逊简单存储服务用户指南》中的使用文件夹在 Amazon S3 控制台中组织对象中描述了此行为。如果您的应用程序要求stat
准确显示某件事是文件还是文件夹,则可以使用 Amazon Elastic File System(亚马逊EFS)作为 Transfer Family 服务器的存储选项。 -
如果您为用户指定逻辑目录值,则使用的参数取决于用户的类型:
-
对于服务托管的用户,请在
HomeDirectoryMappings
中提供逻辑目录值。 -
对于自定义身份提供商用户,请在中提供逻辑目录值
HomeDirectoryDetails
。
-
重要
除非您选择优化 Amazon S3 目录的性能(创建或更新服务器时),否则根目录必须在启动时存在。对于 Amazon S3,这意味着您必须已经创建了一个以正斜杠 (/
) 结尾的零字节对象才能创建根文件夹。避免这个问题是考虑优化 Amazon S3 性能的理由。
实现逻辑目录和 chroot
要使用逻辑目录和 chroot 功能,您必须执行以下操作:
为每个用户开启逻辑目录。为此,请在创建或更新用户时将 HomeDirectoryType
参数设置为 LOGICAL
。
"HomeDirectoryType": "LOGICAL"
chroot
对于 chroot,创建一个由每个用户的单个 Entry
和 Target
配对组成的目录结构。根文件夹是 Entry
重点,Target
是存储桶或文件系统中要映射到的位置。
您可以像前面的示例一样使用绝对路径,也可以使用 ${transfer:UserName}
动态替换用户名,如下例所示。
[{"Entry": "/", "Target": "/mybucket/${transfer:UserName}"}]
在前面的示例中,用户被锁定到其根目录,且无法在层次结构中向上移动。
虚拟目录结构
对于虚拟目录结构,您可以创建多个Entry
Target
配对,目标位于您的 S3 存储桶或EFS文件系统中的任何位置,包括跨多个存储桶或文件系统,前提是用户的IAM角色映射有权访问它们。
在以下虚拟结构示例中,当用户登录时 Amazon SFTP,他们位于根目录中,子目录为/pics
、/doc
/reporting
、和/anotherpath/subpath/financials
。
注意
除非您选择优化 Amazon S3 目录的性能(当您创建或更新服务器时),否则如果目录尚不存在,则用户或管理员需要创建这些目录。避免这个问题是考虑优化 Amazon S3 性能的理由。
对于 AmazonEFS,您仍然需要管理员来创建逻辑映射或/
目录。
[ {"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 和逻辑目录简化 Amazon SFTP结构
配置逻辑目录示例
在此示例中,我们创建一个用户并分配两个逻辑目录。以下命令使用逻辑目录 pics
和 doc
创建新用户(适用于现有的 Transfer Family 服务器)。
aws transfer create-user --user-name marymajor-logical --server-id s-11112222333344445 --role arn:aws:iam::1234abcd5678:role/marymajor-role --home-directory-type LOGICAL \ --home-directory-mappings "[{\"Entry\":\"/pics\", \"Target\":\"/
DOC-EXAMPLE-BUCKET1
/pics\"}, {\"Entry\":\"/doc\", \"Target\":\"/DOC-EXAMPLE-BUCKET2
/test/mydocs\"}]" \ --ssh-public-key-body file://~/.ssh/id_rsa.pub
如果 marymajor
是现有用户并且她的主目录类型是 PATH
,则您可以使用与前一个命令类似的命令将其更改为 LOGICAL
。
aws transfer update-user --user-name marymajor-logical \ --server-id s-11112222333344445 --role arn:aws:iam::1234abcd5678:role/marymajor-role \ --home-directory-type LOGICAL --home-directory-mappings "[{\"Entry\":\"/pics\", \"Target\":\"/
DOC-EXAMPLE-BUCKET1
/pics\"}, \ {\"Entry\":\"/doc\", \"Target\":\"/DOC-EXAMPLE-BUCKET2
/test/mydocs\"}]"
请注意以下几点:
-
如果目录
/
和DOC-EXAMPLE-BUCKET1
/pics/
尚未存在,则用户(或管理员)需要创建这些目录。DOC-EXAMPLE-BUCKET2
/test/mydocs -
当
marymajor
连接到服务器并运行ls -l
命令时,她会看到以下内容:drwxr--r-- 1 - - 0 Mar 17 15:42 doc drwxr--r-- 1 - - 0 Mar 17 16:04 pics
-
marymajor
无法在此级别创建任何文件或目录。但是,在pics
和doc
中,她可以添加子目录。 -
她添加到
pics
和doc
的文件分别添加到 AmazonS3 路径/
和DOC-EXAMPLE-BUCKET1
/pics/
。DOC-EXAMPLE-BUCKET2
/test/mydocs -
在此示例中,我们指定两个不同的存储桶来说明这种可能性。但是,您可以将同一个存储桶用于为用户指定的多个或所有逻辑目录。
为 Amazon 配置逻辑目录 EFS
如果您的 Transfer Family 服务器使用 AmazonEFS,则必须先创建具有读写权限的用户主目录,然后用户才能在其逻辑主目录中工作。用户无法自己创建此目录,因为他们将缺乏 mkdir
对逻辑主目录的权限。
如果用户的主目录不存在,并且他们运行了 ls
命令,则系统会按如下方式做出响应:
sftp> ls remote readdir ("/"): No such file or directory
对父目录具有管理访问权限的用户需要创建该用户的逻辑主目录。
自定义 Amazon Lambda 响应
您可以将逻辑目录与连接到自定义身份提供商的 Lambda 函数一起使用。为此,在 Lambda 函数中,将 HomeDirectoryType
指定为 LOGICAL
,并为 HomeDirectoryDetails
参数添加 Entry
和 Target
值。例如:
HomeDirectoryType: "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 }
注意
仅当您使用 Gate API way 方法作为自定义身份提供商时,才会返回该"Url":
行。