16.2. FTP

ファイル転送プロトコル (FTP) は、今日インターネット上で見られる、最も古く、一般的に使用されているプロトコルです。この目的は、ユーザーがリモートホストに直接ログインしなくても、もしくはリモートシステムの使用法についての知識がなくとも、ネットワーク上のコンピューターホスト間で確実にファイルを転送することです。これにより、ユーザーは、標準の簡単なコマンドセットを使用してリモートシステム上のファイルにアクセスすることができます。
本セクションでは、FTP プロトコルの基本および Red Hat Enterprise Linux で推奨される FTP サーバーの vsftpd について概説します。

16.2.1. ファイル転送プロトコル (FTP)

FTP は、クライアント/サーバーアーキテクチャーを使用し、TCP ネットワークプロトコルを使用してファイルを転送します。FTP は古いプロトコルであることから、暗号化されていないユーザー名とパスワード認証を使用します。このため、安全でないプロトコルとみなされており、絶対的に必要でない限り、使用するべきではありません。しかし、FTP はインターネット上で非常に普及しているので、共有ファイルの公開で必要となる場合がよくあります。このため、システム管理者は、FTP プロトコルの特性を認識しておくべきです。
本セクションでは、vsftpd を設定して TLS による安全を確保する接続の確立方法と、SELinux を用いて FTP サーバーを安全にする方法を説明しています。FTP の代用となるのは、OpenSSH スイートからの sftp です。OpenSSH の設定方法および SSH プロトコル全般に関する情報は、12章OpenSSH を参照してください。
インターネット上で使用されているほとんどのプロトコルとは異なり、FTP が正しく機能するためには複数のネットワークポートを必要とします。FTP クライアントアプリケーションが FTP サーバーへの接続を開始する際に、コマンドポート として知られるポート 21 をサーバー上で開きます。このポートは、すべてのコマンドをサーバーに発行するために使用されます。サーバーから要求されたデータはいずれも データポート を介してクライアントに返されます。データ接続が開始されるデータ接続用ポートの番号は、クライアントが アクティブパッシブ のモードでデータを要求するかによって異なります。
これらのモードの定義は以下のとおりです。
アクティブモード
アクティブモードは、FTP プロトコルでクライアントへのデータ転送に使用される独自の方法です。FTP クライアントがアクティブモードのデータ転送を開始すると、サーバーは、サーバー上のポート 20 からクライアントの指定する IP アドレスと、ランダムで権限のないポート (1024 以上) への接続を開きます。この方法では、クライアントマシンがポート 1024 以上での接続を受け入れるように許可されている必要があります。インターネットのようなセキュリティー保護されていないネットワークが増加するにともない、ファイアウォールを使用したクライアントマシンの保護が普及しています。このようなクライアント側のファイアウォールは、アクティブモードの FTP サーバーから着信する接続を拒否する場合が多いため、パッシブモードが考案されました。
パッシブモード
パッシブモードはアクティブモードと同様に、FTP クライアントアプリケーションによって開始されます。サーバーからのデータを要求する際に、FTP クライアントはパッシブモードでデータにアクセスしたいことを知らせると、サーバーはサーバー上の IP アドレスとランダムな非特権ポート (1024 以上) を提供します。クライアントは、サーバー上のそのポートに接続して要求した情報をダウンロードします。
パッシブモードは、クライアント側のファイアウォールによるデータ接続障害の問題を解決しますが、サーバー側のファイアウォール管理を複雑化させてしまう場合があります。FTP サーバー上の特権のないポートの範囲を制限することにより、サーバー上で開いておりポート数を減らすことができます。またこの方法により、サーバーを対象としたファイアウォールのルール設定の手順が簡略化されます。

16.2.2. vsftpd サーバー

vsftpd (Very Secure FTP Daemon) は、高速で安定性があり、(より重要なのは) セキュアであるようにゼロから設計されています。vsftpd は、多数の接続を効率的かつセキュアに処理できる能力があることから、Red Hat Enterprise Linux に標準装備されている、唯一のスタンドアロン型 FTP サーバーです。
vsftpd で使用されるセキュリティーモデルには、以下に挙げる 3 つの主要な側面があります。
  • 特権プロセスと非特権プロセスの確固たる分離: 別個のプロセスが異なるタスクを処理します。各プロセスは、そのタスクに必要な最低限の権限で稼働します。
  • 高い権限を必要とするタスクを、必要最小限の権限を伴うプロセスで処理: libcap ライブラリー内にある互換性を利用して、通常は完全な root 権限を必要とするタスクを、権限が低いプロセスでより安全に実行できます。
  • ほとんどのプロセスを chroot jail で実行: 可能な場合は常に、プロセスは、ルートディレクトリーを共有ディレクトリーに変更します。すると、このディレクトリーは chroot jail と見なされます。たとえば、ディレクトリー /var/ftp/ がプライマリー共有ディレクトリーの場合、vsftpd/var/ftp// として知られる、新規 root ディレクトリーに再度割り当てます。これにより、新たな root ディレクトリー下に格納されていないディレクトリーに対する、ハッカーの潜在的な悪質行為を行うことができなくなります。
