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 をサーバー上で開きます。このポートは、すべてのコマンドをサーバーに発行するために使用されます。サーバーから要求されたデータはいずれも データポート を介してクライアントに返されます。データ接続が開始されるデータ接続用ポートの番号は、クライアントが active または passive のモードでデータを要求するかによって異なります。
これらのモードの定義は以下のとおりです。
- アクティブモード
-
アクティブモードは、
FTP
プロトコルでクライアントへのデータ転送に使用される独自の方法です。FTP
クライアントがアクティブモードのデータ転送を開始すると、サーバーは、サーバー上のポート 20 からクライアントの指定するIP
アドレスと、ランダムで権限のないポート (1024 以上) への接続を開きます。この方法では、クライアントマシンがポート 1024 以上での接続を受け入れるように許可されている必要があります。インターネットのようなセキュリティー保護されていないネットワークが増加するにともない、ファイアウォールを使用したクライアントマシンの保護が普及しています。このようなクライアント側のファイアウォールは、アクティブモードのFTP
サーバーから着信する接続を拒否する場合が多いため、パッシブモードが考案されました。 - パッシブモード
パッシブモードはアクティブモードと同様に、
FTP
クライアントアプリケーションによって開始されます。サーバーからのデータを要求する際に、FTP
クライアントはパッシブモードでデータにアクセスしたいことを知らせると、サーバーはサーバー上のIP
アドレスとランダムな非特権ポート (1024 以上) を提供します。クライアントは、サーバー上のそのポートに接続して要求した情報をダウンロードします。パッシブモードは、クライアント側のファイアウォールによるデータ接続障害の問題を解決しますが、サーバー側のファイアウォール管理を複雑化させてしまう場合があります。
FTP
サーバー上の特権のないポートの範囲を制限することにより、サーバー上で開いておりポート数を減らすことができます。またこの方法により、サーバーを対象としたファイアウォールのルール設定の手順が簡略化されます。
16.2.2. vsftpd サーバー
Very Secure FTP Daemon (vsftpd
) は、高速で安定性があり、また重要な点として安全性を確保するため、土台から設計されています。vsftpd
は、多数の接続を効率的かつ安全に処理できるため、Red Hat Enterprise Linux とともに配布されるのはスタンドアロン FTP
サーバーのみです。
vsftpd
で使用されるセキュリティーモデルには、以下に挙げる 3 つの主要な側面があります。
- 特権プロセスと非特権プロセスの確固たる分離: 別個のプロセスが異なるタスクを処理します。各プロセスは、そのタスクに必要な最低限の権限で稼働します。
-
高い権限を必要とするタスクを、必要最小限の権限を伴うプロセスで処理:
libcap
ライブラリー内にある互換性を利用して、通常は完全な root 権限を必要とするタスクを、権限が低いプロセスでより安全に実行できます。 -
ほとんどのプロセスを
chroot
jail で実行: 可能な場合は常に、プロセスは、ルートディレクトリーを共有ディレクトリーに変更します。すると、このディレクトリーは、chroot
jail と見なされます。たとえば、/var/ftp/
ディレクトリーが主要な共有ディレクトリーの場合、vsftpd
は/var/ftp/
を新しいルートディレクトリー (/
) に再割り当てします。これにより、新たな 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 Networking Guide を参照してください。
次に、FTP
ドメインの DNS サーバーが正しいマシンを参照するように設定する必要があります。BIND、Red Hat Enterprise Linux で使用されている DNS
プロトコル実装、設定ファイルの詳細は、Red Hat Enterprise Linux 7 Networking Guide を参照してください。
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
デーモンの複数インスタンスを同時に開始する場合は、vsftpd パッケージに含まれる、systemd ターゲットユニットファイル (vsftpd.target
) を活用することができます。この systemd ターゲットでは、/etc/vsftpd/
ディレクトリーで利用できる各 vstpd
設定ファイルに対して、独立した 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.
上記のコマンドは、システムの起動時に、(設定された vsftpd
サーバーインスタンスとともに) vsftpd
サービスを起動するように systemd サービスマネージャーを設定します。システムを再起動することなく、サービスをすぐに開始するには、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
の名前を使用しますが、TLS
はサポートされており、ssl_enable
ディレクティブが YES
に設定されているときにデフォルトで使用されています。
vsftpd.conf
ファイルの ssl_enable
設定ディレクティブを YES
に設定して、TLS
サポートを有効にします。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.service
vsftpd
で TLS
の使用を調整するためのその他の TLS
関連の設定ディレクティブについては、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
ラベルを割り当てる必要があります。さらに、SELinux のブール値オプション allow_ftpd_anon_write
を 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 User's and Administrator's Guide も併せて参照してください。
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 ページです。- サーバーアプリケーション
{blank}
-
vsftpd(8):
vsftpd
で利用可能なコマンドラインオプションを説明しています。
-
vsftpd(8):
- 設定ファイル
{blank}
-
vsftpd.conf(5):
vsftpd
の設定ファイル内で利用可能なオプションの詳細なリストを格納しています。 -
hosts_access(5):
hosts.allow
およびhosts.deny
のTCP
ラッパーの設定ファイルで利用可能なフォーマットとオプションを説明します。
-
vsftpd.conf(5):
- SELinux とのインタラクション
{blank}
-
ftpd_selinux(8):
ftpd
プロセスを管理する SELinux ポリシーと、SELinux ラベルの割り当て方法、およびブール値セットが説明されています。
-
ftpd_selinux(8):
16.2.3.2. オンラインドキュメント
- vsftpd および FTP 全般について
{blank}
-
http://vsftpd.beasts.org/:
vsftpd
プロジェクトページは、最新のドキュメントやソフトウェアの作成者の連絡先を入手することができる便利なサイトです。 -
http://slacksite.com/other/ftp.html: この Web サイトでは、アクティブモードと passive-mode
FTP
の相違点を簡単に説明します。
-
http://vsftpd.beasts.org/:
- Red Hat Enterprise Linux のドキュメンテーション
{blank}
-
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 セキュリティーガイド - Red Hat Enterprise Linux 7 の セキュリティーガイド は、ユーザーおよび管理者が、ローカルおよびリモートからの侵入、悪用、悪意のある行為に対してワークステーションおよびサーバーを保護するプロセスとプラクティスを学習する際に役に立ちます。また、重大なシステムサービスを保護する方法についても説明しています。
-
Red Hat Enterprise Linux 7 ネットワークガイド: Red Hat Enterprise Linux 7 の ネットワークガイド では、このシステムにおけるネットワークインターフェイス、ネットワーク、ネットワークサービスの設定および管理に関する情報を説明しています。
- 関連 RFC ドキュメント
{blank}