AzureでFTPサーバを実装する場合の注意点

◆ Live配信スケジュール ◆
サイオステクノロジーでは、Microsoft MVPの武井による「わかりみの深いシリーズ」など、定期的なLive配信を行っています。
⇒ 詳細スケジュールはこちらから
⇒ 見逃してしまった方はYoutubeチャンネルをご覧ください
【4/18開催】VSCode Dev Containersで楽々開発環境構築祭り〜Python/Reactなどなど〜
Visual Studio Codeの拡張機能であるDev Containersを使ってReactとかPythonとかSpring Bootとかの開発環境をラクチンで構築する方法を紹介するイベントです。
https://tech-lab.connpass.com/event/311864/

こんにちはサイオステクノロジー山田です、今回はFTPを題材とした記事となります。
きっかけは案件で

・とあるサーバからファイルを取り出す必要がある
・しかし、とあるサーバはクライアントから直接アクセスされたくない
・なので、とあるサーバからFTPサーバにファイルを格納する
・クライアントはFTPサーバに格納されたファイルを取り出す

という要件があったため、FTPの調査しました。

FTP/FTPS/SFTPについて

ファイル転送プロトコルにはFTPと暗号化されたFTPSとSFTPがあります。各プロトコルについて、簡単にまとめてみました。ポート番号は標準値となっています。

プロトコル接続方式制御ポートデータ転送ポート暗号化
FTPACTIVE2120×
PASV21任意×
FTPSACTIVE2120TLS/SSL(Explicit)
ACTIVE99020TLS/SSL(Implicit)
PASV21任意TLS/SSL(Explicit)
PASV990任意TLS/SSL(Implicit)
SFTP22SSH

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_64

SSLサーバ証明書作成

本来であれば認証局が署名した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=NO

FTPS-ACTIVE-Implicitの場合

# データ転送ポート指定
connect_from_port_20=YES

# PASV無効化
pasv_enable=NO

# implicit有効化
implicit_ssl=YES

# 制御ポート番号指定
listen_port=990

FTPS-PASV-Explicitの場合

# PASVを有効化
pasv_enable=YES

# クライアントに通知するサーバアドレスを指定
pasv_address=[サーバアドレス]
pasv_addr_resolve=YES

# データ転送ポート指定
pasv_min_port=30000
pasv_max_port=30000

# implicit無効化
implicit_ssl=NO

FTPS-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サーバの中でもご紹介したように、いくつか通信方式がありますので、要件やクライアント環境やサーバ環境に併せて設計されては如何でしょうか。

サイオステクノロジー株式会社 山田

アバター画像
About 山田康裕 27 Articles
20代前半からLinux系OSSや認証基盤を中心とした提案/設計/構築を担当。特に仕事を選ばない、何でも屋さん。
ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

2人がこの投稿は役に立ったと言っています。


ご覧いただきありがとうございます。
ブログの最新情報はSNSでも発信しております。
ぜひTwitterのフォロー&Facebookページにいいねをお願い致します!



>> 雑誌等の執筆依頼を受付しております。
   ご希望の方はお気軽にお問い合わせください!

Be the first to comment

Leave a Reply

Your email address will not be published.


*


質問はこちら 閉じる