AWS Transfer Familyをパスワード認証で利用できるように構築してみた

AWS

2023.4.28

Topics

はじめに

S3にSFTP接続にてファイルをアップロードする場合、Transfer Familyを使って利用することができます。
基本的に鍵認証での利用となりますが、今回はこちらのAWSのブログを参考にパスワード認証での利用の設定を行います。

2019年に同内容のブログが掲載されていますが、今回は2020年のアップデート版の記事を参考にします。

1.TransferFamily作成の下準備

1-1.S3バケットの作成

最初にファイルを保存するためのS3バケットを作成します。

1-2.ポリシーとロールの作成

こちらの公式ドキュメント を参考に作成したバケットのみにアクセスを許可するポリシーを作成します。

ポリシーを作成したら、作成したポリシーを利用するロールを作成してください。
信頼されたエンティティタイプ :「カスタム信頼ポリシー」を選択し、公式ドキュメント を参考にサービスを「transfer.amazonaws.com」、混乱した代理問題を避けるためにリージョンとアカウントIDを設定します。

許可ポリシーには先程作成したポリシーを選択します。
ロール名やタグをつけて「ロールを作成」をクリックして完成です。

1-3.Transfer Familyに使うネットワークの作成とElasticIPの割り当て

Transfer Familyに使うVPCやサブネットを作成します。
今回はパブリックサブネット1つを利用するVPCを作成します。NATゲートウェイやエンドポイントは等は使用しません。

ネットワーク作成が完了したらTransferFamilyに使用するElasticIPを割り当てます。

2.Transfer Familyの作成

2-1.SAMで利用するファイルの取得

Transfer Familyを構築するリージョンでCloudShellコンソールを開き、作業用ディレクトリを作成します。その後、作業用ディレクトリ内でAWSのブログ 内で配布されている下記ドキュメントをwgetで取得し、unzipします。

▼配布ドキュメント
https://s3.amazonaws.com/aws-transfer-resources/custom-idp-templates/aws-transfer-custom-idp-secrets-manager-sourceip-protocol-support-apig.zip

2-2.sam deployによるTransfer Familyの構築

ディレクトリ内からwgetしたzipファイルを削除し、「sam deploy –guided」を実行します。
実行時にSAMの実行設定についていくつか聞かれますので、下記項目のみを入力してください。その他はデフォルトでOKです。
ただしSAMはCloudFormationを利用するため、StackNameについてはCloudFromationに既に同じ名前のスタックがある場合は別の名前で実行してください。

項目 入力する値
Parameter TransferEndpointType VPC
Parameter TransferSubnetIDs 1-3で作ったパブリックサブネットのID
Parameter TransferVPCID 1-3で作ったVPCのID

尚、上記で設定したStack Name以外のVPCのパラメータについても後ほど設定できるので、デフォルトで設定した後でTransferFamilyから設定しても問題ありません。

※SAMを初めて実行した場合は、CloudFromationに上記スタックの他に「aws-sam-cli-managed-default」が実行されます。

こちらはSAMでデプロイされたソースやテンプレートを保存するS3バケットやそれに関連するポリシーを設定するものなのでそのままで大丈夫です。

完了するとTransferFamilyの他にLambda、API Gateway等必要なリソースが作成されます。

2-3.Transfer Family にElasticIPを設定

Transfer Familyのコンソールから作成した Transfer Familyを選択し、停止を選択します。

オフラインになったらサーバーをクリックし、「エンドポイントの詳細」の編集をクリックします。

編集画面に移ったらアクセスを「インターネット向け」、アベイラビリティーゾーンのチェックをつけられているサブネットのIPv4アドレスに1-4で割り当てたElasticIPを設定して保存します。
2-2のSAMのデプロイの際にネットワーク設定を行っていない場合はここで設定を行い保存します。

保存している間は、完了まで画面遷移などはしないように注意してください。
完了した場合は自動で画面遷移します。

