

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用邏輯目錄來簡化 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}`。如果沒有**色彩**，有些用戶端可能會允許使用者移至 /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}`變數。
+ 目標可以設定為指向不同的 Amazon S3 儲存貯體或檔案系統，只要相關聯的 IAM 角色具有存取這些儲存位置的必要許可。
+ 所有目標必須以正斜線 (`/`) 開頭，但不能以正斜線結尾。例如， `/amzn-s3-demo-bucket/images` 是正確的，而 `amzn-s3-demo-bucket/images `和 `/amzn-s3-demo-bucket/images/` 不是正確的。

### 儲存考量
<a name="storage-considerations"></a>
+ Amazon S3 是物件存放區，其中資料夾僅以虛擬概念存在。使用 Amazon S3 儲存體時，Transfer Family 會在 STAT 操作中將字首報告為目錄，即使沒有結尾斜線的零位元組物件。在 STAT 操作中，具有結尾斜線的適當零位元組物件也會報告為目錄。此行為在 [Amazon Simple Storage Service 使用者指南中的使用資料夾在 Amazon S3 主控台中組織物件](https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-folders.html)中描述。 **
+ 對於需要區分檔案和資料夾的應用程式，請使用 Amazon Elastic File System (Amazon EFS) 作為 Transfer Family 儲存選項。
+ 如果您要為使用者指定邏輯目錄值，您使用的 參數取決於使用者的類型：
  + 對於服務受管使用者，請在 中提供邏輯目錄值`HomeDirectoryMappings`。
  + 對於自訂身分提供者使用者，請在 中提供邏輯目錄值`HomeDirectoryDetails`。

### 使用者目錄值
<a name="user-dir-values"></a>
+ 指定邏輯目錄值的 參數取決於您的使用者類型：
  + 對於服務受管使用者，請在 中提供邏輯目錄值`HomeDirectoryMappings`。
  + 對於自訂身分提供者使用者，請在 中提供邏輯目錄值`HomeDirectoryDetails`。
+ 使用 LOGICAL HomeDirectoryType 時，您可以為回應中提供 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
```

具有父目錄管理存取權的使用者需要建立使用者的邏輯主目錄。

## 自訂 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":`行。