論理ディレクトリを使用して Transfer Family ディレクトリ構造を簡素化する - AWS Transfer Family

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

論理ディレクトリを使用して Transfer Family ディレクトリ構造を簡素化する

AWS Transfer Family サーバーディレクトリ構造を簡素化するために、論理ディレクトリを使用できます。論理ディレクトリを使用すると、ユーザーが Amazon S3 バケットまたは Amazon EFS ファイルシステムに接続するときにナビゲートしやすいユーザーフレンドリーな名前で仮想ディレクトリ構造を構築できます。論理ディレクトリを使用する場合、絶対ディレクトリパス、Amazon S3 バケット名、EFS ファイルシステム名をエンドユーザーに開示しないようにできます。

注記

エンドユーザーが実行を許可したオペレーションのみを実行できるように、セッションポリシーを使用する必要があります。

論理ディレクトリを使用して、エンドユーザー向けの使いやすい仮想ディレクトリを作成し、バケット名を抽象化する必要があります。論理ディレクトリマッピングでは、ユーザーは指定された論理パスとサブディレクトリにのみアクセスでき、論理ルートを通過する相対パスは禁止されます。

Transfer Family は、相対要素を含む可能性のあるすべてのパスを検証し、これらのパスを Amazon S3 に渡す前に、これらのパスの解決を積極的にブロックします。これにより、ユーザーは論理マッピングを超えて移動できなくなります。

Transfer Family は、エンドユーザーが論理ディレクトリの外部にあるディレクトリにアクセスできないようにしていますが、ストレージレベルで最小特権を適用するために、一意のロールまたはセッションポリシーを使用することをお勧めします。

論理ディレクトリを使用すると、chroot オペレーションと呼ばれるものを実行することで、ストレージ階層内の目的の場所にユーザーのルートディレクトリを設定できます。このモードでは、ユーザーが構成したホームディレクトリまたはルートディレクトリの外部にあるディレクトリには移動できません。

たとえば、Amazon S3 ユーザーはアクセス専用 /mybucket/home/${transfer:UserName} にスコープダウンされていますが、一部のクライアントでは、ユーザーがフォルダを /mybucket/home にトラバースアップできます。この場合、ユーザーは、Transfer Family サーバーからログアウトして再びログインした後でのみ、本来のホームディレクトリに戻ります。chroot オペレーションを実行すると、この状況が発生するのを防止できます。

バケットとプレフィックスで独自のディレクトリ構造を作成できます。この機能は、バケットプレフィクスを介してレプリケートできない特定のディレクトリ構造を想定したワークフローがある場合に便利です。また、Amazon S3 内の複数の非連続な場所にリンクすることもでき、これはディレクトリパスがファイルシステム内の別の場所を参照する Linux ファイルシステム内にシンボリックリンクを作成するのと似ています。

論理ディレクトリ FILE マッピング

HomeDirectoryMapEntry データ型に Typeパラメータが含まれるようになりました。このパラメータが存在する前に、ターゲットが ファイルである論理ディレクトリマッピングを作成していた可能性があります。以前にこれらの種類の論理ディレクトリマッピングのいずれかを作成したことがある場合は、 Typeを明示的に に設定する必要があります。設定しないとFILE、これらのマッピングは今後正しく機能しません。

これを行う 1 つの方法は、 UpdateUser API を呼び出し、既存のマッピングFILETypeを に設定することです。

論理ディレクトリを使用する際のルール

論理ディレクトリマッピングを構築する前に、以下のルールを理解する必要があります。

  • Entry"/" の場合、重複パスは許可されないので、設定できるマッピングは 1 つのみです。

  • 論理ディレクトリは、最大 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を正確に表示する必要がある場合は、Transfer Family サーバーのストレージオプションとして Amazon Elastic File System (Amazon EFS) を使用できます。

  • ユーザーの論理ディレクトリ値を指定する場合、使用する パラメータはユーザーのタイプによって異なります。

    • サービス管理型ユーザーの場合、論理ディレクトリの値を HomeDirectoryMappings に指定してください。

    • カスタム ID プロバイダーユーザーの場合は、 で論理ディレクトリ値を指定しますHomeDirectoryDetails

重要

Amazon S3 ディレクトリのパフォーマンスを最適化することを選択しない限り (サーバーを作成または更新するとき)、起動時にルートディレクトリが存在している必要があります。Amazon S3 の場合、ルートフォルダを作成するには、スラッシュ (/) で終わる 0 バイトのオブジェクトが既に作成されている必要があります。この問題を回避することは、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}"}]

前の例では、ユーザーはルートディレクトリにロックされ、階層の上位には移動できません。

仮想ディレクトリ構造

仮想ディレクトリ構造の場合、S3 バケットまたは EFS ファイルシステム内の任意の場所にあるターゲットと組み合わせて複数の Entry Target ペアを作成でき、ユーザーの IAM ロールマッピングがそれらにアクセスする権限を持つ限り、複数のバケットまたはファイルシステムにわたっても可能です。

次の仮想構造の例では、ユーザーが 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"}]

注記

ファイルは、マップした特定のフォルダにのみアップロードできます。つまり、前の例では、/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 に明示的にマップする必要があります。

ダウンロードして使用できる AWS CloudFormation テンプレートなど、論理ディレクトリとユーザーの設定の詳細については、 AWS ストレージブログの「chroot および論理ディレクトリを使用して AWS SFTP 構造を簡素化するchroot」を参照してください。

論理ディレクトリの構成例

この例では、ユーザーを作成し、2 つの論理ディレクトリを割り当てます。次のコマンドは、論理ディレクトリpicsdocを使用して新しいユーザー (既存のTTransfer Family ilyサーバー用) を作成します。

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 コマンドを実行すると、Mary は次の情報を表示します。

    drwxr--r-- 1 - - 0 Mar 17 15:42 doc drwxr--r-- 1 - - 0 Mar 17 16:04 pics
  • marymajorはこのレベルではファイルやディレクトリは作成できません。ただし、picsおよびdoc内には、サブディレクトリを追加できます。

  • Mary が picsと に追加するファイルはdoc/DOC-EXAMPLE-BUCKET2/test/mydocsそれぞれ Amazon S3 パス/DOC-EXAMPLE-BUCKET1/picsと に追加されます。

  • この例では、その可能性を説明するために 2 つの異なるバケットを指定しています。ただし、ユーザーに指定した複数またはすべての論理ディレクトリに同じバケットを使用できます。

Amazon EFS の論理ディレクトリを設定する

Transfer Family サーバーが Amazon EFS を使用している場合は、ユーザーが論理ホームディレクトリで作業するには、ユーザーのホームディレクトリを読み取りおよび書き込みアクセスで作成する必要があります。ユーザーは自分の論理ホームディレクトリに対する mkdir の権限がないため、このディレクトリを自分で作成することはできません。

ユーザーのホームディレクトリが存在せず、ユーザーが ls コマンドを実行すると、システムは次のように応答します。

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

親ディレクトリへの管理アクセス権を持つユーザーは、ユーザーの論理ホームディレクトリを作成する必要があります。

カスタム AWS Lambda レスポンス

論理ディレクトリは、カスタム ID プロバイダーに接続する 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 }
注記

"Url": の行は、カスタム ID プロバイダーとして API Gateway メソッドを使用している場合にのみ返されます。