こんにちはサイオステクノロジー山田です、今回はFTPを題材とした記事となります。
きっかけは案件で
・とあるサーバからファイルを取り出す必要がある
・しかし、とあるサーバはクライアントから直接アクセスされたくない
・なので、とあるサーバからFTPサーバにファイルを格納する
・クライアントはFTPサーバに格納されたファイルを取り出す
という要件があったため、FTPの調査しました。
FTP/FTPS/SFTPについて
ファイル転送プロトコルにはFTPと暗号化されたFTPSとSFTPがあります。各プロトコルについて、簡単にまとめてみました。ポート番号は標準値となっています。
プロトコル | 接続方式 | 制御ポート | データ転送ポート | 暗号化 |
FTP | ACTIVE | 21 | 20 | × |
PASV | 21 | 任意 | × | |
FTPS | ACTIVE | 21 | 20 | TLS/SSL(Explicit) |
ACTIVE | 990 | 20 | TLS/SSL(Implicit) | |
PASV | 21 | 任意 | TLS/SSL(Explicit) | |
PASV | 990 | 任意 | TLS/SSL(Implicit) | |
SFTP | – | 22 | SSH |
FTP(File Transfer Protocol)
ファイル転送を行うプロトコル。制御通信とデータ転送通信でポートが異なります。
認証パスワードや転送データも全て平文で通信されるためセキュリティ面は無いに等しいです。
FTPS(File Transfer Protocol over SSL/TLS)
方式自体はFTPとほぼ変わりませんが、通信部分をSSL/TLSで暗号化している方式。
SFTP(SSH File Transfer Protocol)
SSHで通信全体を暗号化した上で、FTPでやりとりする方式。
SCPが利用できる環境であれば実装は簡単です。
ACTIVE(アクティブ)
制御通信時にクライアントがサーバに対して、自分のIPアドレスとデータ転送ポートを通知し、サーバからクライアントへデータ転送を行う方式。
PASV(パッシブ)
制御通信時にサーバがクライアントに対して、自分のIPアドレスとデータ転送ポートを通知し、クライアントからサーバへデータ転送を行う方式。
Explicit(明示的な TLS/SSL 暗号化)
FTPサーバに接続後、クライアントからAUTHコマンドが発行されることで暗号化を開始する方式。
AUTHコマンドが発行される前までは傍受可能ですが、有益な情報は無いに等しいです。
FTP over Explicit SSL/TLS (FTPES)とも呼ばれる。
Implicit(暗黙の TLS/SSL 暗号化)
FTPサーバに接続した時点で暗号化を開始する方式。
FTP over Implicit SSL/TLS (FTPIS)とも呼ばれる。
AzureでのFTPサーバ実装について
AzureでFTPサーバ実装する場合の注意として、パブリックIPアドレスを介してFTPサーバを公開する場合、ACTIVE方式は利用できない場合が多いです。
理由としては、クライアントから通知されるIPアドレスとデータ転送ポートはTCPセグメントのヘッダ部ではなく、データ部に情報が入っており、通常はプライベートIPアドレスが通知されることが多いため、NAT変換が行えず、クライアントへの接続に失敗してしまうからです。
よって、Azureが悪いのでは無く、一般的なNAT変換が原因となります。
PASV方式は、サーバ側でパブリックIPアドレスを通知するように指定できるため、問題は発生しません。
もし、どうしてもACTIVE方式を利用したい場合は、以下のいずれかを実施する必要があります。
①プライベートIPアドレスで完結する環境で構築する
②通知情報を指定できるクライアントソフトウェア(FileZillaなど)を利用し、パブリックIPアドレスとデータ転送ポートを通知するようにする
③クライアント側でデータ部のプライベートIPアドレスをパブリックIPアドレスに書換えることが出来るNATルータを利用する
ACTIVE方式はおすすめしていない?
vsftpでACTIVE方式を実装した際、通信ログに「PASV方式の利用を検討してください」と出力されます。
FTPサーバとしてもあまりACTIVE方式はおすすめできないということでしょうか。
200 PORT command successful. Consider using PASV.FTPSサーバ構築
Azure上にFTPサーバを構築する場合、セキュアなFTPSサーバを構築することが多い考えられるため、vsftpを利用した構築方法を簡単にご紹介します。
もし、外部に公開する場合は、受信セキュリティ規則に「制御ポート番号」と「データ転送ポート番号」の許可を追加してください。仮想マシン構成
【インスタンスサイズ】
A2 Basic (Core:2/RAM:3.5GB)【OS】
CentOS release 7.3 x86_64SSLサーバ証明書作成
本来であれば認証局が署名したSSLサーバ証明書を利用するのが最も良いのですが、今回は自己証明書を作成します。
# 自己証明書作成 # openssl req -x509 -nodes -newkey rsa:2048 -days 3650 -keyout /etc/pki/tls/certs/vsftpd.pem -out /etc/pki/tls/certs/vsftpd.pem # 証明書と秘密鍵の内容が記載されていることを確認 # cat /etc/pki/tls/certs/vsftpd.pemインストールと初期設定
# yum install vsftpd # cp -p /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.orig # vi /etc/vsftpd/vsftpd.conf# 匿名ユーザ無効化 anonymous_enable=NO # ローカルユーザ有効化 local_enable=YES # 書込み許可 write_enable=YES # 通信詳細をログ出力有効化 xferlog_enable=YES # xferlogフォーマット形式を無効化 xferlog_std_format=NO # ASCII転送有効化 ascii_upload_enable=YES ascii_download_enable=YES # chroot有効化 chroot_local_user=YES # IPv4有効化 listen=YES # chroot先での書込み許可 allow_writeable_chroot=YES # ローカルタイムを利用 use_localtime=YES # ドットファイルをデフォルトで表示 force_dot_files=YES # SSL有効化 ssl_enable=YES # SSLサーバ証明書 rsa_cert_file=/etc/pki/tls/certs/vsftpd.pem # POODLE対応 ssl_sslv2=NO ssl_sslv3=NO ssl_tlsv1=YES # 強制的にSSL接続 #force_local_data_ssl=YES #force_local_logins_ssl=YES以下に各方式の実装に必要な設定を紹介します。
FTPS-ACTIVE-Explicitの場合
# データ転送ポート番号指定 connect_from_port_20=YES # PASV無効化 pasv_enable=NO # implicit無効化 implicit_ssl=NOFTPS-ACTIVE-Implicitの場合
# データ転送ポート指定 connect_from_port_20=YES # PASV無効化 pasv_enable=NO # implicit有効化 implicit_ssl=YES # 制御ポート番号指定 listen_port=990FTPS-PASV-Explicitの場合
# PASVを有効化 pasv_enable=YES # クライアントに通知するサーバアドレスを指定 pasv_address=[サーバアドレス] pasv_addr_resolve=YES # データ転送ポート指定 pasv_min_port=30000 pasv_max_port=30000 # implicit無効化 implicit_ssl=NOFTPS-PASV-Implicitの場合
# PASVを有効化 pasv_enable=YES # クライアントに通知するサーバアドレスを指定 pasv_address=[サーバアドレス] pasv_addr_resolve=YES # データ転送ポート指定 pasv_min_port=30000 pasv_max_port=30000 # implicit有効化 implicit_ssl=YES # 制御ポート番号指定 listen_port=990起動
FTPSサーバを起動します。
また、OS起動時に自動起動するように設定します。# systemctl start vsftpd # systemctl enable vsftpdまとめ
ご紹介したようにFTPサーバといえども、様々な方式があることがわかりました。
Azureの様なパブリッククラウドでは、非セキュアなFTPサーバでは無く、セキュアなFTPSサーバを構築することが多いかと思われます。
またFTPSサーバの中でもご紹介したように、いくつか通信方式がありますので、要件やクライアント環境やサーバ環境に併せて設計されては如何でしょうか。サイオステクノロジー株式会社 山田