【AWS】SSM Port ForwardingによるFTP,rsyncの並列転送

概要

AWS System Manager Sessions Manager Port Forwarding(以降SSM Port Forwarding)を使用して、FTPrsyncで並列ファイル転送を行う方法を紹介します。

SSM Port Forwardingにより、ローカル端末とEC2間に確立されるSSM Session Manager Tunnelを使って、セキュアにファイル転送を行う事が可能となります。 しかし、SSM Port Forwardingの特性上、ポートが動的に変化するFTPパッシブモードや、複数ポートによる並列転送を行う場合、通信を確立するために工夫が必要となります。

本記事では、そのようなケースで必要となる設定上の工夫について説明します。

記載内容

  1. SSM Port Forwardingとは
  2. SSM Port Forwarding設定方法
  3. SSM Port ForwardingでFTP(pasv)を使うための工夫
  4. SSM Port Forwardingでrsyncを並列転送するための工夫
  5. Appendix 参考リンク

1.SSM Port Forwardingとは

SSM Port Forwardingは、ローカル端末とプライベートサブネットにデプロイされたインスタンス間にトンネルを安全に作成できる機能です。これにより、ローカル端末とEC2間で、SSH、RDP、FTP等の多様な通信が可能となります。 例えば、下記の様にプライベートサブネットにデプロイされたEC2へアクセスする際に、踏み台サーバが不要になります。

踏み台を使ったアクセス方法

f:id:VbuiV:20220324223512p:plain

SSM Port Forwardingアクセス方法

f:id:VbuiV:20220324223530p:plain

2.SSM Port Forwarding設定方法

SSM Port Forwardingを行うために必要な手順を説明します。 f:id:VbuiV:20220324223554p:plain

準備

①EC2とSSMとの間でHTTPS通信を行うためのVPCエンドポイントを作成します。

  • ①-1.VPCとプライベートサブネットを作成します。

    • VPCのenableDnsSupportとenableDnsHostnamesは有効にする
  • ①-2.VPCエンドポイントにアタッチするセキュリティグループAを作成します。

    • InboundでEC2からのHTTPS通信を許可
  • ①-3.下記VPCエンドポイントを作成し、セキュリティグループAをアタッチします。

    • "com.amazonaws.<リージョン>.ssm
    • "com.amazonaws.<リージョン>.ssmmessages
    • "com.amazonaws.<リージョン>.ec2
    • "com.amazonaws.<リージョン>.ec2messages

②EC2でAWS SSMを利用する準備を行います。

  • ②-1.セキュリティグループBを作成します。
    • OutboundでVPCエンドポイント(セキュリティグループA)へのHTTPS通信を許可
  • ②-2.EC2を作成し、セキュリティグループBをアタッチします。
  • ②-3.SSMエージェントを導入します。(AWS提供のAMIを利用する場合は不要)

③以下のマネージドポリシーを付与したIAMロールを作成し、EC2にアタッチします。

④Client側にAWS CLIとSession Manager pluginをインストールします。

接続

Clientのコマンドプロンプトで、"aws configure"コマンドで必要な設定をした後、以下のコマンドを発行し、EC2とのセッションを確立します。
※Client側のlocalPortNumber(任意)とEC2側のportNumber(sshなら22,RDPなら3389)でセッションが確立されます。

aws ssm start-session --target <instance-id> --document-name AWS-StartPortForwardingSession --parameters "portNumber=<port>,localPortNumber=<port>"

例:Tera TermでSSHをする場合は上述のコマンド実行時に"portNumber=22"を指定します。Tera Termの"TCPポート#(P):"には"localPortNumber"で指定した任意ポートを入力します。

f:id:VbuiV:20220324223655p:plain

3.SSM Port ForwardingでFTP(pasv)を使うための工夫

FTPとはデータ転送用のプロトコルです。

詳細は割愛しますが、FTPにはアクティブモードとパッシブ(pasv)モードの二つのモードがあり、パッシブ(pasv)モードは制御用に21番ポートを使用し、データ転送用のポートはランダムに設定されます。

一方、SSM Port Forwardingはサーバ側とクライアント側のポートを一つ一つ対応付けていくため、FTP(pasv)のようにランダムにポートを使用するプロトコルを使用する場合には、ランダムに使用される全てのポートで事前にトンネルを作成しておくといった工夫が必要になります。

ポイント

◆データコネクションで使用するポートを制限する。
aws ssm start-sessionコマンドで必要な数のデータコネクションを確立する。

アーキテクチャのイメージ

f:id:VbuiV:20220324223636p:plain

本記事で使用しているソフトウェア

  • クライアント:Windows10 , FFFTP(ver2.00)
  • サーバ:RHEL7.6 , vsftpd 3.0.2
    ※インストールやセットアップ方法は世の中にあふれていると思うので、割愛します。

