AWS Transfer FamilyのSFTPで、Parameter Storeを使ってMFAによる認証を実現してみた
こんにちは、ゲームソリューション部のsoraです。
今回は、AWS Transfer FamilyのSFTPで、Parameter Store(SecureString)を使ってMFAによる認証を実現してみたことについて書いていきます。
はじめに
Transfer FamilyのカスタムIDプロバイダー機能で、Secrets Managerを使ったパスワード認証の構成は、以下の記事で紹介されています。
今回はこれにTOTPを追加した形を実装してみます。
構成
今回構築したのは以下の構成です。
ランダム生成した文字列から1Passwordにワンタイムパスワードを登録して、その値とパスワードを組み合わせてTransfer FamilyのSFTPでS3に接続する形です。
ユーザーに対応するIAMロールやパスワード、TOTP秘密鍵などは、Parameter StoreのSecureStringで保管します。

Secrets Managerに保管しても良かったのですが、自動ローテーション機能は不要なのと、1シークレット内に複数のKey-Valueフィールドが持てて視認性が上がる部分も不要なため、使用していません。
ユーザー数が多くなる場合は、Parameter Storeの代わりにDynamoDBなどに保管することも可能です。
ただし、パスワードなどを扱う都合上、機密情報をそのまま格納するのは適切ではないため、パスワードのハッシュ化などを別途実装することになるかと思います。
構築
今回はTerraformで構築しました。
基本的なリソースが多いのでコードは割愛しますが、ポイントだけ解説します。
Parameter StoreにはSecureString型で以下の値をユーザーごとに登録します。
{
"Password": "ユーザーのパスワード",
"MFASecretKey": "<ランダムな文字列>",
"Role": "arn:aws:iam::<アカウントID>:role/sftp-totp-mfa-transfer-user-role",
"HomeDirectory": "/sftp-totp-mfa-bucket/testuser"
}
| キー | 説明 |
|---|---|
Password |
SFTPログイン時のパスワード |
MFASecretKey |
Base32エンコードのTOTP秘密鍵。Google Authenticatorや1Password等のTOTPアプリに登録する |
Role |
認証成功時にTransfer Familyが引き受けるIAMロールのARN |
HomeDirectory |
ユーザーがアクセスするS3上のパス(/バケット名/プレフィックス) |
ちなみに、MFASecretKey はPythonの標準ライブラリで生成しました。
python3 -c "import secrets, base64; print(base64.b32encode(secrets.token_bytes(20)).decode())"
# 出力例: OGGN2Z4CTW4ZZ63GAVNRM2PVKUQ477DT
これをParameter StoreとユーザーのTOTPアプリ(Google Authenticator、1Password等)にも登録することで、同じ秘密鍵を共有して、同じ時刻ベースの6桁コードを生成・検証できる仕組みです。

動作確認
AWSマネジメントコンソールでTransfer Familyのエンドポイントを確認します。

そのエンドポイントに対してSFTP接続をしてみます。
パスワード欄に、パスワードとTOTPコードを連結して入力します。
% sftp testuser@s-xxxxxxxxxxxxxxxxx.server.transfer.ap-northeast-1.amazonaws.com
testuser@s-xxxxxxxxxxxxxxxxx.server.transfer.ap-northeast-1.amazonaws.com's password:
Connected to s-xxxxxxxxxxxxxxxxx.server.transfer.ap-northeast-1.amazonaws.com.
sftp>
接続後、S3に対して、ファイルの確認やダウンロードができることが確認できました。
sftp> ls
Flavors.md test
sftp> get Flavors.md
Fetching /sftp-totp-mfa-xxxxx/testuser/Flavors.md to Flavors.md
Flavors.md
最後に
今回は、AWS Transfer FamilyのSFTPで、Parameter Store(SecureString)を使ってMFAによる認証を実現してみたことを記事にしました。
どなたかの参考になると幸いです。







