投稿日 2020-04-24

AWS Transfer FamilyとSORACOM CanalでデバイスからセキュアにアクセスするFTPサーバーを構築する

ども、ソリューションアーキテクトのtakiponeです。

IoTデバイスの通信形式は、IoTシステムを設計するうえで非常に重要です。クラウドではWeb技術の様々な通信プロトコルが出てきている一方、デバイスがサポートする通信形式は限られており、従来からある機器やPCではFTP(File Transfer Protocol) に根強い人気があります。FTPは暗号化の仕組みを持たないため、インターネットなどのオープンなネットワークでの通信にはセキュリティの懸念があり、SFTPやFTPSなど暗号機能を追加したFTPの拡張版プロトコルも存在しますが、それらをデバイスがサポートするとは限りません。

そこで今回は、デバイスとAWSを3G/LTEセルラー通信の閉域ネットワークでセキュアに接続するSORACOM CanalとAWSのプライベートネットワーク(Amazon VPC)向けにFTPをサポートするAWS Transfer Familyを組み合わせて、運用管理が不要なマネージドのFTPファイルサーバー構成をご紹介します。

構成

構成図を以下に示します。

今回は、デバイスとしてSORACOM IoT SIMをセットした3G/LTEドングルをRaspberry Piに挿し、 ftp コマンドでAWS Transfer Family FTPサーバーが提供するVPC Endpointに接続します。VPC EndpointはプライベートIPアドレスになっているので、Raspberry PiとVPC Endpoint間はSORACOM Canalを経由したエンドツーエンドでのプライベートネットワークであり、インターネットからそれらにアクセスされる恐れはありません。

AWS Transfer Familyは、API GatewayとAWS Lambdaによるカスタム認証プロバイダをサポートしており、任意のFTPユーザー/パスワードをセットできます。アップロード、ダウンロードするファイルはAmazon S3の指定バケットに保存されるため、S3の高い耐障害性やバージョニングなどの機能を利用できるほか、ファイルの内容からAWSの他のサービスを連携させて分析やイベント処理を組み合わせることも可能です。

デバイスはLTEルーターやIoTゲートウェイを利用すれば、製造現場のPLC装置やFA PCとはEthernetなどのLANと繋ぎ、機器のデータをクラウドにアップロードする方法としても応用できそうです。

手順

1. SORACOM Canalの構成

SORACOM IoT SIMからAWSのVPCにプライベート接続するために、VPGおよびSORACOM Canalを構成します。手順は以下のSORACOMユーザーサイトを進めてください。

今回はEC2は利用しないため[ステップ 1: VPC、および EC2 インスタンスを作成する]の[EC2 インスタンスを作成する]は省略し、[ステップ 4: 閉域網で接続する]の[IoT SIM をグループに所属させる]まで完了してください。

2. Amazon S3の構成

AWS Transfer Familyがファイルを保存するS3バケットと、それにアクセスするためのIAMロールを作成します。AWS管理コンソールのメニュー[サービス]から「S3」を選択し、[バケットを作成]ボタンをクリックします。

任意のバケット名(今回は「soracom-ftp-sample」)を入力、他の項目は変更せずに「バケットを作成」をクリックしバケットを作成します。バケット名は後ほどAWS Transfer Familyに設定するため、メモしておきます。

続いてメニューの[サービス]から「IAM」を選択し、IAM管理画面を表示、左のメニューから[ロール]を選択して「ロールの作成」ボタンをクリックします。

[信頼されたエンティティの種類を選択]では「AWSサービス」を選択、[ユースケースの選択]は「Transfer」をクリックし、「次のステップ: アクセス権限」をクリックします。

続いて作成するロールに権限ポリシーを設定します。[ポリシーの作成]をクリックし、作成画面が新しいタブ/ウィンドウで表示されます。

ポリシーの作成では[JSON]タブをクリック、テキストエリアに ドキュメントのサンプルポリシー を貼り付け、2箇所あるS3バケット名を先ほどの手順で作成したバケット名に置換、[ポリシーの確認]をクリックします。

任意のポリシー名(今回はsoracom-ftp-sample)を入力し、「ポリシーの作成」ボタンをクリックします。

元のタブ/ウィンドウ(ロールの作成画面)に戻り、ポリシー再読み込みのアイコンをクリック、作成したポリシー(soracom-ftp-sample)がリストされたら左のチェックボックスをオンにして「ロールの確認」をクリックします。

任意のロール名(今回はsoracom-ftp-sample)を入力し、「ロールの作成」ボタンをクリックしてIAMロールを作成します。

作成されたIAMロールの概要画面を表示し、[ロールARN]をコピーしておきます。この後のステップで利用します。

これでS3とIAMの操作は完了です。

3. カスタム認証プロバイダの構成

続いて、Transfer FamilyがFTPユーザーを認証するための仕組みであるカスタム認証プロバイダを設定します。専用のソフトウェアは不要で一般的なRESTful APIで実装できるため、今回はAWSドキュメントにあるCloudFormationのサンプルでAPI GatewayとAWS Lambdaの構成を一括で作成します。

AWS管理コンソールの[サービス]メニューから「CloudFormation」を選択し「スタックの作成」ボタンをクリック、[テンプレートの指定]から[Amazon S3 URL]を選択して以下のURLを貼り付け「次へ」をクリックします。

https://s3.amazonaws.com/aws-transfer-resources/custom-idp-templates/aws-transfer-custom-idp-basic-apig.template.yml