これらのセキュリティープラクティスを使用すると、vsftpd によるリクエスト対応方法に以下のような影響があります。
  • 親プロセスは、必要最小限の権限で稼働: 親プロセスは、リスクレベルを最低限に抑えるために必要とされる権限のレベルを動的に算出します。子プロセスは、FTP クライアントとの直接的なインタラクションを処理し、可能な限り権限なしに近い形で稼働します。
  • 高い権限を必要とするオペレーションはすべて、小さな親プロセスによって処理: Apache HTTP Server の場合とほぼ同様に、vsftpd は権限のない子プロセスを起動し、着信接続を処理します。これにより、権限のある親プロセスを最小限に抑えられ、比較的少ないタスクを処理することになります。
  • 親プロセスは、権限のない子プロセスからのリクエストはどれも信頼しない: 子プロセスとの通信はソケット上で受信し、子プロセスからの情報の有効性は動作を実施する前に確認されます。
  • FTP クライアントとのインタラクションの大半は、chroot jail 内の権限のない子プロセスによって処理: これらの子プロセスには権限がなく、共有ディレクトリーへのアクセスしかないため、プロセスがクラッシュした際に攻撃者がアクセスできるのは共有ファイルのみです。

16.2.2.1. vsftpd の起動と停止

現行のセッションで vsftpd サービスを起動するには、シェルプロンプトで root として以下を入力します。
~]# systemctl start vsftpd.service
現在のセッションでサービスを停止するには、root で以下を入力します。
~]# systemctl stop vsftpd.service
vsftpd サービスを再起動するには、root で以下のコマンドを実行します。
~]# systemctl restart vsftpd.service
このコマンドで vsftpd サービスを停止させた直後に再起動します。これが、FTP サーバーの設定ファイルを編集した後に変更を反映させる最も効率的な方法になります。もしくは、vsftpd サービスが実行中の場合に限り、以下のコマンドを使用して再起動できます。
~]# systemctl try-restart vsftpd.service
デフォルトでは、vsftpd サービスがブート時に自動的に起動することは ありません。ブート時に vsftpd サービスが起動するようにするには、root でシェルプロンプトに以下を入力します。
~]# systemctl enable vsftpd.service
Created symlink from /etc/systemd/system/multi-user.target.wants/vsftpd.service to /usr/lib/systemd/system/vsftpd.service.
Red Hat Enterprise Linux 7 でシステムサービスを管理する詳細情報は、10章systemd によるサービス管理 を参照してください。

16.2.2.2. vsftpd の複数コピーの起動

