サービス概要
Transfer Familyは、SFTP、FTPS、FTP、AS2 プロトコルを使用して、AWS Storage サービスへの定期的なファイル転送を安全に行うファイル転送サービスです。
目的・やりたいこと
お客さんからTransfer Familyを使ってS3へのアップロード/ダウンロードしたい要望があったが、SFTPはともかく、はたしてFTP/FTPSに対しても無事意図通りのファイルのやり取りができるかどうか検証する。
対象者
- SFTP/FTPによってファイルをS3にアップロードしたい運用管理者
対象となる技術
- Transfer Family
- FTP/FTPS
- S3
条件
- Transfer Familyのサーバは作成済みとします
- 管理用EC2を使いたくない場合はADはManaged AD以外のAD(EC2)にしましょう。Transfer FamilyではADグループにS3フルアクセスを許可したTransfer用ロールを付与する必要があるのですが、ブラックボックスなManaged ADにしてしまうとグループ名がわからないため
- Managed ADでもこちらの方法やこちらの方法で管理用EC2を使うことで管理できます。
参考URL
- AWS Transfer Family を利用した FTP を触ってみた
- AWS Transfer Family for FTP(カスタムIDプロバイダー)を利用しFTPでS3へアクセスしてみる
- AWS Transfer Family のプロトコルをFTPS 、ユーザー管理をカスタム ID プロバイダーで構築してみた
注意事項
-
エンドポイントの選択時に、[パブリックアクセス可能]にしようとすると「パブリックエンドポイントタイプを使用するには、ステップ 1 で AS2、FTPS、および FTP を無効にします」と言われてしまい次に進めないため、FTP/FTPSを選択した場合は自動的に[VPCでホスト]しか選択肢がないことに注意
-
仮に[VPCでホスト]にしても、アクセスに[インターネット向け]を選ぶと「サーバーのエンドポイントは、VPC 内でのみホストできます (内部アクセスの場合のみ)。インターネット向け VPC エンドポイントタイプを使用するには、ステップ 1 で FTP を無効にします。」と言われてしまい次に進めないため、FTPを選択した場合は自動的に[内部]しか選択肢がないことに注意
つまり、FTPで直接外部から(インターネット経由で)エンドポイントを叩けないようになっているというワケ。まあそりゃそうか
前提条件(制約事項)
クライアントを使用してサーバーエンドポイント経由でファイルを転送する
- FTPSについては、明示モードのみがサポートされます。暗黙モードはサポートされません。
- FTP および FTPS では、パッシブモードのみがサポートされます。
- FTP および FTPS では、STREAM モードのみがサポートされます。
- FTP および FTPS では、イメージ/バイナリモードのみがサポートされます。
- FTP および FTPS の場合、データ接続の TLS-PROT C (非保護) TLS がデフォルトですが、PROT C は AWS Transfer Family プロトコルでサポートされません。そのため、FTPSの場合、データ操作を受け付けるにはPROT Pを発行する必要があります。
- サーバーのストレージに S3 を使用していて、クライアントに 1 回の転送で複数の接続を使用するオプションがある場合は、そのオプションを必ず無効にしてください。なお、ストレージのバックエンドにEFSを使用している場合、EFSは1回の転送に複数の接続をサポートしています。
ちなみに、現在FTPではクライアント側からデータ転送用のコネクションを繋ぐパッシブモードが主流です。
作業の流れ
概要図
事前作業
- Transfer Familyのサーバは作成してオンライン済みとします。
1. Powershell を開いて次のコマンドを実行して、admin2グループの SID を確認
> Get-ADGroup -Filter {samAccountName -like "admin2*"} -Properties * | Select SamAccountName,ObjectSid
SamAccountName ObjectSid
-------------- ---------
admin2 S-1-5-21-1393767525-1197825293-1881432246-1112
2.Transfer用にS2FullAccessを付与したロールを作成
2.作成したFTPサーバーでは以下の表示が出るはずなので、[アクセスの追加]
3.1.のSIDと、2.のロールを付与して[追加]
4.テスト、以下のような応答が返れば成功
5.VPCエンドポイントが作成されていることを確認
この「vpce-0a931405e5c6f5afb-p4v2rhey.vpce-svc-0cee93c75e789f90b.ap-northeast-1.vpce.amazonaws.com」というDNSでアクセスします。ちなみにこのDNS名はプライベートアドレスに名前解決されます。
検証手順
ここではLinuxアクセスによるFTPアップロード検証は割愛し、WindowsからWinSCPを使用してS3にアクセスする前提とします。
1.Transfer Family(FTP)は直接アクセスできないため、まずは同一サブネットにある踏み台Windowsにログオン
2.WinSCPを立ち上げ、以下のように入力
ホスト名:VPCエンドポイントのDNS名
(ちなみにVPCエンドポイントは2つに冗長化されているのだが、DNS名が3つもあるのはなぜだろう?)
ユーザー名:ADユーザー名
パスワード:ADパスワード
暗号化:暗号化なしのFTPとします
3.すると次のようにS3バケットにつながり、無事成功。ファイルのやり取りもできました。
4.ちなみにここでもしパッシブモードをオフにしたらどうなるでしょう?
5.リモートディレクトリの読み込み中にリスト取得エラーとなりました。ここはやはり仕様のとおり
7.接続中のまま進まなくなり、やがてタイムアウトしました。これも仕様通り
8.では逆に[明示的なTLS/SSL暗号化]すなわちFTPSにしてみると?
これもすんなり接続できました。でも自己署名証明書などを使っていると警告が出ることもあるみたい
所要時間
1時間
追加検証(FTPの代わりにFTPSを使うなら?)
注意事項で、[VPCでホスト][インターネット向け]を選ぶにはFTPを無効にするしかないと述べましたが、ではFTPを無効にしてFTPSにすれば[インターネット向け]にできるのでは?ということでやってみます。
冗長化構成にするとなんとEIPを2つも使ってしまうというじゃぶじゃぶな贅沢な使い方になります。
それでいて、カスタムホスト名のところを[その他のDNS]ではなく、[Route 53 DNSエイリアス]にすると、
作成時にホスト名にリンクが貼られ、
そのリンク先に飛ぶと、このようなTransfer Familyのエンドポイントを値としたCNAMEレコードが自動生成されてます!
さていよいよ自PCのMacで外部からこのFTPSサーバーに着信させるわけですが、その前に一つ大事なポイントがあります。
初外部着信のため、21番のセキュリティグループを外部に公開(許可)する!
これを忘れていたがゆえにしばらくハマってしまったため、忘れないようにしましょう。
また、それでもログインまでいくものの、どうしてもディレクトリリストの取得中...で止まってしまっていた。セキュリティグループを全開放するとこれが進展することから、Mac側にWireSharkを入れてどんなポートでFTPサーバーとやりとりしているか見てみました。すると21番はもちろん、8192〜8199番くらいのランダムなポートでサーバに繋ぎに行ってることに気付きました。
それもそのはず、こちらの仕様にちゃんと注記されてるじゃないですか!
トランスファーファミリーのFTPサーバーは、ポート21(コントロールチャネル)とポート範囲8192~8200(データチャネル)で動作します。
この状態でいよいよMacのFileZillaにてログイン試行!
(ポートは毎回21とか指定しなくても勝手に21番ポートで接続しに行ってるようです)
するとこのようなメッセージが表示され、右側にS3バケット一覧が見れれば成功です!
というわけで、FTPSにした場合はTransfer Familyエンドポイントをインターネット向けとして設置でき、外部から直接接続できるというわけです。