任意の名前(今回はsoracom-ftp-sample)を[スタックの名前]に入力し、以下を選択および入力し「次へ」をクリックします。

  • CreateServer: false
  • UserHomeDirectory: /<s3バケット名>
  • UserRoleArn: 手順1で作成したIAMロールのARN

ここにある UserNameUserPassword がFTPサーバーにアクセスする際の設定になります。これらは今回の構成ではAWS Lambdaにハードコードされますが、AWS Secrets Managerとの連携例を参考にユーザー情報を作り込むこともできます。

次の画面ではそのまま「次へ」をクリックし、確認画面では「AWS CloudFormationによってIAMリソースが作成される場合があることを承認します」のチェックをオンにし「スタックの作成」をクリックして作成を開始します。

しばらく待ち、CloudFormationスタックのステータスが CREATE_COMPLETE になったら完了です。スタックの詳細画面の[出力]タブにある以下2つをメモしておきます。このあとのTransfer Familyの設定に使用します。

  • TransferIdentityProviderInvocationRole
  • TransferIdentityProviderUrl

これでカスタム認証プロバイダの構成は完了です。

4. AWS Transfer Family FTPサーバーの構成

いよいよTransfer Family FTPサーバーの構成です。サーバー自体の設定はシンプルで、ここまでの構成パラメータをいくつか貼り付けて作成できます。AWS管理コンソールの[サービス]メニューから「AWS Transfer Family」を選択し、[Create Server]ボタンをクリックします。

Choose protocolsでは「FTP」のみチェックをオンにし[Next]をクリックします。

Identity Provider画面では[Custom]を選択し、以下の項目に手順3のカスタム認証プロバイダを貼り付けます。

  • Custom provider: TransferIdentityProviderUrl の値
  • Invocation role: TransferIdentityProviderInvocationRole のロールを選択

Endpoint configuration画面では[VPC Hosted]を選択して手順1で作成したVPCとそのVPCサブネットを選択、「Next」をクリックします。

確認の画面で各パラメータを確認し、「Create」ボタンをクリックしてFTPサーバーを作成します。しばらく待ち、[State]が Online になったら完了です。

FTPサーバーのVPC EndpointにFTPアクセスできるように、VPC Endpointのセキュリティグループを設定します。AWS管理コンソールの[サービス]メニューから「VPC」を選択しVPC管理画面を表示、メニューから[セキュリティグループ]を選択し「セキュリティグループの作成」ボタンをクリックします。

任意のグループ名(今回はftp)と説明を入力、手順1で作成したVPCを選択してグループを作成します。

[インバウンドのルール]タブから[ルールの編集]ボタンで編集画面を開き、以下のルールを設定します。

  • カスタムTCPルール、ポート範囲 21、ソース カスタム 100.64.0.0/10
  • カスタムTCPルール、ポート範囲 8192-8200、ソース カスタム 100.64.0.0/10

続いてメニューから[エンドポイント]を選択します。[サービス名]が com.amazonaws.<リージョン名>.transfer.server.c-<数字> の項目がTransfer FamilyのVPCエンドポイントです。選択し、[セキュリティグループ]タブをクリック、[セキュリティグループの編集]から先ほど作成したグループを選択します。

これで設定は完了です。

5. 動作確認

では、SORACOM IoT SIMをセットしたデバイスからFTPアクセスしてみましょう。アクセス先はVPC Endpointの[詳細]タブにある[DNS名]の一覧から選択できます。1つ目のDNS名は複数のIPアドレスが返る冗長構成対応したものなので、特段の事情がなければこちらを利用するのが良いでしょう。

では、 ftpコマンドで接続します。サポートするFTPプロトコル仕様は以下のドキュメントで確認できます。

差し当たっては、パッシブモードのみとバイナリモードのみということと、利用できるコマンド一覧を眺めておくと良いと思います。

$ ftp -p vpce-XXXX.vpce-svc-XXXX.ap-northeast-1.vpce.amazonaws.com
Connected to vpce-XXXX.vpce-svc-XXXX.ap-northeast-1.vpce.amazonaws.com.
220 Service ready for new user.
Name (vpce-XXXX.vpce-svc-XXXX.ap-northeast-1.vpce.amazonaws.com:pi): myuser
331 User name okay, need password for myuser.
Password:<MySuperSecretPasswordと入力>
230 User logged in, proceed.
Remote system type is UNIX.
ftp> binary
200 Command TYPE okay.
ftp> put hoge.log
local: hoge.log remote: hoge.log
227 Entering Passive Mode (172,30,3,68,32,0)
150 File status okay; about to open data connection.
226 Transfer complete.
5503 bytes sent in 0.00 secs (7.5187 MB/s)
ftp> ls
227 Entering Passive Mode (172,30,3,68,32,8)
150 File status okay; about to open data connection.
-rw-------   1 - -         5503 Apr 24 03:38 setup_air.sh
226 Closing data connection.
ftp>
</mysupersecretpasswordと入力>

アップロードしたファイルはS3に保存されるため、S3バケットの画面も確認してみます。

アップロードしたファイルが確認できました!

まとめ

AWS Transfer FamilyとSORACOM Canalを利用してデバイスからセキュアにアクセスできるクラウドのFTPサーバー構成をご紹介しました。既存の機器やデバイスをクラウドと連携させる方法として活用ください!

参考URL