AWS Transfer Family のSFTPをパスワード方式で接続してみた(IP制限有り)

2022.12.04

こんにちは! 丸屋 正志です。

今回、AWS Transfer Family の SFTP サービスに対して、IDとパスワードでの接続方法を使う機会があったので、個人でやったことをアウトプットしてみました!

なお、このブログは2022/12/04投稿となります。
そのため、将来的にコンソール画面が変わっていたり、コード使えなかったりする場合もありますので、予めご了承ください。

0. 今回作るモノの構成図

下記のようなイメージとなります。

1. やってみた!

1.1. 事前準備

SFTPユーザー用のIAMロールを事前に作成し AmazonS3FullAccess を割り当ておきます。

  • 本格的に運用する際には、最小限の権限にしましょう
  • ロール名は、任意ですがココでは test-sftp-server とします

1.2. CloudFormation テンプレートの実行編

AWSブログ内にある CloudFormationテンプレートを用いて、API GatewayやLambdaといった必要なサービスを簡単に作成します。

それでは、早速環境作成をしていきます!
CloudFormation の左ペインから【スタック】にアクセスし【新しいリソースを使用 (標準)】をクリックします。

ステップ1 : スタックの作成

前提条件 - テンプレートの準備

  • 『テンプレートの準備』: 【テンプレートの準備完了】

テンプレートの指定

  • 『テンプレートソース』: 【テンプレートファイルのアップロード】
    • 【ファイルの選択】をクリックして、アップロードするファイルを選択

ステップ2 : スタックの詳細を指定

スタックの名前

  • 『スタックの名前』: [任意の名前] (例 : test-sftp-server)

ステップ3 : スタックオプションの設定

ステップ3については、基本的にデフォルトでも良いです。
もし、タグ等を設定したい場合には、希望のタグを設定します。

ステップ4 : レビュー test-sftp-server(任意の名前)

コンソール下辺部分にあるチェックボタン入れて、【送信】をクリックします。

作成中の状態

下記の状態のようになっていることを確認して、「CREATE_COMPLETE」になるまで待機します。

作成完了の状態

下記のように「CREATE_COMPLETE」になっていれば、各種リソースの作成完了です。


1.3. IP制限の環境に切り替える - VPC編

VPC の左ペインから【お使いの VPC】にアクセスし【VPC を作成】をクリックします。

1.3.1. VPC の設定

※少し長くなるため、文字と右側に表示されるプレビュー画面と見比べてください。

  • 『作成するリソース』: 【VPC など】
  • 『名前タグの自動生成』: [test-sftp-server]
  • 『アベイラビリティゾーン (AZ) の数』: 【1】
  • 『パブリックサブネットの数』: 【1】
  • 『プライベートサブネットの数』: 【0】
  • 『VPC エンドポイント』: 【なし】

プレビューした際に下記画像のようになっている事を確認し、【VPC を作成】をクリックします。

1.3.2. 作成完了の状態

下記のように「成功」と表示されていれば、VPCとサブネット等の作成完了になるので、【VPC を表示】をクリックして、トップページに戻ります。


1.4. IP制限の環境に切り替える - EIP編

VPC の左ペインから【Elastic IP】にアクセスし【Elastic IP アドレスを割り当てる】をクリックします。

Elastic IP アドレスの設定

  • 『ネットワークボーダーグループ』: [ap-northeast-1]
  • 『パブリック IPv4 アドレスプール』:【Amazon の IPv4 アドレスプール】

1.4.1. 作成完了の状態

下記画面のように「Elastic IPアドレス」が発行されていれば、EIPの作成は完了です。


1.5. IP制限の環境に切り替える - Transfer Family 停止編

AWS Transfer Family の左ペインから【サーバー】にアクセスし、CloudFormationで作成したサーバーをクリックします。

IP制限の環境に切り替えるために、該当サーバーのコンソール画面右上にある【アクション】【停止】という順でクリックして、サーバーを停止させます。

確認画面が表示されますので、【停止】をクリックします。

