【AWS】Transfer Family SFTP をパスワード認証で構築する方法(Secrets Manager + Lambda)

TransferFamilyアイキャッチ

今回は、Amazon Web Services の AWS Transfer Family を利用して、SFTPサーバーをパスワード認証で構築する方法を解説します。

通常、Transfer Family はSSH公開鍵認証で利用されることが多いですが、
今回は以下のような構成で ユーザーID + パスワード認証 を実現します。

  • SFTPサーバー:Transfer Family
  • 認証:Lambda + Secrets Manager
  • 保存先:S3
  • 暗号化:KMS
  • 接続:VPC内部向け

構成としては、AWS公式サンプルを利用する形です。

構成図

構成イメージは下記の通りです。

  1. クライアントがSFTP接続
  2. Transfer Family が Lambda を呼び出し
  3. Lambda が Secrets Manager のユーザー情報を取得
  4. 認証成功後、S3へアクセス

前提条件

以下は事前に作成済みとします。

  • KMSキー
  • S3バケット
  • VPC
  • サブネット

参考記事

参考記事

下記記事を参考に構築しています。

また、AWS公式のCloudFormationテンプレートを利用します。

SSE-KMSで暗号化されたS3の作成は下記の記事を参考

CloudFormation で認証基盤を作成

まずは Lambda / IAMロール / API連携部分を作成します。

CloudFormation スタックを作成

CloudFormartion ダッシュボードへ移動し「スタックの作成>新しいリソースを使用(標準)」
をクリックします。

「テンプレートファイルのアップロード」より対象のファイルを選択し「次へ」をクリック

下記のように設定値を入力し「次へ」をクリック

項目設定値
スタック名任意
CreateServerfalse
SecretsManagerRegionap-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アクセス用ロールは下記の記事を参考

項目説明
PasswordSFTPログイン用パスワード
RoleS3アクセス用IAMロール(ARN)
HomeDirectorySFTP接続後のホームディレクトリ
例 /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の関数を修正

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.txt

S3へファイルが保存されていれば成功です。

※Transfer Family のDNS名は下記から取得できます。
サーバーの詳細より「エンドポイントのタイプ」をクリック

番外編 プライベートIPで接続確認

内部DNS名を確認します。

nslookup vpce-xxxxxxxx.ap-northeast-1.vpce.amazonaws.com

プライベートIPが返却されることを確認します。

10.0.2.222

IPアドレスで接続&アップロード確認

echo "test3" > test3.txt
sftp testuser@10.0.2.222
put test3.txt

S3へファイルが保存されていれば成功です。

まとめ

今回は AWS Transfer Family を利用し、
Secrets Manager + Lambda 構成でパスワード認証型SFTPサーバーを構築しました。

この構成のメリットは以下です。

  • サーバー管理不要
  • S3を直接利用可能
  • Secrets Managerでユーザー管理可能
  • VPC内部向けSFTP構成も可能
  • Lambdaによる柔軟な認証制御

検証用途はもちろん、実運用でも非常に使われる構成なのでおすすめです。

関連記事