使用邏輯目錄來簡化 Transfer Family 目錄結構 - AWS Transfer Family

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

使用邏輯目錄來簡化 Transfer Family 目錄結構

若要簡化 AWS Transfer Family 伺服器目錄結構,您可以使用邏輯目錄。使用邏輯目錄,您可以建構虛擬目錄結構,該結構使用使用者易用的名稱,當使用者連線到您的 Amazon S3 儲存貯體或 Amazon EFS 檔案系統時,即可瀏覽這些名稱。使用邏輯目錄時,您可以避免向最終使用者揭露絕對目錄路徑、Amazon S3 儲存貯體名稱和EFS檔案系統名稱。

注意

雖然這取決於您使用的工作階段政策和其他內部要求,但您通常不需要工作階段政策和邏輯目錄,以確保使用者僅存取您打算存取的檔案。如果您正在設定邏輯目錄,則請勿建立工作階段政策,因為同時擁有兩者可能會導致許可遭拒的錯誤。

您可以使用邏輯目錄,透過執行所謂chroot的操作,將使用者的根目錄設定為儲存階層中所需的位置。在此模式中,使用者無法導覽至您為其設定的主目錄或根目錄以外的目錄。

例如,雖然 Amazon S3 使用者的範圍已縮減為僅存取 /mybucket/home/${transfer:UserName},但有些用戶端允許使用者將資料夾向上移動至 /mybucket/home。在此情況下,使用者只有在登出並再次登入 Transfer Family 伺服器後,才會回到其預期的主目錄。執行chroot操作可以防止發生這種情況。

您可以在儲存貯體和字首之間建立自己的目錄結構。如果您有工作流程預期無法複寫到儲存貯體字首的特定目錄結構,此功能非常有用。您也可以連結至 Amazon S3 中的多個非連續位置,類似於在 Linux 檔案系統中建立符號連結,其中目錄路徑參考檔案系統中的不同位置。

邏輯目錄FILE映射

HomeDirectoryMapEntry 資料類型現在包含 Type 參數。在此參數存在之前,您可以建立邏輯目錄映射,其中目標為 檔案。如果您先前已建立任何類型的邏輯目錄映射,則必須明確Type地將 設定為 FILE,否則這些映射將無法正常運作。

其中一個方法是呼叫 UpdateUser API,並將 Type 設定為 FILE 以進行現有映射。

使用邏輯目錄的規則

在建置邏輯目錄映射之前,您應該了解下列規則:

  • Entry為 時"/",您只能有一個映射,因為不允許重疊路徑。

  • 邏輯目錄支援高達 2.1 MB 的映射 (對於服務受管使用者,此限制為 2,000 個項目)。也就是說,包含映射的資料結構大小上限為 2.1 MB。如果您有許多映射,您可以計算映射的大小,如下所示:

    1. 以 格式 寫下典型的映射{"Entry":"/entry-path","Target":"/target-path"},其中 entry-pathtarget-path是您將使用的實際值。

    2. 計算該字串中的字元,然後新增一個 (1)。

    3. 將該數字乘以您擁有的伺服器對應數量。

    如果您在步驟 3 中估計的數字小於 2.1 MB,則您的映射在可接受的限制內。

  • 如果儲存貯體或檔案系統路徑已根據使用者名稱進行參數化,則目標可以使用 ${transfer:UserName}變數。

  • 目標可以是不同儲存貯體或檔案系統中的路徑,但您必須確保映射的 AWS Identity and Access Management (IAM) 角色 (回應中的 Role 參數) 能夠存取這些儲存貯體或檔案系統。

  • 請勿指定 HomeDirectory 參數,因為當您使用 HomeDirectoryType 參數的值時,EntryTarget這些組會隱含此LOGICAL值。

  • 目標必須以正斜線 (/) 字元開頭,但在指定 時請勿使用正斜線 (/Target。例如, /DOC-EXAMPLE-BUCKET/images 是可接受的,但 DOC-EXAMPLE-BUCKET/images/DOC-EXAMPLE-BUCKET/images/ 是不可接受的。

  • Amazon S3 是物件存放區,這表示資料夾是虛擬概念,沒有實際的目錄階層。如果您的應用程式從用戶端發出stat操作,則當您使用 Amazon S3 進行儲存時,所有內容都會分類為檔案。此行為會在使用 Amazon Simple Storage Service 使用者指南 中的資料夾整理 Amazon S3 主控台中的物件中加以說明。 如果您的應用程式需要 stat準確顯示某物件是否為檔案或資料夾,您可以使用 Amazon Elastic File System (AmazonEFS) 作為 Transfer Family 伺服器的儲存選項。

  • 如果您要為使用者指定邏輯目錄值,則使用的參數取決於使用者類型:

    • 對於服務受管使用者,請在 中提供邏輯目錄值HomeDirectoryMappings

    • 對於自訂身分提供者使用者,請在 中提供邏輯目錄值HomeDirectoryDetails

重要

除非您選擇最佳化 Amazon S3 目錄的效能 (建立或更新伺服器時),否則根目錄必須在啟動時存在。對於 Amazon S3,這表示您必須已建立以正斜線 (/) 結尾的零位元組物件,才能建立根資料夾。避免此問題是考慮最佳化 Amazon S3 效能的原因。

實作邏輯目錄和 chroot

若要使用邏輯目錄和chroot功能,您必須執行下列動作:

開啟每個使用者的邏輯目錄。建立或更新使用者LOGICAL時,請將 HomeDirectoryType 參數設定為 ,藉此執行此操作。

"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}"}]

