こんにちは、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を利用するようにしていった方が、構築コスト的、セキュリティ的にもよいと思います。
それでは。