2-4.セキュリティグループの設定

反映が終わったら、エンドポイントにセキュリティグループを設定します。
「エンドポイントの詳細」の「エンドポイントのタイプ」のリンクからエンドポイントのコンソールに移動します。

エンドポイントにはデフォルトのセキュリティグループが紐づいているため、こちらを編集してアクセス制限を実施します。

セキュリティグループの設定が完了したら、停止したTransfer Familyを開始します。
ここまででTransfer Familyの構築作業は完了です。

3.SFTPアカウントの作成

ここからはユーザー作成を行いますが、ユーザー情報については「AWS Secrets Manager」を主に使用します。

3-1.ユーザーフォルダの作成

最初に作ったS3のバケットにユーザーのフォルダを作ります。

3-2.ユーザー情報の登録

Secrets Managerに移動し、ユーザーの情報を登録します。
登録する情報は以下の通りです。

  • シークレットのタイプ ・・・ その他のシークレットのタイプ
  • 登録するキーと値
キー
Password SFTPアカウントのパスワード
Role 1-2で作ったロールのarn
HomeDirectoryDetails [{“Entry”: “/”, “Target”: “/1-1で作ったS3のバケット/ユーザーのフォルダ”}]
  • シークレットの名前 : aws/transfer/Transfer Familyのサーバー名/ユーザー名



上記以外の設定はそのままで大丈夫です。

実際には以下のキーがありますが、今回は上記のみ設定します。

キー 内容
Password アカウントのパスワードを設定します。
Role ユーザーがS3バケットへアクセスするためのロールを設定します。ロールのarnを登録します。
HomeDirectory ユーザーのホームディレクトを設定するキーです。
HomeDirectoryDetailsとは違い、chroot オペレーションが実行されないためホームフォルダより上位階層に移動することができます。
登録する値の例 : /バケット名/ホームフォルダ
HomeDirectoryDetails ユーザーのホームディレクトを設定するキーです。
HomeDirectoryとは違い、chroot オペレーションが実行されるためホームフォルダより上位階層に移動することはできません。
登録する値の例 : [{“Entry”: “/”, “Target”: “/バケット名/ホームフォルダ”}]
PublicKey 公開鍵を登録するキーです。公開鍵(ssh-rsa ***…)を登録することで鍵認証でログインすることができます。
パスワードと一緒に登録した場合はどちらか片方のみ認証すればログイン可能です。
公開鍵を「ssh-rsa ***…,ssh-rsa ***…」の形で登録すれば、最大2つまでの公開鍵が登録可能です。
FTPPassword FTPプロトコルで接続した場合のパスワードです。
ただしFTPはTransferFamilyがプライベートの時以外は使用できません。
AcceptedIpNetwork アカウントの接続元許可IPを設定するキーです。
セキュリティグループとは別にアカウント毎にログインのアクセス制限が行えます。
登録する値の例 : ..**.0/24

シークレットの登録が完了したらFTPクライアントでSFTP接続を行ってみましょう。
接続してファイルがアップロードできれば成功です。

アップロード時のエラーについて

FTPクライアントによってはアップロード時にSETSTATコマンドを発行しますが、
SETSTATコマンドはオブジェクトストレージシステムと互換性がないため、
S3にアップロードする際にエラーが発生する場合があります。

その場合はTransfer Familyで使用しているサーバーを選択し、「その他の詳細」の「SetStat オプション」にチェックを入れて有効化し、保存します。

サービスの削除について

先にもありました通りSAMはCloudFormationを利用しているため、構築したTransferFamilyを削除する場合は
CloudFormationのスタックを削除し、SAM以外で設定したS3、ロール、ポリシー、VPC、ElasticIP、シークレットを削除しましょう。
シークレットについては削除に猶予期間があるため、最短でも7日かかります。

Recommends

こちらもおすすめ

Special Topics

注目記事はこちら