FTP(pasv)の設定例

  1. サーバ(vsftpd.conf)の設定
    aws ssm start-sessionコマンドでポート指定する必要があるため、使用するデータ転送用ポートを制限します。

    • 設定ファイル例(抜粋)※データ転送用ポート範囲
     pasv_min_port=40000
     pasv_max_port=40003
    
  2. 並列度数分のセッションを張る
    制御用ポートおよびデータ転送用として使用するポート数分のセッションを張ります。

    • コマンド実行例(制御用)
      ※portNumber,localPortNumberはお使いの環境に応じて変更してください。
      aws ssm start-session --target <instance-id> --document-name AWS-StartPortForwardingSession --parameters "portNumber=21,localPortNumber=21"
    
    • コマンド実行例(データ転送用)
      ※portNumber,localPortNumberはお使いの環境に応じて変更してください。
      aws ssm start-session --target <instance-id> --document-name AWS-StartPortForwardingSession --parameters "portNumber=40000,localPortNumber=40000"
      aws ssm start-session --target <instance-id> --document-name AWS-StartPortForwardingSession --parameters "portNumber=40001,localPortNumber=40001"
      aws ssm start-session --target <instance-id> --document-name AWS-StartPortForwardingSession --parameters "portNumber=40002,localPortNumber=40002"
      aws ssm start-session --target <instance-id> --document-name AWS-StartPortForwardingSession --parameters "portNumber=40003,localPortNumber=40003"
    
  3. クライアント(FFFTP)で並列実行
    FFFTPは1プロセスで4セッションまで並列転送可能です。[特殊機能]タブ - [最大同時接続数]で指定。
    ※さらに並列度を上げる場合は、FFFTP自体を複数起動してください。

4.rsyncの設定方法

FTPと同様に、rsyncでもSSM Port Forwardingを用いた転送が可能です。
リモートでrsyncする場合、sshを使用するケースも多いですが、本投稿ではサーバのrsyncdに複数ポートを使用して並列転送を行う方法を紹介します。

ポイント

◆並列転送のために、rsyncdを複数異なるポートで起動する。その際、pidファイルの重複を避ける。
aws ssm start-sessionコマンドで必要な数のコネクションを確立する。

アーキテクチャのイメージ

f:id:VbuiV:20220324223720p:plain

本記事で使用しているソフトウェア

  • クライアント:Windows10 , rsync 3.1.3 , cygwin 3.2.0
  • サーバ:RHEL7.6 , rsync 3.1.2
    ※インストールやセットアップ方法は世の中にあふれていると思うので、割愛します。

rsyncで並列転送するための設定例

  1. サーバの設定と起動
    設定ファイル間でのプロセスIDファイルとログファイル名の重複を避けつつ、多重度数分の設定ファイルを作成します。

    • 設定ファイル例(抜粋)
      ※並列実行したい分だけファイルを複製してください。

    設定ファイル1: rsync1.conf

      pid file = /var/run/rsyncd1.pid
      log file = /var/log/rsyncd1.log
      [testrsync]
          path = /tmp
    

    設定ファイル2 :rsync2.conf

      pid file = /var/run/rsyncd2.pid
      log file = /var/log/rsyncd2.log
      [testrsync]
          path = /tmp
    

    待ち受けポート番号をオプションとしたrsyncを、デーモンモードで並列実行します。

      rsync --daemon --config=/etc/<設定ファイル> --port=10873
      rsync --daemon --config=/etc/<設定ファイル> --port=10874
    
  2. 多重度数分のセッションを張る

    • コマンド実行例
      ※並列実行したい分だけコマンドを実行してください。
      aws ssm start-session --target <instance-id> --document-name AWS-StartPortForwardingSession --parameters "portNumber=10873,localPortNumber=10873"
      aws ssm start-session --target <instance-id> --document-name AWS-StartPortForwardingSession --parameters "portNumber=10874,localPortNumber=10874"
    
  3. クライアントでのrsync並列実行

    • コマンド実行例
      ※並列実行したい分だけコマンドを実行してください。
      rsync -av --progress --port=10873 --password-file=./rsyncd.passwd (※1) ./test1.txt (※2) rsync://rsync_user(※3)@localhost/testrsync (※4)
      rsync -av --progress --port=10874 --password-file=./rsyncd.passwd (※1) ./test2.txt (※2) rsync://rsync_user(※3)@localhost/testrsync (※4)
    
      ※1 サーバに作成したユーザのパスワードファイル
      ※2 転送するファイル
      ※3 サーバに作成したユーザ
      ※4 サーバの設定ファイルに記述したモジュール(転送ファイルは、サーバ設定ファイルの "path=" に格納されます)
    

5.Appendix 参考リンク