1 台のコンピューターを複数の FTP ドメインに使用する場合があります。これは、マルチホーミング と呼ばれるテクニックです。vsftpd を使用してマルチホーミングを行う方法の 1 つに、デーモンの複数コピーを実行し、各コピーに設定ファイルを与える方法があります。
これを行うには、最初に、関連するすべての IP アドレスをシステム上のネットワークデバイスまたはエイリアスネットワークデバイスに割り当てます。ネットワークデバイス、デバイスエイリアスの設定と、ネットワーク設定スクリプトの詳細は、『Red Hat Enterprise Linux 7 ネットワークガイド』を参照してください。
次に、FTP ドメイン用の DNS サーバーが適切なマシンを参照するように設定する必要があります。Red Hat Enterprise Linux で使用される DNS プロトコル実装である BIND およびその設定ファイルの情報は、『Red Hat Enterprise Linux 7 ネットワークガイド』を参照してください。
vsftpd が異なる IP アドレスにおけるリクエストに応答するには、デーモンの複数コピーが実行中である必要があります。vsftpdデーモンの複数インスタンスの起動を促進するために、特別な systemd サービスユニット (vsftpd@.service) が vsftpd 起動用にインスタンス化されたサービスとして vsftpd パッケージ内で提供されています。
このサービスユニットを活用するには、FTP サーバーで必要な各インスタンスの個別の vsftpd 設定ファイルを作成し、それを /etc/vsftpd/ ディレクトリーに格納する必要があります。これらの設定ファイルは、(/etc/vsftpd/vsftpd-site-2.conf などの) 一意の名前を持ち、root ユーザーのみが読み取り、書き込み可能とする必要があることに注意してください。
IPv4 ネットワーク上で待機している各 FTP サーバーの設定ファイル内で、以下のディレクティブは一意のものである必要があります。
listen_address=N.N.N.N
N.N.N.N を、使用中の FTP サイト用の一意の IP アドレスに置き換えます。このサイトが IPv6 を使用している場合は、代わりに listen_address6 ディレクティブを使用してください。
複数の設定ファイルを /etc/vsftpd/ ディレクトリーに格納しておけば、vsftpd デーモンの個別インスタンスは、root で以下のコマンドを実行すると開始できます。
~]# systemctl start vsftpd@configuration-file-name.service
上記のコマンドで、configuration-file-name を、vsftpd-site-2 などの、要求しているサーバーの設定ファイルの一意の名前に置き換えます。設定ファイルの .conf 拡張子は、コマンドに含めないことに注意してください。
vsftpd デーモンの複数インスタンスを同時に開始する場合は、systemd ターゲットユニットファイル (vsftpd.target) を活用することができます。これは、vsftpd パッケージで提供されています。この systemd ターゲットにより、個別の vsftpd デーモンが /etc/vsftpd/ ディレクトリー内で利用可能な vsftpd 設定ファイルごとに起動します。ターゲットを有効にするには、root で以下のコマンドを実行します。
~]# systemctl enable vsftpd.target
Created symlink from /etc/systemd/system/multi-user.target.wants/vsftpd.target to /usr/lib/systemd/system/vsftpd.target.
上記のコマンドは、システムの起動時に、systemd サービスマネージャーが vsftpd サービスを (設定済みの vsftpd サーバーインスタンスとともに) 起動するように設定します。システムを再起動することなく、サービスをすぐに開始するには、root で以下のコマンドを実行します。
~]# systemctl start vsftpd.target
systemd ターゲットを使用してサービスを管理する方法は、「systemd ターゲットでの作業」 を参照してください。
サーバーごとに変更するディレクティブには、以下のものがあります。
  • anon_root
  • local_root
  • vsftpd_log_file
  • xferlog_file

16.2.2.3. TLS を使用した vsftpd 接続の暗号化

ユーザー名、パスワード、およびデータを暗号化せずに送信する FTP の従来の不安定な性質に対抗するために、vsftpd デーモンは TLS プロトコルを使用して接続を認証し、すべての送信を暗号化するように設定できます。TLS をサポートする FTP クライアントは、TLS が有効になっている vsftpd と通信する必要があることに注意してください。

注記

SSL (Secure Sockets Layer) は、セキュリティープロトコルの古い実装の名前です。新規のバージョンは TLS (Transport Layer Security) と呼ばれています。SSL にはセキュリティーに関する深刻な脆弱性があるため、新規のバージョン (TLS) のみを使用してください。vsftpd サーバーに付随するドキュメントや vsftpd.conf ファイルで使用される設定ディレクティブでは、セキュリティー関連の項目を参照する際に SSL の名前を使用しますが、ssl_enable ディレクティブを YES に設定している場合は TLS がデフォルトでサポートされ、使用されます。
TLS サポートを有効にするには、vsftpd.conf ファイル内の ssl_enable 設定ディレクティブを YES に設定します。その他の TLS 関連ディレクティブのデフォルト設定は、ssl_enable オプションが有効になると自動的にアクティブになり、適切に設定された TLS 設定を提供します。たとえば、全接続に TLS v1 プロトコルの使用を必須とする (安全でない SSL プロトコルバージョンはデフォルトで無効になります) ことや、非匿名の全ログインでパスワードおよびデータ送信での TLS の使用を強制することなどです。

例16.14 TLS を使用するように vsftpd の設定

以下の例では、設定ディレクティブは vsftpd.conf ファイルでセキュリティープロトコルの古い SSL バージョンを明示的に無効にします。
ssl_enable=YES
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
設定を変更したら、vsftpd サービスを再起動します。
~]# systemctl restart vsftpd.service
vsftpd での TLS 使用を調整する TLS 関連の接続ディレクティブは、man ページの vsftpd.conf(5) を参照してください。

16.2.2.4. vsftpd 用の SELinux ポリシー

