第14章 Web サーバー
Web サーバー は、Web 経由でクライアントにコンテンツを提供するネットワークサービスです。これは通常 Web ページを指しますが、他のドキュメントも当てはまります。Web サーバーは、ハイパーテキスト転送プロトコル (HTTP) を使用するため、HTTP サーバーとも呼ばれます。
Red Hat Enterprise Linux 7 で利用可能な Web サーバーは以下のとおりです。
- Apache HTTP サーバー
- nginx
nginx web サーバーは、Red Hat Enterprise Linux 7 の Software Collection としてのみ利用できます。nginx へのアクセス方法や、Software Collections などの使用方法は Red Hat Software Collections のリリースノートを参照してください。
14.1. Apache HTTP サーバー
本セクションでは、Apache HTTP Server 2.4 の httpd
を説明します。これは、Apache Software Foundation により開発されたオープンソースの Web サーバーです。
Red Hat Enterprise Linux の以前のリリースからアップグレードする場合は、適切に httpd
サービス設定を更新する必要があります。本セクションでは、新たに追加された機能のいくつか、Apache HTTP Server 2.4 とバージョン 2.2 の重要な違い、古い設定ファイルの更新方法について説明します。
14.1.1. 主な変更点
Red Hat Enterprise Linux 6 と比較して Red Hat Enterprise Linux 7 の Apache HTTP Server には以下の変更があります。
- httpd サービスの制御
SysV init スクリプトからの移行に伴い、サーバー管理者は
service
コマンドの代わりにapachectl
コマンドとsystemctl
コマンドを使用してサービスを制御することが推奨されます。以下の例は、httpd
サービスに固有です。コマンド:
service httpd graceful
は以下に置き換えられます。
apachectl graceful
httpd
用のsystemd
ユニットファイルは、以下のように init スクリプトと異なる動作を持ちます。- サービスがリロードすると、デフォルトで正常な再起動が使用されます。
サービスが停止すると、デフォルトで正常な停止が使用されます。
コマンド:
service httpd configtest
は以下に置き換えられます。
apachectl configtest
- プライベート /tmp
-
システムのセキュリティーを高めるため、
systemd
ユニットファイルは、プライベートの/tmp
ディレクトリーを使用してhttpd
デーモンを実行します。これは、システムの/tmp
ディレクトリーとは別のものです。 - 設定レイアウト
モジュールをロードする設定ファイルは、
/etc/httpd/conf.modules.d/
ディレクトリーにあります。このディレクトリーには、php など、追加でロードできるhttpd
用モジュールを提供するパッケージによりファイルが配置されます。/etc/httpd/conf/httpd.conf
ファイルのメインセクションの前に置かれたInclude
ディレクティブは、/etc/httpd/conf.modules.d/
ディレクトリー内にファイルを追加するために使用されます。つまり、conf.modules.d/
にある設定ファイルはすべて、httpd.conf
のメインセクションが処理される前に処理されます。/etc/httpd/conf.d/
ディレクトリーのファイルに対するIncludeOptional
ディレクティブは、httpd.conf
ファイルの最後に配置されます。したがって、/etc/httpd/conf.d/
内のファイルは、httpd.conf
のセクションが処理されてから処理されます。そのほかにも、httpd パッケージが設定ファイルをいくつか提供しています。
-
/etc/httpd/conf.d/autoindex.conf
: これは mod_autoindex ディレクトリーのインデックス作成を設定します。 -
/etc/httpd/conf.d/userdir.conf
: これにより、http://example.com/~username/ などのユーザーディレクトリーへのアクセスが設定されます。このようなアクセスは、セキュリティー上の理由からデフォルトでは無効になっています。 -
/etc/httpd/conf.d/welcome.conf
: 以前のリリースと同様に、http://localhost/ でコンテンツがない場合に表示されるようこそページが設定されます。
-
- デフォルト設定
-
最小限の
httpd.conf
ファイルがデフォルトで提供されるようになりました。Timeout
やKeepAlive
といった一般的な設定の多くは、デフォルトで明示的に設定されることはなくなり、ハードコーディングされるようになります。このハードコーディングされた全設定ディレクティブ用のデフォルト設定は、マニュアルに記載されています。詳細は、「インストール可能なドキュメント」 を参照してください。 - 互換性がない構文の変更
-
既存の設定を httpd 2.2 から httpd 2.4 に移行する場合は、
httpd
設定の構文に後方互換性がない変更が含まれるため、変更が必要になります。http://httpd.apache.org/docs/2.4/upgrading.html のアップグレードに関する詳細は、以下の Apache ドキュメントを参照してください。 - 処理モデル
Red Hat Enterprise Linux の以前のリリースでは、さまざまな マルチプロセスモデル (MPM) が、さまざまなな
httpd
バイナリーとして利用できていました。つまり、分岐モデルの prefork を/usr/sbin/httpd
として、またスレッドベースのモデルである worker を/usr/sbin/httpd.worker
としてしました。Red Hat Enterprise Linux 7 では、単独の
httpd
バイナリーのみが使われ、3 つの MPM はロード可能なモジュール (worker、prefork (デフォルト)、および event) として利用可能です。必要に応じて、コメント文字#
を追加および削除して 3 つの MPM モジュールの 1 つだけがロードされるよう設定ファイル/etc/httpd/conf.modules.d/00-mpm.conf
を編集します。- パッケージ変更
LDAP 認証および承認の各モジュールは、個別のサブパッケージ mod_ldap で提供されています。新たなモジュール mod_session と関連のヘルパーモジュールは、新しいサブパッケージ mod_session で提供されています。新しいモジュールの mod_proxy_html と mod_xml2enc は、新しいサブパッケージ mod_proxy_html で提供されています。これらのパッケージはすべて Optional チャンネルにあります。
注記Optional および Supplementary チャンネルをサブスクライブする前に、対象範囲の詳細 を参照してください。これらのチャンネルからパッケージをインストールする場合は、Red Hat カスタマーポータルの記事 証明書ベースの管理を使用して、Optional および Supplementary チャンネル、-devel パッケージにアクセスする方法 で説明されている手順を行ってください。
- ファイルシステムのレイアウトのパッケージ
/var/cache/mod_proxy/
ディレクトリーは提供されなくなりました。代わりに、/var/cache/httpd/
ディレクトリーがproxy
サブディレクトリーおよびssl
サブディレクトリーとパッケージ化されています。httpd
で提供されていたパッケージ化されたコンテンツは、/var/www/
から/usr/share/httpd/
に移動しています。-
/usr/share/httpd/icons/
: ディレクトリーインデックスで使用されるアイコンセットを含むディレクトリーは、(以前の/var/www/icons/
ディレクトリーから)/usr/share/httpd/icons/
に変更になりました。デフォルト設定では http://localhost/icons/ で利用可能です。アイコンの場所と利用可能性は、/etc/httpd/conf.d/autoindex.conf ファイルで設定可能です。 -
/usr/share/httpd/manual/
:/var/www/manual/
は/usr/share/httpd/manual/
に変更になりました。httpd-manual パッケージに含まれるこのディレクトリーにはhttpd
の HTML バージョンのマニュアルが含まれます。このパッケージがインストールされている場合は、http://localhost/manual/ で利用可能です。マニュアルの場所と利用可能性は /etc/httpd/conf.d/manual.conf ファイルで設定できます。 -
usr/share/httpd/error/
:/var/www/error/
は/usr/share/httpd/error/
に移動しました。カスタムの複数言語の HTTP エラーページです。デフォルトでは設定されておらず、設定ファイルの例は/usr/share/doc/httpd-VERSION/httpd-multilang-errordoc.conf
で提供されています。
-
- 認証、認可、およびアクセス制御
-
認証、認可、およびアクセス制御に使用される設定ディレクティブは、大幅に変更されました。
Order
、Deny
、およびAllow
の各ディレクティブを使用している既存の設定ファイルは、新たなRequire
構文を使うようにしてください。詳細は、以下の Apache ドキュメントを参照してください。http://httpd.apache.org/docs/2.4/howto/auth.html - suexec
-
システムのセキュリティーを改善するために、suexec バイナリーは、
root
ユーザーと同じようにインストールされなくなりました。代わりに、より限定的なパーミッションセットを可能にするファイルシステムのケイパビリティーセットがあります。この変更に加えて、suexec バイナリーは/var/log/httpd/suexec.log
ログファイルを使用しなくなりました。代わりに、ログメッセージは syslog に送信されます。デフォルトでは、これらのメッセージは/var/log/secure
ログファイルに表示されます。 - モジュールインターフェイス
httpd
モジュールインターフェイスが変更したため、httpd 2.2 に対して構築されたサードパーティーのバイナリーモジュールは、httpd 2.4 と互換性がありません。これらのモジュールは、必要に応じて httpd 2.4 モジュールインターフェイス用に調整し、再構築する必要があります。バージョン2.4
の API の変更点の詳細リストは、http://httpd.apache.org/docs/2.4/developer/new_api_2_4.html を参照してください。ソースからのモジュール構築に使用される apxs バイナリーは、
/usr/sbin/apxs
および/usr/bin/apxs
に移動しました。- 削除されたモジュール
Red Hat Enterprise Linux 7 で削除された
httpd
モジュールのリスト:- mod_auth_mysql, mod_auth_pgsql
- httpd 2.4 は、mod_authn_dbd モジュールで SQL データベース認証サポートを内部で提供します。
- mod_perl
- mod_perl では、アップストリームにより httpd 2.4 が公式にサポートされていません。
- mod_authz_ldap
- httpd 2.4 では、mod_authnz_ldap を使用してサブパッケージ mod_ldap の LDAP サポートが提供されます。
14.1.2. 設定の更新
Apache HTTP サーバーバージョン 2.2 の設定ファイルを更新するには、以下の手順を行います。
-
モジュールは変更されている可能性があるため、すべてのモジュール名が正しいことを確認してください。名前が変更された各モジュールの
LoadModule
ディレクティブを調整します。 - サードパーティーのモジュールは、読み込みを試みる前にすべて再コンパイルをします。これは一般的に認証と権限付与のモジュールに該当します。
-
mod_userdir
モジュールを使用する場合は、ディレクトリー名 (通常はpublic_html
) を示すUserDir
ディレクティブが指定されていることを確認してください。 - Apache HTTP Secure Server を使用する場合は、Secure Sockets Layer (SSL) プロトコルの有効化に関する重要な情報について 「mod_ssl モジュールの有効化」 を参照してください。
以下のコマンドを使用すると、設定エラーを確認できます。
~]# apachectl configtest Syntax OK
Apache HTTP サーバーの設定をバージョン 2.2 から 2.4 に更新する方法は http://httpd.apache.org/docs/2.4/upgrading.html を参照してください。
14.1.3. httpd サービスの実行
本セクションでは、Apache HTTP Server の起動、停止、再起動、および現在のステータスの確認を行う方法を説明します。httpd
サービスを使用するには、httpd パッケージがインストールされていることを確認します。これを行うには、次のコマンドを使用します。
~]# yum install httpd
ターゲットの概念と Red Hat Enterprise Linux 内のシステムサービスの管理方法全般の詳細は、10章systemd によるサービス管理 を参照してください。
14.1.3.1. サービスの起動
httpd
サービスを実行する場合は、root
で次のコマンドを実行します。
~]# systemctl start httpd.service
システムの起動時にサービスを自動的に起動するようにするには、以下のコマンドを使用します。
~]# systemctl enable httpd.service Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.
Apache HTTP サーバーをセキュアサーバーとして実行している場合は、暗号化したプライベートの SSL キーを使用すると、マシンが起動した後にパスワードが要求される可能性があります。
14.1.3.2. サービスの停止
実行中の httpd
サービスを停止するには、root
で次のコマンドを実行します。
~]# systemctl stop httpd.service
システムの起動時にサービスが自動的に起動しないようにするには、以下を入力します。
~]# systemctl disable httpd.service Removed symlink /etc/systemd/system/multi-user.target.wants/httpd.service.
14.1.3.3. サービスの再起動
実行中の httpd
サービスを再起動する方法は、3 通りあります。
サービスを完全に再起動するには、
root
で次のコマンドを入力します。~]# systemctl restart httpd.service
これにより、稼働中の
httpd
サービスが停止し、すぐに再起動します。このコマンドは、PHP など、動的に読み込んだモジュールをインストールまたは削除した後に使用します。設定のリロードだけを行うには、
root
で以下のコマンドを入力します。~]# systemctl reload httpd.service
これにより、実行中の
httpd
サービスが、設定ファイルを再読み込みします。現在処理中の要求はいずれも割り込みされるので、クライアントのブラウザーがエラーメッセージを表示したり、ページの一部のみが表示される可能性があります。アクティブな要求に影響を与えずに設定を再読み込みするには、
root
で次のコマンドを入力します。~]# apachectl graceful
これにより、実行中の
httpd
サービスが、設定ファイルを再読み込みします。現在処理中のリクエストは、引き続き古い設定を使用します。
Red Hat Enterprise Linux 7 でシステムサービスを管理する方法は、10章systemd によるサービス管理 を参照してください。
14.1.3.4. サービスステータスの確認
httpd
サービスが実行していることを確認するには、シェルプロンプトで以下を入力します。
~]# systemctl is-active httpd.service active
14.1.4. 設定ファイルの編集
httpd
サービスが起動すると、デフォルトでは、表14.1「httpd サービスの設定ファイル」 にリスト表示されている場所から設定が読み込まれます。
パス | 詳細 |
---|---|
| 主要設定ファイル。 |
| 主要設定ファイル内に含まれている設定ファイル用の補助ディレクトリー。 |
デフォルト設定はほとんどの状況に適していますが、重要な設定オプションをいくつか知っておくと役に立ちます。変更を有効にするには、web サーバーを再起動する必要があることに注意してください。httpd
サービスを再起動する方法は、「サービスの再起動」 を参照してください。
設定に誤りがないことを確認するには、シェルプロンプトで以下のコマンドを実行します。
~]# apachectl configtest Syntax OK
ファイルの変更に失敗してもすぐにやり直せるように、ファイルを編集する前にコピーを作成しておくことを推奨します。
14.1.5. モジュールの使用
httpd
サービスは、モジュールアプリケーションであるため、多数の Dynamic Shared Objects (DSO) と一緒に配布されます。これは、必要に応じてランタイム時に、動的に読み込まれたり、読み込みが破棄されたりします。Red Hat Enterprise Linux 7 では、これらのモジュールは /usr/lib64/httpd/modules/
内にあります。
14.1.5.1. モジュールの読み込み
特定の DSO モジュールを読み込むには、LoadModule
ディレクティブを使用します。個別のパッケージで提供されるモジュールでは多くの場合、設定ファイルが /etc/httpd/conf.d/
ディレクトリーにあることに注意してください。
例14.1 mod_ssl DSO の読み込み
LoadModule ssl_module modules/mod_ssl.so
操作が終了したら、Web サーバーを再起動して設定を再読み込みします。httpd
サービスを再起動する方法は、「サービスの再起動」 を参照してください。
14.1.5.2. モジュールの作成
新たに DSO モジュールを作成する場合は、httpd-devel パッケージがインストールされていることを確認してください。これを行うには、root
で以下のコマンドを実行します。
~]# yum install httpd-devel
このパッケージには、モジュールをコンパイルするために必要なインクルードファイル、ヘッダーファイル、および APache eXtenSion (apxs
) ユーティリティーが含まれます。
作成したら、以下のコマンドでモジュールを構築できます。
~]# apxs -i -a -c module_name.c
ビルドが成功すると、Apache HTTP Server で配布されるその他のモジュールと同じ方法でモジュールを読み込むことができます。
14.1.6. 仮想ホストの設定
Apache HTTP Server に組み込まれている仮想ホストを使用すると、どの IP アドレス、ホスト名、またはポートが要求されているかに基づいて、サーバーが異なる情報を提供できます。
名前ベースの仮想ホストを作成するには、まず設定ファイルの例である /usr/share/doc/httpd-VERSION/httpd-vhosts.conf
を /etc/httpd/conf.d/
ディレクトリーにコピーし、@@Port@@
と @@ServerRoot@@
のプレースホルダーの値を置き換えます。例14.2「仮想ホストの設定例」 に従って、要件に応じてオプションをカスタマイズします。
例14.2 仮想ホストの設定例
<VirtualHost *:80> ServerAdmin webmaster@penguin.example.com DocumentRoot "/www/docs/penguin.example.com" ServerName penguin.example.com ServerAlias www.penguin.example.com ErrorLog "/var/log/httpd/dummy-host.example.com-error_log" CustomLog "/var/log/httpd/dummy-host.example.com-access_log" common </VirtualHost>
ServerName
は、マシンに割り当てられた有効な DNS 名を指定する必要があることに注意してください。<VirtualHost>
コンテナーは高度なカスタマイズが可能で、メインサーバーの設定で利用可能なディレクティブのほとんどを使用できます。このコンテナーで対応して いない ディレクティブには、SuexecUserGroup
に置き換えられた User
および Group
が含まれます。
仮想ホストがデフォルト以外のポートをリッスンするように設定している場合は、それに応じて /etc/httpd/conf/httpd.conf
ファイルのグローバル設定セクションの Listen
ディレクティブを必ず更新してください。
新規に作成された仮想ホストをアクティブ化するには、Web サーバーを再起動する必要があります。httpd
サービスを再起動する方法は、「サービスの再起動」 を参照してください。
14.1.7. SSL サーバーの設定
Secure Sockets Layer (SSL) は、サーバーとクライアントが安全に接続できるようにする暗号化プロトコルです。Transport Layer Security (TLS) と呼ばれる拡張され改善されたバージョンとともに、プライバシーとデータの整合性の両方が確保されます。Apache HTTP Server を mod_ssl
と組み合わせて、OpenSSL ツールキットを使用して SSL/TLS サポートを提供するモジュールは、SSL サーバー と呼ばれます。Red Hat Enterprise Linux は、TLS 実装としての Mozilla NSS の使用もサポートします。Mozilla NSS のサポートは mod_nss
モジュールにより提供されます。
傍受できる人であればだれでも読み取りや修正が可能な HTTP 接続とは異なり、HTTPS と呼ばれる SSL/TLS over HTTP の使用により、送信したコンテンツの検査や修正が阻止されます。本セクションでは、Apache HTTP Server 設定内でこのモジュールを有効にする基本的な方法と、秘密鍵と自己署名の証明書の生成プロセスを説明します。
14.1.7.1. 証明書およびセキュリティーの概要
通信の安全性は、鍵の使用により確保されます。従来の暗号または 対称暗号 では、トランザクションの両端に、相互に送信をデコードするのに使用する鍵と同じ鍵があります。一方、公開暗号または 非対称暗号 では、秘密鍵 (秘密を保持する) と 公開鍵 (通常は公共と共有) が共存します。公開鍵でエンコードされたデータは秘密鍵でしかデコードできませんが、秘密鍵でエンコードされたデータは公開鍵でしかデコードできません。
SSL を使用した安全な通信を提供するには、SSL サーバーが 認証機関 (CA) が署名したデジタル証明書を使用する必要があります。証明書は、サーバーの各種属性 (サーバーのホスト名、会社名、会社の場所など) と、CA の秘密鍵を使用して生成した署名をリスト表示します。この署名は、特定の認証局が証明書を署名し、証明書がいかなる方法でも変更されていないことを確認するものです。
Web ブラウザーが新しい SSL 接続を確立すると、Web サーバーが提供する証明書が確認されます。証明書に、信頼できる CA からの署名がない場合や、証明書にリスト表示されているホスト名が、接続の確立に使用されたホスト名と一致しない場合は、サーバーとの通信が拒否され、通常は、ユーザーに適切なエラーメッセージが表示されます。
デフォルトでは、ほとんどの Web ブラウザーは、幅広く使用されている一連の証明書局を信頼するように設定されています。このため、安全なサーバーを設定する際には、適切な CA を選択して、ターゲットユーザーが接続を信頼できる状態にする必要があります。適切な CA を選択しないとエラーメッセージが表示され、証明書を手動で指定することが必要になります。ユーザーが証明書エラーを上書きするようにすると、攻撃者が接続を傍受できるため、可能な場合は信頼できる CA を使用する必要があります。詳細は、表14.2「一般的な Web ブラウザーが使用する CA リストに関する情報」 を参照してください。
Web ブラウザー | リンク |
---|---|
Mozilla Firefox | |
Opera | |
Internet Explorer | |
Chromium |
SSL サーバーをセットアップする際には、証明書要求と秘密鍵を生成してから、証明書要求と企業の識別証明と支払いを認証局に送ります。CA が証明書の要求および ID を確認すると、サーバーで使用できる署名付きの証明書が送信されます。また、CA 署名を含まない自己署名証明書を作成することもできるため、テスト目的でのみ使用してください。
14.1.8. mod_ssl モジュールの有効化
mod_ssl
を使用して SSL または HTTPS サーバーをセットアップする場合は、別のアプリケーションまたはモジュール (mod_nss など) で同じポートを使用するよう 設定できません
。ポート 443
は、HTTPS のデフォルトポートです。
mod_ssl
モジュールおよび OpenSSL ツールキットを使用して SSL サーバーを設定するには、mod_ssl および openssl パッケージをインストールします。root
で次のコマンドを実行します。
~]# yum install mod_ssl openssl
これにより、/etc/httpd/conf.d/ssl.conf
に mod_ssl
設定ファイルが作成されます。このファイルは、デフォルトでメインとなる Apache HTTP Server 設定ファイルに含まれています。モジュールを読み込むには、「サービスの再起動」 の説明どおりに httpd
サービスを再起動します。
POODLE: SSLv3 脆弱性 (CVE-2014-3566) で説明されている脆弱性のため、Red Hat は、SSL
を無効にし、TLSv1.1
または TLSv1.2
のみを使用することを推奨します。後方互換性は、TLSv1.0
を使用して実現できます。Red Hat がサポートする多くの製品は SSLv2
または SSLv3
プロトコルを使用するか、デフォルトでそれらのプロトコルを有効にできます。ただし、SSLv2
または SSLv3
を使用することが強く推奨されます。
14.1.8.1. mod_ssl での SSL および TLS の有効化および無効化
SSL および TLS プロトコルの特定のバージョンを有効および無効にするには、設定ファイルの ## SSL Global Context セクション に SSLProtocol
ディレクティブを追加し、他のすべての部分でそのディレクティブを削除するか、すべての VirtualHost セクションの # SSL Protocol support の下にあるデフォルトエントリーを編集することによりグローバルで設定します。ドメインごとの VirtualHost セクションで指定しない場合、設定はグローバルセクションから継承されます。プロトコルバージョンが確実に無効になるように、管理者は SSLProtocol
を、SSL Global Context セクションにのみ指定するか、ドメインごとのすべての VirtualHost セクションで指定する必要があります。
SSLv2 および SSLv3 の無効化
すべての VirtualHost セクションで SSL バージョン 2 および SSL バージョン 3 を無効にするには (SSL バージョン 2 および SSL バージョン 3 以外をすべて有効にすることを意味します)、以下の手順を実行します。
root
で/etc/httpd/conf.d/ssl.conf
ファイルを開き、SSLProtocol ディレクティブのすべての
インスタンスを検索します。デフォルトでは、設定ファイルに以下のような 1 つのセクションが含まれます。~]# vi /etc/httpd/conf.d/ssl.conf # SSL Protocol support: # List the enable protocol levels with which clients will be able to # connect. Disable SSLv2 access by default: SSLProtocol all -SSLv2
このセクションは、VirtualHost セクション内にあります。
SSLProtocol
行を以下のように編集します。# SSL Protocol support: # List the enable protocol levels with which clients will be able to # connect. Disable SSLv2 access by default: SSLProtocol all -SSLv2 -SSLv3
すべての VirtualHost セクションに対してこのアクションを繰り返します。ファイルを保存してから閉じます。
すべての
SSLProtocol
ディレクティブが以下のように変更されたことを確認します。~]# grep SSLProtocol /etc/httpd/conf.d/ssl.conf SSLProtocol all -SSLv2 -SSLv3
この手順は、デフォルトの VirtualHost セクションが複数の場合に特に重要になります。
以下のように Apache デーモンを再起動します。
~]# systemctl restart httpd
セッションが中断されることに注意してください。
TLS 1 以上を除くすべての SSL および TLS プロトコルの無効化
TLS バージョン 1 以上を除く SSL および TLS プロトコルバージョンをすべて無効にするには、以下の手順を実行します。
root
で/etc/httpd/conf.d/ssl.conf
ファイルを開き、SSLProtocol
ディレクティブの すべて のインスタンスを検索します。デフォルトでは、このファイルには以下のようなセクションが含まれます。~]# vi /etc/httpd/conf.d/ssl.conf # SSL Protocol support: # List the enable protocol levels with which clients will be able to # connect. Disable SSLv2 access by default: SSLProtocol all -SSLv2
SSLProtocol
行を以下のように編集します。# SSL Protocol support: # List the enable protocol levels with which clients will be able to # connect. Disable SSLv2 access by default: SSLProtocol -all +TLSv1 +TLSv1.1 +TLSv1.2
ファイルを保存してから閉じます。
以下のように変更を確認します。
~]# grep SSLProtocol /etc/httpd/conf.d/ssl.conf SSLProtocol -all +TLSv1 +TLSv1.1 +TLSv1.2
以下のように Apache デーモンを再起動します。
~]# systemctl restart httpd
セッションが中断されることに注意してください。
SSL および TLS プロトコルのステータスのテスト
有効または無効な SSL および TLS のバージョンを確認するには、openssl s_client -connect
コマンドを使用します。このコマンドの形式は以下のとおりです。
openssl s_client -connect hostname:port -protocol
port は、テストするポートで、protocol は、テストするプロトコルバージョンです。ローカルで稼働している SSL サーバーをテストする場合は、localhost
をホスト名として使用します。たとえば、SSLv3 が有効であるかどうかを確認するためにセキュアな HTTPS 接続のデフォルトポートであるポート 443
をテストするには、以下のようにコマンドを発行します。
~]# openssl s_client -connect localhost:443 -ssl3 CONNECTED(00000003) 139809943877536:error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure:s3_pkt.c:1257:SSL alert number 40 139809943877536:error:1409E0E5:SSL routines:SSL3_WRITE_BYTES:ssl handshake failure:s3_pkt.c:596: output omitted New, (NONE), Cipher is (NONE) Secure Renegotiation IS NOT supported Compression: NONE Expansion: NONE SSL-Session: Protocol : SSLv3 output truncated
上記の出力は、ハンドシェイクが失敗し、暗号化がネゴシエートされなかったことを示しています。
~]$ openssl s_client -connect localhost:443 -tls1_2 CONNECTED(00000003) depth=0 C = --, ST = SomeState, L = SomeCity, O = SomeOrganization, OU = SomeOrganizationalUnit, CN = localhost.localdomain, emailAddress = root@localhost.localdomain output omitted New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-GCM-SHA384 Server public key is 2048 bit Secure Renegotiation IS supported Compression: NONE Expansion: NONE SSL-Session: Protocol : TLSv1.2 output truncated
上記の出力は、ハンドシェイクが失敗せず、暗号化セットがネゴシエートされたことを示しています。
openssl s_client
コマンドのオプションは、s_client(1)
man ページに記載されています。
SSLv3 の脆弱性とそのテスト方法の詳細は、Red Hat ナレッジベースの記事 POODLE: SSLv3 脆弱性 (CVE-2014-3566) を参照してください。
14.1.9. mod_nss Module の有効化
mod_nss
を使用して HTTPS サーバーをセットアップする場合は、mod_ssl
がデフォルトで 443
(デフォルトの HTTPS ポート) を使用するため、mod_ssl パッケージをデフォルト設定でインストールできません。可能な限り、このパッケージを削除します。
mod_ssl を削除するには、root
で以下のコマンドを入力します。
~]# yum remove mod_ssl
他の目的のために mod_ssl
が必要な場合は、443
以外のポートを使用するよう /etc/httpd/conf.d/ssl.conf
を変更して、リッスンするポートが 443
に変更されたときに mod_ssl
と mod_nss
が競合しないようにします。
1 つのモジュールのみがポートを所有できるため、mod_nss
と mod_ssl
は一意のポートを使用している場合のみ同時に共存できます。このため、 mod_nss
はデフォルトで 8443
を使用しますが、HTTPS のデフォルトポートはポート 443
です。ポートは Listen
ディレクティブと VirtualHost 名またはアドレスで指定されます。
NSS のすべてはトークンに関連付けられます。ソフトウェアトークンは NSS データベースに存在しますが、証明書を含む物理トークンを使用することもできます。OpenSSL では、個別証明書と秘密鍵は PEM ファイルに保持されます。NSS では、これらはデータベースに格納されます。各証明書およびキーはトークンと関連付けられ、各トークンにはパスワードを設定して保護することもできます。このパスワードはオプションですが、パスワードが使用される場合、Apache HTTP サーバーはシステムの起動時にユーザーの介入なしでデータベースを開くためにパスワードのコピーを必要とします。
mod_nss の設定
root
で mod_nss をインストールします。~]# yum install mod_nss
これにより、
/etc/httpd/conf.d/nss.conf
にmod_nss
設定ファイルが作成されます。/etc/httpd/conf.d/
ディレクトリーは、デフォルトでメインの Apache HTTP Server 設定ファイルに含まれます。モジュールを読み込むには、「サービスの再起動」 の説明どおりにhttpd
サービスを再起動します。root
で/etc/httpd/conf.d/nss.conf
ファイルを開き、Listen ディレクティブのすべての
インスタンスを検索します。Listen 8443
行を以下のように編集します。Listen 443
ポート
443
は、HTTPS
のデフォルトポートです。デフォルトの
VirtualHost default:8443
行を以下のように編集します。VirtualHost default:443
デフォルト以外の他のすべての仮想ホストセクション (存在する場合) を編集します。ファイルを保存してから閉じます。
Mozilla NSS では、証明書は /etc/httpd/conf.d/nss.conf ファイルの
NSSCertificateDatabase
ディレクティブで指定されたサーバー証明書データベース
に保存されます。デフォルトでは、パスはインストール時に作成された NSS データベースである/etc/httpd/alias
に設定されます。デフォルトの NSS データベースを表示するには、以下のコマンドを実行します。
~]# certutil -L -d /etc/httpd/alias Certificate Nickname Trust Attributes SSL,S/MIME,JAR/XPI cacert CTu,Cu,Cu Server-Cert u,u,u alpha u,pu,u
上記のコマンド出力で、
Server-Cert
はデフォルトのNSSNickname
です。-L
オプションは、証明書データベースにすべての証明書をリスト表示したり、名前付き証明書に関する情報を表示します。-d
オプションは、証明書およびキーデータベースファイルを含むデータベースディレクトリーを指定します。その他のコマンドラインオプションは、certutil(1)
man ページを参照してください。別のデータベースを使用するよう mod_nss を設定するには、
/etc/httpd/conf.d/nss.conf
ファイルのNSSCertificateDatabase
行を編集します。デフォルトファイルの VirtualHost セクション内には以下の行が含まれます。# Server Certificate Database: # The NSS security database directory that holds the certificates and # keys. The database consists of 3 files: cert8.db, key3.db and secmod.db. # Provide the directory that these files exist. NSSCertificateDatabase /etc/httpd/alias
上記のコマンド出力で、
alias
はデフォルトの NSS データベースディレクトリーである/etc/httpd/alias/
です。デフォルトの NSS 証明書データベースにパスワードを適用するには、
root
で以下のコマンドを使用します。~]# certutil -W -d /etc/httpd/alias Enter Password or Pin for "NSS Certificate DB": Enter a password which will be used to encrypt your keys. The password should be at least 8 characters long, and should contain at least one non-alphabetic character. Enter new password: Re-enter password: Password changed successfully.
HTTPS サーバーをデプロイする前に、認証局 (CA) により署名された証明書を使用して新しい証明書データベースを作成します。
例14.3 Mozilla NSS データベースへの証明書の追加
certutil
コマンドは、CA 証明書を NSS データベースファイルに追加するために使用されます。certutil -d
/etc/httpd/nss-db-directory/
-A -n "CA_certificate" -tCT,,
-a -icertificate.pem
上記のコマンドは、certificate.pem という名前の PEM 形式のファイル に保存されている CA 証明書を追加します。
-d
オプションは、証明書およびキーデータベースファイルを含む NSS データベースディレクトリーを指定します。-n
オプションは、証明書の名前 (-t
CT,,
) を設定します。これは、証明書が TLS クライアントおよびサーバーで使用されるように信頼されることを意味します。-A
オプションでは、既存の証明書を証明書データベースに追加します。データベースが存在しない場合は、作成されます。-a
オプションでは、入力または出力に ASCII 形式を使用でき、-i
オプションはcertificate.pem
入力ファイルをコマンドに渡します。その他のコマンドラインオプションは、
certutil(1)
man ページを参照してください。秘密鍵を保護するために、NSS データベースはパスワードで保護する必要があります。
例14.4 Mozilla NSS データベースのパスワード設定
NSS データベースのパスワードを設定するには、以下のように
certutil
ツールを使用できます。certutil -W -d /etc/httpd/nss-db-directory/
たとえば、デフォルトのデータベースの場合は、
root
で以下のコマンドを実行します。~]# certutil -W -d /etc/httpd/alias Enter Password or Pin for "NSS Certificate DB": Enter a password which will be used to encrypt your keys. The password should be at least 8 characters long, and should contain at least one non-alphabetic character. Enter new password: Re-enter password: Password changed successfully.
以下のように NSSPassPhraseDialog
ディレクティブ
で行を変更して、NSS 内部ソフトウェアトークンを使用するようにmod_nss
を設定します。~]# vi /etc/httpd/conf.d/nss.conf NSSPassPhraseDialog file:/etc/httpd/password.conf
これにより、システムの起動時にパスワードを手動で入力する必要がなくなります。ソフトウェアトークンは NSS データベースに存在しますが、証明書を含む物理トークンを使用することもできます。
NSS データベースに含まれる SSL サーバー証明書が RSA 証明書である場合は、
NSSNickname
パラメーターのコメントを解除し、パラメーターが上記の手順 4 で示されたニックネームに一致するようにしてください。~]# vi /etc/httpd/conf.d/nss.conf NSSNickname Server-Cert
NSS データベースに含まれる SSL サーバー証明書が ECC 証明書である場合は、
NSSECCNickname
パラメーターのコメントが解除され、上記の手順 4 で示されたニックネームに一致するようにします。~]# vi /etc/httpd/conf.d/nss.conf NSSECCNickname Server-Cert
NSSCertificateDatabase
パラメーターがコメント解除され、上記の手順 4 で示された、または手順 5 で設定された NSS データベースディレクトリーを参照するようにします。~]# vi /etc/httpd/conf.d/nss.conf NSSCertificateDatabase /etc/httpd/alias
/etc/httpd/alias
を、使用する証明書データベースへのパスに置き換えます。root
で/etc/httpd/password.conf
ファイルを作成します。~]# vi /etc/httpd/password.conf
次の形式の行を追加します。
internal:password
上記の手順 6 で、パスワード を NSS セキュリティーデータベースに適用したパスワードに置き換えます。
適切な所有権とパーミッションを
/etc/httpd/password.conf
ファイルに適用します。~]# chgrp apache /etc/httpd/password.conf ~]# chmod 640 /etc/httpd/password.conf ~]# ls -l /etc/httpd/password.conf -rw-r-----. 1 root apache 10 Dec 4 17:13 /etc/httpd/password.conf
NSS ソフトウェアトークンを使用するよう
/etc/httpd/password.conf
でmod_nss
を設定するには、/etc/httpd/conf.d/nss.conf
を以下のように編集します。~]# vi /etc/httpd/conf.d/nss.conf
- 変更を反映するために、「サービスの再起動」 の説明通りに Apache サーバーを再起動します。
POODLE: SSLv3 脆弱性 (CVE-2014-3566) で説明されている脆弱性のため、Red Hat は、SSL
を無効にし、TLSv1.1
または TLSv1.2
のみを使用することを推奨します。後方互換性は、TLSv1.0
を使用して実現できます。Red Hat がサポートする多くの製品は SSLv2
または SSLv3
プロトコルを使用するか、デフォルトでそれらのプロトコルを有効にできます。ただし、SSLv2
または SSLv3
を使用することが強く推奨されます。
14.1.9.1. mod_nss での SSL および TLS の有効化および無効化
SSL および TLS プロトコルの特定のバージョンを有効および無効にするには、設定ファイルの## SSL Global Context セクション に NSSProtocol
ディレクティブを追加し、他のすべての部分でそのディレクティブを削除するか、すべての VirtualHost セクションの # SSL Protocol の下にあるデフォルトエントリーを編集することによりグローバルで設定します。ドメインごとの VirtualHost セクションで指定しない場合、設定はグローバルセクションから継承されます。プロトコルバージョンが確実に無効になるように、管理者は NSSProtocol
を、SSL Global Context セクションにのみ指定するか、ドメインごとのすべての VirtualHost セクションで指定する必要があります。
mod_nss での TLS 1 以上を除くすべての SSL および TLS プロトコルの無効化
TLS バージョン 1 以上を除く SSL および TLS プロトコルバージョンをすべて無効にするには、以下の手順を実行します。
root
で/etc/httpd/conf.d/nss.conf
ファイルを開き、NSSProtocol ディレクティブのすべての
インスタンスを検索します。デフォルトでは、設定ファイルに以下のような 1 つのセクションが含まれます。~]# vi /etc/httpd/conf.d/nss.conf # SSL Protocol: output omitted # Since all protocol ranges are completely inclusive, and no protocol in the # middle of a range may be excluded, the entry "NSSProtocol SSLv3,TLSv1.1" # is identical to the entry "NSSProtocol SSLv3,TLSv1.0,TLSv1.1". NSSProtocol SSLv3,TLSv1.0,TLSv1.1
このセクションは、VirtualHost セクション内にあります。
NSSProtocol
行を以下のように編集します。# SSL Protocol: NSSProtocol TLSv1.0,TLSv1.1
すべての VirtualHost セクションに対してこのアクションを繰り返します。
Listen 8443
行を以下のように編集します。Listen 443
デフォルトの
VirtualHost default:8443
行を以下のように編集します。VirtualHost default:443
デフォルト以外の他のすべての仮想ホストセクション (存在する場合) を編集します。ファイルを保存してから閉じます。
すべての
NSSProtocol
ディレクティブが以下のように変更したことを確認します。~]# grep NSSProtocol /etc/httpd/conf.d/nss.conf # middle of a range may be excluded, the entry "NSSProtocol SSLv3,TLSv1.1" # is identical to the entry "NSSProtocol SSLv3,TLSv1.0,TLSv1.1". NSSProtocol TLSv1.0,TLSv1.1
この手順は、VirtualHost セクションが複数の場合に特に重要になります。
以下のように Apache デーモンを再起動します。
~]# service httpd restart
セッションが中断されることに注意してください。
mod_nss での SSL および TLS プロトコルのステータスのテスト
mod_nss で有効または無効な SSL および TLS のバージョンを確認するには、openssl s_client -connect
コマンドを使用します。root
として openssl パッケージをインストールします。
~]# yum install openssl
openssl s_client -connect
コマンドの形式は次のとおりです。
openssl s_client -connect hostname:port -protocol
port は、テストするポートで、protocol は、テストするプロトコルバージョンです。ローカルで稼働している SSL サーバーをテストする場合は、localhost
をホスト名として使用します。たとえば、SSLv3 が有効であるかどうかを確認するためにセキュアな HTTPS 接続のデフォルトポートであるポート 443
をテストするには、以下のようにコマンドを発行します。
~]# openssl s_client -connect localhost:443 -ssl3 CONNECTED(00000003) 3077773036:error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number:s3_pkt.c:337: output omitted New, (NONE), Cipher is (NONE) Secure Renegotiation IS NOT supported Compression: NONE Expansion: NONE SSL-Session: Protocol : SSLv3 output truncated
上記の出力は、ハンドシェイクが失敗し、暗号化がネゴシエートされなかったことを示しています。
~]$ openssl s_client -connect localhost:443 -tls1 CONNECTED(00000003) depth=1 C = US, O = example.com, CN = Certificate Shack output omitted New, TLSv1/SSLv3, Cipher is AES128-SHA Server public key is 1024 bit Secure Renegotiation IS supported Compression: NONE Expansion: NONE SSL-Session: Protocol : TLSv1 output truncated
上記の出力は、ハンドシェイクが失敗せず、暗号化セットがネゴシエートされたことを示しています。
openssl s_client
コマンドのオプションは、s_client(1)
man ページに記載されています。
SSLv3 の脆弱性とそのテスト方法の詳細は、Red Hat ナレッジベースの記事 POODLE: SSLv3 脆弱性 (CVE-2014-3566) を参照してください。
14.1.10. 既存の鍵および証明書の使用
以前に作成した鍵と証明書がある場合は、新しいファイルを生成する代わりに、SSL サーバーを設定してこのファイルを使用できます。これが可能ではない状況は 2 つしかありません。
IP アドレスまたはドメイン名を変更している。
証明書が、特定の IP アドレスとドメイン名のペアに対して発行されます。この値のいずれかが変更すると、証明書が無効になります。
VeriSign からの証明書があり、サーバーソフトウェアを変更している。
Verivsftpd は、幅広く使用されている認証局で、特定のソフトウェア製品、IP アドレス、およびドメイン名の証明書を発行します。ソフトウェア製品を変更すると、証明書が無効になります。
上記のいずれの場合も、新しい証明書を入手する必要があります。このトピックの詳細については、「新しい鍵と証明書の生成」 を参照してください。
既存の鍵と証明書を使用する場合は、その関連ファイルを /etc/pki/tls/private/
ディレクトリーと /etc/pki/tls/certs/
ディレクトリーにそれぞれ移動します。これを行うには root
で以下のコマンドを入力します。
~]# mvkey_file.key
/etc/pki/tls/private/hostname.key
~]# mvcertificate.crt
/etc/pki/tls/certs/hostname.crt
次に、以下の行を /etc/httpd/conf.d/ssl.conf
設定ファイルに追加します。
SSLCertificateFile /etc/pki/tls/certs/hostname.crt SSLCertificateKeyFile /etc/pki/tls/private/hostname.key
更新した設定を読み込むには、in 「サービスの再起動」 の説明に従って、httpd
サービスを再起動します。
例14.5 Red Hat Secure Web Server からの鍵と証明書の使用
~]# mv /etc/httpd/conf/httpsd.key /etc/pki/tls/private/penguin.example.com.key ~]# mv /etc/httpd/conf/httpsd.crt /etc/pki/tls/certs/penguin.example.com.crt
14.1.11. 新しい鍵と証明書の生成
新しい鍵と証明書のペアを生成するには、システムに crypto-utils パッケージをインストールしておく必要があります。パッケージをインストールするには、root
で以下のコマンドを入力します。
~]# yum install crypto-utils
このパッケージには、SSL 証明書と秘密鍵を生成して管理するツールセットを提供し、鍵を生成できる Red Hat Keypair Generation ユーティリティーである genkey が含まれます。
有効な証明書を所有していて、それを新規のものに置き換える予定の場合は、異なるシリアル番号を指定します。これにより、クライアントのブラウザーがこの変更の通知を受けて予定どおりに新規の証明書に更新して、このページへのアクセスに失敗しないようにします。root
でカスタムのシリアル番号で新規の証明書を作成するには、genkey の代わりに、以下のコマンドを使用します。
~]# openssl req -x509 -new -set_serial number -key hostname.key -out hostname.crt
使用中のシステムに特定のホスト名用の鍵ファイルがすでに存在すると、genkey は起動しません。その場合は、root
で以下のコマンドを使用して既存のファイルを削除します。
~]# rm /etc/pki/tls/private/hostname.key
ユーティリティーを実行するには、root
で genkey
コマンドの後に該当するホスト名 (たとえば、penguin.example.com
など) を付けて使用します。
~]# genkey hostname
鍵と証明書の生成を完了するには、以下の手順を行います。
鍵と証明書を保存する場所を確認します。
図14.1 genkey ユーティリティーの実行
Tab キーを使用して
ボタンを選択してから、Enter キーを押すと次の画面を進みます。up と down の矢印キーを使用して、適切な鍵のサイズを選択します。鍵が大きくなればセキュリティーは向上しますが、サーバーの応答時間も長くなることに注意してください。NIST では、
2048 bits
の使用が推奨されています。NIST Special Publication 800-131A を参照してください。図14.2 鍵のサイズ選択
終了したら、タブ キーを使用して
ボタンを選択し、Enter キーを押すと、ランダムなビットの生成プロセスが開始します。選択した鍵のサイズによっては、時間がかかることもあります。証明書要求を認証局に送信するかどうかを決定します。
図14.3 証明書要求の生成
タブ キーを使用して
を選択し、証明書要求を組み立てるか、 を選択して、自己署名の証明書を生成します。その後、Enter キーを押して、選択を確認します。Spacebar (スペースバー) キーを使用すると、秘密鍵の暗号化を有効にする (
[*]
) か、無効にする ([ ]
) 選択ができます。図14.4 秘密鍵の暗号化
Tab キーを使用して
ボタンを選択してから、Enter キーを押すと次の画面を進みます。秘密鍵の暗号化を有効にしている場合は、適切なパスフレーズを入力します。セキュリティーの理由により入力時には文字が表示されませんが、最低でも 5 文字の長さが必要です。
図14.5 パスフレーズの入力
Tab キーを使用して
ボタンを選択してから、Enter キーを押すと次の画面を進みます。重要サーバーを起動するには正しいパスフレーズの入力が必要です。それを紛失したり忘れたりした場合は、新しい鍵と証明書を生成する必要があります。
証明書詳細のカスタマイズ
図14.6 証明書情報の指定
タブ キーを使用して
ボタンを選択し、Enter を押すと鍵の生成が完了します。証明書要求の生成を有効にしていた場合は、それを認証局に送信するように求められます。
図14.7 証明書要求を送信する方法の指示
Enter を押してシェルプロンプトに戻ります。
生成が終了したら、鍵と証明書の場所を /etc/httpd/conf.d/ssl.conf
設定ファイルに追加します。
SSLCertificateFile /etc/pki/tls/certs/hostname.crt SSLCertificateKeyFile /etc/pki/tls/private/hostname.key
最後に、「サービスの再起動」 に記載通りに httpd
サービスを再起動すると、更新された設定が読み込まれます。
14.1.12. コマンドラインを使用して HTTP 用および HTTPS 用にファイアウォールを設定
Red Hat Enterprise Linux は、デフォルトで HTTP
および HTTPS
トラフィックを許可しません。システムが Web サーバーとして機能するようにするには、firewalld
がサポートするサービスを使用して、必要に応じて HTTP
および HTTPS
のトラフィックがファイアウォールを通過するようにします。
コマンドラインで HTTP
を有効にするには、root
で以下のコマンドを実行します。
~]# firewall-cmd --add-service http success
コマンドラインで HTTPS
を有効にするには、root
で以下のコマンドを実行します。
~]# firewall-cmd --add-service https success
ここで変更する内容は、システムの再起動後は維持されないことに注意してください。ファイアウォールを永続的に変更するには、コマンドに --permanent
オプションを繰り返し追加してください。
14.1.12.1. コマンドラインで着信 HTTPS および HTTPS のネットワークアクセスの確認
ファイアウォールが許可するサービスを確認するには、root
で以下のコマンドを実行します。
~]# firewall-cmd --list-all
public (default, active)
interfaces: em1
sources:
services: dhcpv6-client ssh
output truncated
この例では、デフォルトのインストールでファイアウォールは有効になっていますが、HTTP
と HTTPS
は通過できません。
HTTP
および HTTP
のファイアウォールサービスが有効になると、services
行は以下のようになります。
services: dhcpv6-client http https ssh
ファイアウォールサービスの有効化、または firewalld
でのポートの開閉方法は Red Hat Enterprise Linux 7 セキュリティーガイド を参照してください。
14.1.13. 関連情報
Apache HTTP Server の詳細は、以下のリソースを参照してください。
インストールされているドキュメント
-
httpd(8)
:httpd
サービスの man ページで、コマンドラインオプションのリストが記載されます。 -
genkey(1)
: crypto-utils パッケージにより提供されるgenkey
ユーティリティーの man ページです。 -
apachectl (8)
: Apache HTTP Server の制御インターフェイスの man ページです。
インストール可能なドキュメント
http://localhost/manual/: Apache HTTP Server の公式ドキュメントで、そのディレクティブおよび利用可能なモジュールの詳細を説明します。本書にアクセスするには、httpd-manual パッケージがインストールされ、Web サーバーが稼働している必要があることに注意してください。
ドキュメントにアクセスする前に、
root
で次のコマンドを実行します。~] yum install httpd-manual ~] apachectl graceful
オンラインドキュメント
- http://httpd.apache.org/: Apache HTTP Server の公式 Web サイトです。すべてのディレクティブおよびデフォルトモジュールの説明が記載されています。
- OpenSSL Home Page - その他のドキュメント、FAQ、メーリングリストへのリンクなどの役に立つリソースを掲載した OpenSSL のホームページです。