AWS Transfer FamilyのSFTPで、Parameter Storeを使ってMFAによる認証を実現してみた

AWS Transfer FamilyのSFTPで、Parameter Storeを使ってMFAによる認証を実現してみた

2026.02.03

こんにちは、ゲームソリューション部のsoraです。
今回は、AWS Transfer FamilyのSFTPで、Parameter Store(SecureString)を使ってMFAによる認証を実現してみたことについて書いていきます。

はじめに

Transfer FamilyのカスタムIDプロバイダー機能で、Secrets Managerを使ったパスワード認証の構成は、以下の記事で紹介されています。
https://dev.classmethod.jp/articles/aws-transfer-family-with-apigateway-custom-id-provider-aws-secrets-manager/

今回はこれにTOTPを追加した形を実装してみます。

構成

今回構築したのは以下の構成です。
ランダム生成した文字列から1Passwordにワンタイムパスワードを登録して、その値とパスワードを組み合わせてTransfer FamilyのSFTPでS3に接続する形です。
ユーザーに対応するIAMロールやパスワード、TOTP秘密鍵などは、Parameter StoreのSecureStringで保管します。

sr-transferfamily-sftp-sm-mfa-01

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桁コードを生成・検証できる仕組みです。

sr-transferfamily-sftp-sm-mfa-03

動作確認

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

sr-transferfamily-sftp-sm-mfa-02

そのエンドポイントに対して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による認証を実現してみたことを記事にしました。
どなたかの参考になると幸いです。

この記事をシェアする

FacebookHatena blogX

関連記事