停止完了するまでに少し時間が掛かる場合がありますので、気長に待ちましょう。
ステータスが「オフライン」になっていることを確認し、「エンドポイントの詳細」枠の【編集】をクリックします。

1.5.1. エンドポイント設定を編集

エンドポイントの設定

  • 『エンドポイントのタイプ』: 【VPC でホスト】
  • 『アクセス』:【インターネット向け】
  • 『VPC』:【上記で作成したVPC名を選択】
    • 『アベイラビリティーゾーン』:【ap-northeast-1a を選択】
    • 『サブネット ID』:【上記で作成したサブネット名を選択】
    • 『IPv4 アドレス』:【上記で作成したEIPを選択】

下記画像のようになっている事を確認し、【保存】をクリックします。

変更中は、時間が5分以上掛かる場合があります。
また、画面の操作等はせず、画面が自動で切り替わるのを必ず待ち続けましょう。
※内部で変更最中に値を変更したりすると壊れてしまう場合があります。


1.6. IP制限の環境に切り替える - セキュリティグループ編

サーバー内部の構成変更が完了しますと下記のように表示されますので、続いてセキュリティグループを編集するために、「エンドポイントの詳細」枠の【VPC(自動生成名)】をクリックします。

「セキュリティグループ」タブに存在する【セキュリティグループID】をクリックします。

「インバウンドルール」タブの【インバウンドのルールを編集】をクリックします。

初めに既存のセキュリティグループルールIDの【削除】をクリックします。
その後に、【ルールを追加】をクリックに、タイプやソース等を選択し【ルールを保存】をクリックします。
※ここでは、自分のパソコンからの接続のみを指定しております。


1.7. IP制限の環境に切り替える - Transfer Family 開始編

AWS Transfer Family の左ペインから【サーバー】にアクセスし、CloudFormationで作成したサーバーをクリックします。

各種変更が完了したので、該当サーバーのコンソール画面右上にある【アクション】【開始】という順でクリックして、サーバーを開始(起動)させます。

起動完了するまでに少し時間が掛かる場合がありますので、気長に待ちましょう。
ステータスが「オンライン」になっていることを確認できたら、サーバーの起動完了です。


1.8. SecretsManagerでSFTPユーザー作成編

SecretsManager の左ペインから【シークレット】にアクセスし【新しいシークレットを保存する】をクリックします。

ステップ 1 : シークレットのタイプを選択

シークレットのタイプ枠から【その他のシークレットのタイプ】を選択します。

キー/値のペア

【+ 行を追加】を3回ほどクリックして、3枠を用意します。

  • 『Password』: [任意のパスワードを入力]
  • 『Role』: [任意のロール名を入力] (例 : arn:aws:iam::自分のAWSアカウントID:role/test-sftp-server)
  • 『HomeDirectory』: [任意のホームディレクトリ名を入力] (例 : /s3バケット名/sftp-user/)

ステップ 2 : シークレットを設定

シークレットの名前と説明

  • 『シークレットの名前』: [SFTP/任意のユーザー名] (例 : SFTP/sftp-user)

※今回の場合は、SFTP/ユーザー名と登録する必要があります。

ステップ 3 : ローテーションを設定 - オプション

デフォルトのままにして、変更等はせずに次へ進みます。

ステップ 4 : レビュー

これから作る内容に対して、問題がなければ【保存】をクリックします。


1.9. SFTPサーバーに接続編

AWS Transfer Family の左ペインから【サーバー】にアクセスし、CloudFormationで作成したサーバーをクリックします。

SFTPサーバーに接続するにあたり、エンドポイントの詳細の枠にある【エンドポイント】(ホスト名)をコピーします。
尚、「ホスト名」もしくは「パブリック IPv4アドレス」のどちらでも接続ができるため、お使いの環境に合わせて選択してください。

1.9.1. いざ、SFTPサーバーへ接続!

上記でコピーしたエンドポイント先をご利用になっているターミナルなどに貼り付けて、接続します。

## 実施コマンド
$ sftp 接続するユーザー名@<パブリック IPv4 アドレス>