(他の ftpd プロセスと共に) vsftpd デーモンを管理する SELinux ポリシーは、強制アクセス制御を定義します。これはデフォルトでは、必要最小限のアクセスに基づいています。FTP デーモンが特定のファイルやディレクトリーにアクセスできるようにするには、それらに適切なラベルを割り当てる必要があります。
たとえば、ファイルを匿名で共有できるようにするには、共有するファイルおよびディレクトリーに public_content_t ラベルを割り当てる必要があります。chcon コマンドを root で使用すると、これが可能になります。
~]# chcon -R -t public_content_t /path/to/directory
上記のコマンドでは、/path/to/directory を、ラベルを割り当てるディレクトリーへのパスに置き換えます。同様に、ファイルをアップロードするためのディレクトリーを設定するには、public_content_rw_t ラベルをそのディレクトリーに割り当てる必要があります。さらに、allow_ftpd_anon_write SELinux ブール値オプションを 1 に設定する必要があります。以下のように、setsebool コマンドを root で実行します。
~]# setsebool -P allow_ftpd_anon_write=1
ローカルユーザーが FTP 経由で自分のホームディレクトリーにアクセスできるようにしたい場合 (Red Hat Enterprise Linux 7 ではこれがデフォルト設定)、ftp_home_dir のブール値オプションを 1 に設定する必要があります。vsftpd がスタンドアロンモードで実行できるようになっていると (これも Red Hat Enterprise Linux 7 でデフォルトで有効になっています)、ftpd_is_daemon オプションも 1 に設定する必要があります。
他の有用なラベルやブール値オプションの例や FTP に関する SELinux ポリシーの設定方法の詳細情報は、man ページの ftpd_selinux(8) を参照してください。SELinux 全般に関する詳細情報は、『Red Hat Enterprise Linux 7 SELinux ユーザーおよび管理者のガイド』も併せて参照してください。

16.2.3. 関連資料

vsftpd の詳細情報は、以下の参考資料をご覧ください。

16.2.3.1. インストールされているドキュメント

  • /usr/share/doc/vsftpd-version-number/ ディレクトリー: version-number を、インストールした vsftpd パッケージのバージョンに置き換えます。このディレクトリーには、ソフトウェアの基本情報を記載した README ファイルが格納されています。TUNING ファイルには基本的なパフォーマンス調整のヒント、そして SECURITY/ ディレクトリーにはvsftpd で使用されているセキュリティーモデルに関する情報が含まれています。
  • vsftpd 関連の man ページ: デーモンおよび設定ファイルに関する man ページは多数あります。以下は、その中でも重要な man ページです。
    サーバーアプリケーション
    • vsftpd(8): vsftpd で利用可能なコマンドラインオプションを説明しています。
    設定ファイル
    • vsftpd.conf(5): vsftpd の設定ファイル内で利用可能なオプションの詳細な一覧を格納しています。
    • hosts_access(5): hosts.allow および hosts.denyTCP ラッパーの設定ファイルで利用可能なフォーマットとオプションを説明します。
    SELinux とのインタラクション
    • ftpd_selinux(8): ftpd プロセスを管理する SELinux ポリシーと、SELinux ラベルの割り当て方法、およびブール値セットが説明されています。

16.2.3.2. オンラインのドキュメント

vsftpd および FTP 全般について
  • http://vsftpd.beasts.org/: vsftpd プロジェクトページは、最新のドキュメントやソフトウェアの作成者の連絡先を入手することができる便利なサイトです。
  • http://slacksite.com/other/ftp.html: この Web サイトは、FTP のアクティブモードとパッシブモードの相異点について簡潔に説明しています。
Red Hat Enterprise Linux のドキュメンテーション
  • Red Hat Enterprise Linux 7 ネットワークガイド: Red Hat Enterprise Linux 7 の 『ネットワークガイド』 では、このシステムにおけるネットワークインターフェース、ネットワーク、ネットワークサービスの設定および管理に関する情報を説明しています。hostnamectl ユーティリティーの概要のほか、これを使用してコマンドラインでホスト名を表示したり、設定する方法を説明しています。
  • Red Hat Enterprise Linux 7 SELinux ユーザーおよび管理者のガイド: Red Hat Enterprise Linux 7 の 『SELinux ユーザーおよび管理者のガイド』 では、SELinux の基本原則と、SELinuxApache HTTP ServerPostfixPostgreSQLOpenShift などの様々なサービスで設定して使用する方法を詳細を説明しています。また、systemd が管理するシステムサービス用に SELinux アクセスパーミッションを設定する方法も説明しています。
  • Red Hat Enterprise Linux 7 セキュリティガイド - Red Hat Enterprise Linux 7 の 『セキュリティガイド』 は、ユーザーおよび管理者が、ローカルおよびリモートからの侵入、悪用、悪意のある行為に対してワークステーションおよびサーバーを保護するプロセスとプラクティスを学習する際に役に立ちます。また、重大なシステムサービスを保護する方法についても説明しています。
関連 RFC ドキュメント
  • RFC 0959: IETF からの FTP プロトコルのオリジナルの Request for Comments (RFC)。
  • RFC 1123: 短い FTP 関連のセクションで、RFC 0959 を拡張、明確化します。
  • RFC 2228: FTP セキュリティー拡張。vsftpdTLS 接続および SSL 接続のサポートに必要な小規模のサブセットを実装します。
  • RFC 2389: FEAT コマンドおよび OPTS コマンドを指定します。
  • RFC 2428: IPv6 サポート。