

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

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

逻辑目录简化了您的 Amazon 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.amazonaws.cn/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)。

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

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

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

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

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

## 自定义 Amazon 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":` 行。