## 例1 : サンプル実施コマンド ホスト名Ver
## sftp sftp-user@<パブリック IPv4 アドレス>

## 例2 : サンプル実施コマンド ホスト名Ver
## sftp sftp-user@s-エンドポイント名.server.transfer.ap-northeast-1.amazonaws.com

1.9.2. ファイルをアップロードしてみる

適当なファイルを用意してアップロードコマンドを実施してみると、下記のような情報が出力されます。

## 実施コマンド
sftp> put test.file

## 以下は出力内容
Uploading test.file to /S3バケット名/sftp-user/test.file
test.file                    100%  687    19.4KB/s   00:00

1.9.3. アップロード後のS3バケットを確認してみる

test.file が sftp-user/ にアップロードされたことが確認できます。

## 実施コマンド
$ aws s3 ls S3バケット名 --recursive

## 以下は出力内容
2022-12-04 19:16:20        687 sftp-user/test.file


1.10. 後片付け

ここでは、料金が発生するサービスだけを対象としています。

1.10.1. CloudFormation 編

CloudFormation の左ペインから【スタック】にアクセスし、作成したスタックを選択し、【削除】をクリックします。

削除前の最終確認がされますので、削除対象のスタックが合っているかを確認し【スタックの削除】をクリックします。



1.10.2. Elastic IP 編

Elastic IP アドレスのコンソールページより、作成済みのEIPを選択し、【アクション】【Elastic IP アドレスの開放】をクリックして開放します。



1.10.3. SecretsManager 編

SecretsManager の左ペインから【シークレット】にアクセスし作成済みの【シークレットの名前】を選択します。
画面右上にある【アクション】【シークレットを削除する】をクリックします。
待機期間を最低の7日に指定し、【スケジュール削除】をクリックして、削除されるまで待ちます。


2. Q&A編

Q1, パスワードではなく、SSH鍵の登録をしたいのですが可能でしょうか?また、どうやって変更したら良いでしょうか?

A1, はい、可能です。SecretsManagerの該当ユーザー画面にて、【シークレットの値を取得する】【編集する】をクリックしてから、『Password』のキー(左側)を『PublicKey』に変更してください。
その後に、値(右側)に公開鍵を貼り付けてください。
※公開鍵を貼り付ける際には、改行が含まれないように注意してください。


Q2, パスワードとSSH鍵の両方を登録することは、可能でしょうか?

A2, はい、可能です。また、パスワードもしくは鍵での両方での接続が可能です。


Q3, ホスト名を64文字以内にしたいのですが、標準機能で可能でしょうか?

A3, いいえ、不可能ですが、Route53や外部のDNSサービスを用いることで希望のホスト名にすることが出来ます。
前提条件として、ドメインを所持している必要があります。


Q4, SecretsManagerで作成したユーザーを7日以内に削除したいのですが、可能でしょうか?

A4, いいえ、仕様のため不可能です。 そのため最低7~最大30日の間で選択する必要があります。


Q5, ワークフローの機能を使いたいですが、可能でしょうか?

A5, はい、可能です。下記ブログを参考にワークフローを作成してみてください。
https://dev.classmethod.jp/articles/202210-aws-transfer-family-sftp/#toc-5


Q6, 今回のCloudFormationテンプレートを活用し複数のAWS Transfer Family のSFTPサーバーを建てて、それぞれのエンドポイントに接続したいのですが可能でしょうか?また、どう設定したら良いでしょうか?

A6, はい、可能です。

最初に、Cfnテンプレートを複製しエディター等で開き、5行目142行目265行目SFTP という単語を任意の名前に変更します。

例として、Cfnテンプレート1枚目にSFTP-Prod と、Cfnテンプレート2枚目にSFTP-Test 等に変更後に、このブログの手順通りにテンプレートを読み込ませて、その後にSecretsManagerに登録する際に、[SFTP-Prod/任意のユーザー名]などと登録することで、SFTPユーザーによって接続エンドポイントを変更することができます。

3. 関連記事

4. 最後に

AWS Transfer Family のSFTPサーバーって結構面白いので続けて描いていきたい!