この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
こんにちは、望月です。
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