Show Table of Contents
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 (The Very Secure FTP Daemon) は、高速で安定性があり、(より重要なのは) セキュアであるようにゼロから設計されています。vsftpd は、多数の接続を効率的かつセキュアに処理できる能力があることから、Red Hat Enterprise Linux に標準装備されている、唯一のスタンドアロン型 FTP サーバーです。
vsftpd で使用されるセキュリティーモデルには、以下に挙げる 3 つの主要な側面があります。
- 特権プロセスと非特権プロセスの確固たる分離 — 別個のプロセスが異なるタスクを処理します。各プロセスは、タスクに必要な最低限の権限で稼働します。
- 高い権限を必要とするタスクを、必要最小限の権限を伴うプロセスで処理 —
libcapライブラリ内にある互換性を利用して、通常は完全な root 権限を必要とするタスクを、権限が低いプロセスでより安全に実行することができます。 - ほとんどのプロセスを
chrootjail で実行 — 可能な場合は常に、プロセスは共有ディレクトリーにルートディレクトリーを変更します。すると、このディレクトリーはchrootjail と見なされます。たとえば、ディレクトリー/var/ftp/がプライマリー共有ディレクトリーの場合、vsftpdは/var/ftp/を/として知られる、新規 root ディレクトリーに再度割り当てます。これにより、新たな root ディレクトリー下に格納されていないディレクトリーに対する、潜在的な悪質ハッカー行為を行うことができなくなります。
これらのセキュリティープラクティスを使用すると、
vsftpd によるリクエスト対応方法に以下のような影響があります。
- 親プロセスは、必要最小限の権限で稼働します — 親プロセスは、リスクレベルを最低限に抑えるために必要とされる権限のレベルを動的に算出します。子プロセスは、
FTPクライアントとの直接的なインタラクションを処理し、可能な限り権限なしに近い形で稼働します。 - 高い権限を必要とするオペレーションはすべて、小さな親プロセスによって処理されます — Apache
HTTPServer の場合とほぼ同様に、vsftpdは権限のない子プロセスを起動し、着信接続を処理します。これにより、権限のある親プロセスを最小限に抑えられ、比較的少ないタスクを処理することになります。 - 親プロセスは、権限のない子プロセスからのリクエストはどれも信頼しません — 子プロセスとの通信はソケット上で受信され、子プロセスからの情報の有効性は動作を実施する前にチェックされます。
FTPクライアントとのインタラクションの大半は、chrootjail 内の権限のない子プロセスによって処理されます — これらの子プロセスには権限がなく、共有ディレクトリーへのアクセスしかないため、プロセスがクラッシュした際に攻撃者がアクセスできるのは共有ファイルのみです。
16.2.2.1. vsftpd の起動と停止
現行のセッションで
vsftpd サービスを起動するには、シェルプロンプトで root として以下を入力します。
~]# systemctl start vsftpd.service
現在のセッションでサービスを停止するには、
root で以下を入力します。
~]# systemctl stop vsftpd.servicevsftpd サービスを再起動するには、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_rootlocal_rootvsftpd_log_filexferlog_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 の名前を使用しますが、TLS は、ssl_enable ディレクティブが YES に設定される場合はデフォルトでサポートされ、使用されます。
TLS サポートを有効にするには、vsftpd.conf ファイル内の ssl_enable 設定ディレクティブを YES に設定します。ssl_enable オプションが有効になると自動的にアクティブになる他の TLS 関連のディレクティブのデフォルト設定では、適切な 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.servicevsftpd での TLS の使用の微調整についての TLS 関連の接続ディレクティブは、vsftpd.conf(5) の man ページを参照してください。
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 ポリシーの設定方法についての詳細情報は、ftpd_selinux(8) man ページを参照してください。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.denyのTCPラッパーの設定ファイル内で利用可能なフォーマットとオプションについて説明しています。
- 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 の原則と、SELinux を Apache HTTP Server や Postfix、PostgreSQL、または OpenShift などの様々なサービスで設定して使用する方法が詳細に説明されています。また、SELinux アクセスパーミッションを
systemdが管理するシステムサービス用に設定する方法も説明しています。 - Red Hat Enterprise Linux 7 Security Guide — Red Hat Enterprise Linux 7 の 『セキュリティガイド』 は、ローカルおよびリモートからの侵入、悪用、悪意のある行為に対してワークステーションおよびサーバーを保護するプロセスとプラクティスを学習する際にユーザーおよび管理の役に立ちます。また、重大なシステムサービスを保護する方法についても説明しています。
- 関連 RFC ドキュメント
- 『RFC 0959』 — IETF からの
FTPプロトコルのオリジナルの Request for Comments (RFC)。 - 『RFC 1123』 — 短い
FTP関連のセクションで、RFC 0959 を拡張、明確化します。 - 『RFC 2428』 —
IPv6サポート。

Where did the comment section go?
Red Hat's documentation publication system recently went through an upgrade to enable speedier, more mobile-friendly content. We decided to re-evaluate our commenting platform to ensure that it meets your expectations and serves as an optimal feedback mechanism. During this redesign, we invite your input on providing feedback on Red Hat documentation via the discussion platform.