在上述範例中,使用者會鎖定到其根目錄,並且無法在階層中向上移動。

虛擬目錄結構

對於虛擬目錄結構,只要使用者IAM的角色映射具有存取目標的許可,您就可以使用 S3 儲存貯體或EFS檔案系統中任何位置的目標建立多個EntryTarget配對,包括跨多個儲存貯體或檔案系統。

在下列虛擬結構範例中,當使用者登入 時 AWS SFTP,他們位於具有 /pics、、 /doc/reporting和 子目錄的根目錄中/anotherpath/subpath/financials

注意

除非您選擇最佳化 Amazon S3 目錄的效能 (當您建立或更新伺服器時),否則使用者或管理員需要建立不存在的目錄。避免此問題是考慮最佳化 Amazon S3 效能的原因。

對於 Amazon EFS,您仍然需要管理員來建立邏輯映射或/目錄。

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

注意

您只能將檔案上傳到您映射的特定資料夾。這表示在上一個範例中,您無法上傳到 /anotherpathanotherpath/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為使用者設定邏輯目錄和 的詳細資訊,包括您可以下載和使用的 AWS CloudFormation 範本,請參閱 AWS 儲存部落格中的使用 chroot 和邏輯目錄簡化您的 AWS SFTP結構

設定邏輯目錄範例

在此範例中,我們會建立使用者並指派兩個邏輯目錄。下列命令會使用邏輯目錄 pics和 建立新的使用者 (適用於現有的 Transfer Family 伺服器)doc

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/DOC-EXAMPLE-BUCKET2/test/mydocs分別新增至 Amazon S3 路徑/DOC-EXAMPLE-BUCKET1/pics和 。

  • 在此範例中,我們會指定兩個不同的儲存貯體來說明該可能性。不過,您可以將相同的儲存貯體用於您為使用者指定的多個或所有邏輯目錄。

設定 Amazon 的邏輯目錄 EFS

如果您的 Transfer Family 伺服器使用 Amazon EFS,則必須使用讀取和寫入存取權來建立使用者的主目錄,使用者才能在其邏輯主目錄中工作。使用者無法自行建立此目錄,因為他們在邏輯主目錄mkdir上缺少 的許可。

如果使用者的主目錄不存在,而且他們執行ls命令,系統會回應如下:

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

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

自訂 AWS Lambda 回應

您可以使用邏輯目錄搭配連線至自訂身分提供者的 Lambda 函數。若要這麼做,請在 Lambda 函數中指定 HomeDirectoryTypeLOGICAL,並新增 HomeDirectoryDetails 參數的 EntryTarget值。例如:

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 }
注意

只有在您使用 API Gateway 方法作為自訂身分提供者時,才會傳回此"Url":行。