AWS Transfer for SFTP でパスワード認証と論理ディレクトリをやってみた
こんにちは、望月です。
AWS Transfer for SFTP (AWS SFTP) をユーザーに提供したいと思った場合、SSH キーでの認証というのは敷居が高く感じるかと思います。
ID プロバイダーが Service managed では SSH キーでの認証のみ対応となりますが、カスタム ID プロバイダーを利用するとパスワード認証を使うことができるため、試してみました。
今回は下記ブログを参考にカスタム ID プロバイダーに Secrets Manager を使用してみます。
やってみた
CloudFormation テンプレートの実行
- ブログ内にある CloudFormation テンプレートを使用し、API Gateway および Lambda を作成します。
- パラメータの CreateServer を true にすることで AWS SFTP サーバーも同時に作成されます。今回はこちらを true にし、AWS SFTP サーバーも一緒に作成します。
- テンプレートの S3 URL
- https://s3.amazonaws.com/aws-transfer-resources/custom-idp-templates/aws-transfer-custom-idp-secrets-manager-apig.template.yml
- スタックの名前
- <任意>
- パラメータ
- CreateServer
- true
- AWS SFTP サーバーも一緒に作成します
- SecretsManagerRegion
- デフォルトでは CloudFormation が実行されたリージョンになります。違うリージョンに Secrets Manager がある場合はそちらのリージョンを指定します。
- あとは特に変更せず、[次へ] を選択し、スタックを実行します。
- スタックの完了後、ステータスが CREATE_COMPLETE になったことを確認します。
Sercrets Manager でシークレットを設定
- Sercrets Manager で AWS SFTP ユーザーが使用する設定をします。
- 新しいシークレットを作成し、値に使用するパスワード、IAM Role 、ユーザーのホームディレクトリを設定します。
- シークレットの値
- Password
- <任意のパスワード>
- Role
- arn:aws:iam::xxxxxxxxxxxxx:role/sftp-role
- sftp-role については管理ポリシー AmazonS3FullAccess を割り当てています。
- HomeDirectory
- /cm-mochizuki-yuta-private/user-a/
- cm-mochizuki-yuta-private S3バケット及び user-a ディレクトリについては作成済みになります
- シークレットの名前で、AWS SFTP で使用するユーザー名を設定します。SFTP/ は Lambda 側で判別に利用しているため、変更しないようにしてください。
- シークレットの名前
- SFTP/user-a
- user-a が AWS SFTP で使用するユーザー名になります
AWS SFTP サーバーへの接続
- 作成された AWS SFTP サーバーのエンドポイントを確認し、パスワード認証でログインを試してみます。
- user-a ディレクトリには user-a.txt を事前に配置しています。
$ sftp user-a@s-xxxxxxxxxxxxxxxxx.server.transfer.ap-northeast-1.amazonaws.com user-a@s-xxxxxxxxxxxxxxxxx.server.transfer.ap-northeast-1.amazonaws.com's password: Connected to user-a@s-xxxxxxxxxxxxxxxxx.server.transfer.ap-northeast-1.amazonaws.com. sftp> ls user-a.txt sftp> put test.txt Uploading test.txt to /cm-mochizuki-yuta-private/user-a/test.txt test.txt sftp> ls test.txt user-a.txt sftp>
- 問題なくログインでき、ファイルの表示、アップロードも行えました。
Chroot を有効化する
また、ユーザーに提供したいと思った場合、ほかにもバケット名やパスを表示させたくないといったケースもあるかと思います。
現状だと、以下のようにバケット名やパスが表示されてしまいます。
sftp> pwd Remote working directory: /cm-mochizuki-yuta-private/user-a sftp> cd ../ sftp> pwd Remote working directory: /cm-mochizuki-yuta-private sftp> cd ../ sftp> pwd Remote working directory: / sftp> ls <ルートでは所有しているS3バケットが表示されます> sftp>
最近のアップデートで論理ディレクトリがサポートされたため、そちらも試してみました。
- シークレットの値
- HomeDirectory
- 論理ディレクトリを利用する場合は HomeDirectory は削除し、かわりに以下 HomeDirectoryDetails を設定します。
- HomeDirectoryDetails
- [{"Entry": "/", "Target": "/cm-mochizuki-yuta-private/${Transfer:UserName}"}]
- ${Transfer:UserName} のポリシー変数にはユーザー名が入ります。
- 論理ディレクトリが利用でき、ルートディレクトリが /cm-mochizuki-yuta-private/user-a/ にマッピングされていることを確認します。
- user-a.txt が配置されているため、問題なくマッピングされていることが確認できるかと思います。
$ sftp user-a@s-xxxxxxxxxxxxxxxxx.server.transfer.ap-northeast-1.amazonaws.com user-a@s-xxxxxxxxxxxxxxxxx.server.transfer.ap-northeast-1.amazonaws.com's password: Connected to user-a@s-xxxxxxxxxxxxxxxxx.server.transfer.ap-northeast-1.amazonaws.com. sftp> ls test.txt user-a.txt sftp> pwd Remote working directory: / sftp> cd .. sftp> pwd Remote working directory: / sftp> put test.txt Uploading test.txt to /test.txt test.txt sftp>
まとめ
従来の AWS SFTP では、SSH キーが必須だったり、S3バケット名が見えてしまったりと、あまりユーザー向けには使いづらいものでした。
しかし、パスワード認証や今回の論理ディレクトリのサポートにより、ユーザー提供もしやすくなったのではないでしょうか。
参考
AWS Transfer for SFTP、Amazon S3 の論理ディレクトリのサポートを開始
Chroot と論理ディレクトリを使用して AWS SFTP 構造を簡素化する | Amazon Web Services