AWS Transfer FamilyをFTPで利用して、ホームディレクトリを論理ディレクトリとして実装する

こんにちは、ASKULのユウです。
FTPでログインしたユーザに対して、ホームディレクトリを論理ディレクトリとしてルートディレクトリに設定したい場面があると思います。
今回は、AWSのサービスであるTransfer FamilyをFTPで利用している際に、同様の対応をおこなったため記載しておきます。
調べてもAWSのこの記事しか存在していなかったため、対応方法を記事にしておきます。

AWS Transfer Familyとは

AWSの各種ストレージに対してAWS CLIを利用せずに、SFTP or FTPS or FTPでデータのやり取りを可能にするサービスです。
これにより、AWS CLIが利用できないようなシステムから、S3やEFSに対してデータ転送をすることが可能になります。
もともとS3に対して各種プロトコルでデータ転送が可能になっていましたが、EFSも2021年1月に対応されました。
また、当初はSFTPプロトコルのみ対応していてTransfer for SFTPという名前のサービスでした。

前知識

Transfer FamilyをFTPで利用する場合、ユーザ認証にTransfer Familyで提供されているIDプロバイダを使用できません。
そのため、ユーザを認証するカスタムIDプロバイダを自身で作成する必要があります。
カスタムIDプロバイダ自体はテンプレートでAWSから提供されているので、テンプレートを利用すれば簡単に実装できます。
しかし、テンプレートにはユーザのホームディレクトリを論理ディレクトリとしてルートディレクトリにするような記載はないため、自身でカスタマイズする必要があります。

対応方法

前提

  • bucket:askul-transfer-test
  • ホームディレクトリ:/askul-transfer-test/ftp

やりたいこと

  • cd /をした際に、s3のbucket一覧に移動してしまうが、cd /してもカレントディレクトリをホームディレクトリのままとしたい。
  • 接続ユーザにs3 bucket名のaskul-transfer-testは意識させない。

対応

カスタムIDプロバイダ自体は、AWSからテンプレートが提供されています。
テンプレート上のFTPユーザ情報をレスポンスする箇所を変更します。

before

  response = {
    Role: '${UserRoleArn}', // The user will be authenticated if and only if the Role field is not blank
    Policy: '', // Optional JSON blob to further restrict this user's permissions
    HomeDirectory: '${UserHomeDirectory}' // Not required, defaults to '/'
  };
ftp> pwd
257 "/askul-transfer-test/ftp" is current directory.
ftp> ls
227 Entering Passive Mode
150 File status okay; about to open data connection.
-rw-------   1 - -            5 Jan 27 07:17 test.txt
226 Closing data connection.
ftp> cd /
250 Directory changed to /
ftp> pwd
257 "/" is current directory.
ftp> ls
227 Entering Passive Mode 
150 File status okay; about to open data connection.
drwx------   3 - -            0 Jan  1  1970 askul-transfer-test
226 Closing data connection.
ftp>

after

HomeDirectory:の部分を次のように修正します。

  response = {
    Role: '${UserRoleArn}', // The user will be authenticated if and only if the Role field is not blank
    Policy: '', // Optional JSON blob to further restrict this user's permissions
    HomeDirectoryType: "LOGICAL",
    HomeDirectoryDetails: JSON.stringify([
      {
        Entry: "/",
        Target: '${UserHomeDirectory}'
      }
    ])
  };
ftp> pwd
257 "/" is current directory.
ftp> ls
227 Entering Passive Mode
150 File status okay; about to open data connection.
-rw-------   1 - -            5 Jan 27 07:17 test.txt
226 Closing data connection.
ftp> cd /
250 Directory changed to /
ftp> pwd
257 "/" is current directory.
ftp> ls
227 Entering Passive Mode
150 File status okay; about to open data connection.
-rw-------   1 - -            5 Jan 27 07:17 test.txt
226 Closing data connection.
ftp>

これで期待どおりの動きになりました。

最後に

SFTPが利用できるのなら、FTPではなくSFTPの方がよいです。
SFTP利用の場合はカスタムIDプロバイダを使用する必要がないため、設定項目だけで設定できます。
しかし、さまざまな理由により、FTPを利用せざるを得ない状況がまだまだあると思います。
そういった場合にこの記事が役に立つとよいです。
ただ、なるべくSFTPを利用するようにしていった方が、構築コスト的、セキュリティ的にもよいと思います。
それでは。

ASKUL Engineering BLOG

2020 © ASKUL Corporation. All rights reserved.