AWS Transfer for SFTP でパスワード認証と論理ディレクトリをやってみた

2019.10.09

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、望月です。

AWS Transfer for SFTP (AWS SFTP) をユーザーに提供したいと思った場合、SSH キーでの認証というのは敷居が高く感じるかと思います。

ID プロバイダーが Service managed では SSH キーでの認証のみ対応となりますが、カスタム ID プロバイダーを利用するとパスワード認証を使うことができるため、試してみました。

今回は下記ブログを参考にカスタム ID プロバイダーに Secrets Manager を使用してみます。

Enable password authentication for AWS Transfer for SFTP using AWS Secrets Manager | Amazon Web Services

やってみた

CloudFormation テンプレートの実行

  • スタックの名前
  • <任意>
  • パラメータ
  • 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