【AWS】Transfer Family SFTP をパスワード認証で構築する方法(Secrets Manager + Lambda)
今回は、Amazon Web Services の AWS Transfer Family を利用して、SFTPサーバーをパスワード認証で構築する方法を解説します。
通常、Transfer Family はSSH公開鍵認証で利用されることが多いですが、
今回は以下のような構成で ユーザーID + パスワード認証 を実現します。
- SFTPサーバー:Transfer Family
- 認証:Lambda + Secrets Manager
- 保存先:S3
- 暗号化:KMS
- 接続:VPC内部向け
構成としては、AWS公式サンプルを利用する形です。
構成図
構成イメージは下記の通りです。
- クライアントがSFTP接続
- Transfer Family が Lambda を呼び出し
- Lambda が Secrets Manager のユーザー情報を取得
- 認証成功後、S3へアクセス
前提条件
以下は事前に作成済みとします。
- KMSキー
- S3バケット
- VPC
- サブネット
参考記事
参考記事
下記記事を参考に構築しています。
また、AWS公式のCloudFormationテンプレートを利用します。
SSE-KMSで暗号化されたS3の作成は下記の記事を参考
CloudFormation で認証基盤を作成
まずは Lambda / IAMロール / API連携部分を作成します。
CloudFormation スタックを作成
CloudFormartion ダッシュボードへ移動し「スタックの作成>新しいリソースを使用(標準)」
をクリックします。
「テンプレートファイルのアップロード」より対象のファイルを選択し「次へ」をクリック
下記のように設定値を入力し「次へ」をクリック
| 項目 | 設定値 |
|---|---|
| スタック名 | 任意 |
| CreateServer | false |
| SecretsManagerRegion | ap-northeast-1 |
※CreateServer=false にすることで、Transfer Family サーバー本体は後ほど手動作成します。
スタックオプションの設定を行います。設定値は任意で設定
確認して作成で何も問題なければ「送信」をクリックします。
スタックが「CREATE_COMPLETE」と表示されるまで待機。
Lambda名をメモ
リソースタブより作成されたLambda関数名を控えておきます。
transfer-family-lambda-01-GetUserConfigLambda-xxxx
Secrets Manager にSFTPユーザーを登録
次に、SFTPログイン用のユーザー情報を登録します。
シークレットを作成
AWS Secrets Manager のダッシュボードへ移動し、「新しいシークレットを保存する」をクリックします。
その他のシークレットタイプでS3アクセス用ロールとパスワード、ホームディレクトリを入力します。
※S3アクセス用ロールは下記の記事を参考
| 項目 | 説明 |
|---|---|
| Password | SFTPログイン用パスワード |
| Role | S3アクセス用IAMロール(ARN) |
| HomeDirectory | SFTP接続後のホームディレクトリ 例 /s3-your-backet-name/home/testuser |
※設定値について、上記の設定ではうまく動きませんので、詳しくは下記を参考にしてください。
シークレットを「SFTP/testuser」(SFTPは固定、testuserは作成予定のユーザー名に合わせてください)
と入力し後はデフォルトのまま「次へ」をクリック
下記はすべてデフォルトのままです。
レビューで問題なければ「保存」をクリック
緑のポップアップが表示されることを確認
AWS Transfer Family for SFTP を作成
サーバー作成
AWS Transfer Family のダッシュボードへ移動し「サーバーを作成」をクリックします。
プロトコルを選択で「SFTP」を選択し「次へ」をクリック
「カスタム ID プロバイダー」にチェックを入れ「AWS Lambda を使用して
アイデンティティプロバイダーを接続する」にチェック
下記のように入力、VPCとアベイラビリティゾーンは適宜入力してください。

※セキュリティグループは「SSH」からの通信を許可する設定が必要。
「ドメインを選択」でS3を選択
追加の詳細を設定でデフォルトのまま「次へ」をクリック
「確認と作成」で問題ないことを確認し「サーバーを作成」をクリック
数分待機し「状態」が「オンライン」となることを確認します。
Lambda修正
このままでは、Lambdaが動かないので、Lambdaのコードとロールを修正します。
Lambda のIAMポリシーを修正
Lambda 実行ポリシーへ以下のような権限を追加します。
{
"Effect": "Allow",
"Action": [
"secretsmanager:GetSecretValue"
],
"Resource": "*"
}※本番環境では Resource:* ではなく、対象シークレットへ絞ることを推奨します。
下記のように修正してください。

Lambdaの関数を修正
Lambdaの関数も公式ものだとうまく動かないので、下記に修正変更します。
SFTPよりテスト
ようやく準備ができましたので、Transfer Family SFTPよりテストを行います。
Transfer Family SFTP のダッシュボードに移動し「テスト」をクリック
下記のように入力(パスワードはtest)し「テスト」をクリック
送信元IPは送信したいEC2の内部IPを入れました。
ステータスコードが200番台が返ってきたら成功です!

EC2からテスト
今回はEC2から転送したいので、EC2からファイルアップロードできるかテストします。
下記コマンドにてテスト
echo "test2" > test2.txt
sftp testuser@vpce-xxxxxxxxxxxxxxx.vpce-svc-xxxxxxxxxxxxx.ap-northeast-1.vpce.amazonaws.com
put test2.txtS3へファイルが保存されていれば成功です。
※Transfer Family のDNS名は下記から取得できます。
サーバーの詳細より「エンドポイントのタイプ」をクリック
番外編 プライベートIPで接続確認
内部DNS名を確認します。
nslookup vpce-xxxxxxxx.ap-northeast-1.vpce.amazonaws.comプライベートIPが返却されることを確認します。
10.0.2.222IPアドレスで接続&アップロード確認
echo "test3" > test3.txt
sftp testuser@10.0.2.222
put test3.txtS3へファイルが保存されていれば成功です。
まとめ
今回は AWS Transfer Family を利用し、
Secrets Manager + Lambda 構成でパスワード認証型SFTPサーバーを構築しました。
この構成のメリットは以下です。
- サーバー管理不要
- S3を直接利用可能
- Secrets Managerでユーザー管理可能
- VPC内部向けSFTP構成も可能
- Lambdaによる柔軟な認証制御
検証用途はもちろん、実運用でも非常に使われる構成なのでおすすめです。