第13章 Apache HTTP サーバー
Apache HTTP サーバーは、現在の HTTP 標準とともにオープンソースの HTTP サーバーを提供します。[14]
Red Hat Enterprise Linux では、httpd パッケージは Apache HTTP Server を提供します。以下のコマンドを実行して、httpd パッケージがインストールされているかどうかを確認します。
~]$ rpm -q httpd
package httpd is not installed
インストールされておらず、Apache HTTP Server を使用する場合は、root で
yum
ユーティリティーを使用してインストールします。
~]# yum install httpd
13.1. Apache HTTP サーバーおよび SELinux
SELinux を有効にすると、Apache HTTP Server (
httpd
) はデフォルトで制限ありで実行されます。制限のあるプロセスは、独自のドメインで実行され、他の制限のあるプロセスから分離されます。制限のあるプロセスが攻撃者によって侵害された場合、SELinux ポリシーの設定に応じて、攻撃者のリソースへのアクセスと、攻撃者が行う可能性のある損害は制限されます。以下の例は、独自のドメインで実行している httpd
プロセスを示しています。この例では、httpd、setroubleshoot、setroubleshoot-server、および policycoreutils-python パッケージがインストールされていることを前提としています。
- getenforce コマンドを実行して、SELinux が Enforcing モードで実行されていることを確認します。
~]$ getenforce Enforcing
SELinux が Enforcing モードで実行されていると、このコマンドはEnforcing
を返します。 - root で以下のコマンドを入力し、
httpd
を起動します。~]# systemctl start httpd.service
サービスが実行中であることを確認します。出力には以下の情報が含まれている必要があります (タイムスタンプのみは異なります)。~]# systemctl status httpd.service httpd.service - The Apache HTTP Server Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled) Active: active (running) since Mon 2013-08-05 14:00:55 CEST; 8s ago
httpd
プロセスを表示するには、以下のコマンドを実行します。~]$ ps -eZ | grep httpd system_u:system_r:httpd_t:s0 19780 ? 00:00:00 httpd system_u:system_r:httpd_t:s0 19781 ? 00:00:00 httpd system_u:system_r:httpd_t:s0 19782 ? 00:00:00 httpd system_u:system_r:httpd_t:s0 19783 ? 00:00:00 httpd system_u:system_r:httpd_t:s0 19784 ? 00:00:00 httpd system_u:system_r:httpd_t:s0 19785 ? 00:00:00 httpd
httpd
プロセスに関連付けられている SELinux コンテキストはsystem_u:system_r:httpd_t:s0
です。コンテキストの 2 番目の部分httpd_t
はタイプです。タイプは、プロセスのドメインとファイルのタイプを定義します。この場合、httpd
プロセスはhttpd_t
ドメインで実行されています。
SELinux ポリシーは、制限のあるドメイン (
httpd_t
など) で実行されるプロセスが、ファイル、その他のプロセス、およびシステム一般とどのように対話するかを定義します。httpd
によるアクセスを可能にするには、ファイルが正しくラベル付けされている必要があります。たとえば、httpd
は httpd_sys_content_t
タイプのラベルが付いたファイルを読み取ることができますが、Linux(DAC) パーミッションで書き込みが許可されている場合でも書き込みはできません。スクリプトのネットワークアクセスの許可、NFS および CIFS ボリュームへの httpd
アクセスの許可、httpd
による Common Gateway Interface (CGI) スクリプトの実行の許可など、特定の動作を許可するには、ブール値を有効にする必要があります。
/etc/httpd/conf/httpd.conf
ファイルが TCP ポート 80、443、488、8008、8009、または 8443 以外のポートを httpd
がリッスンするように設定されている場合は、semanage port コマンドを使用して、新しいポート番号を SELinux ポリシー設定に追加する必要があります。以下の例では、httpd
用の SELinux ポリシー設定で定義されていないポートをリッスンするように httpd
を設定すると、httpd
が起動できなくなります。また、この例では、ポリシーで定義されていない標準以外のポートを httpd
が正常にリッスンできるように SELinux システムを設定する方法も示しています。この例では、httpd パッケージがインストールされていることを前提としています。この例では、各コマンドを root ユーザーとして実行します。
- 以下のコマンドを実行して、
httpd
が実行されていないことを確認します。~]# systemctl status httpd.service httpd.service - The Apache HTTP Server Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled) Active: inactive (dead)
出力が異なる場合は、プロセスを停止します。~]# systemctl stop httpd.service
semanage
ユーティリティーを使用して、SELinux でhttpd
がリッスンできるポートを表示します。~]# semanage port -l | grep -w http_port_t http_port_t tcp 80, 443, 488, 8008, 8009, 8443
/etc/httpd/conf/httpd.conf
ファイルを編集します。Listen
オプションを設定し、httpd
の SELinux ポリシー設定で設定されていないポートを一覧表示します。この例では、httpd
がポート 12345 をリッスンするように設定されています。# Change this to Listen on specific IP addresses as shown below to # prevent Apache from glomming onto all bound IP addresses (0.0.0.0) # #Listen 12.34.56.78:80 Listen 127.0.0.1:12345
- 以下のコマンドを入力して、
httpd
を起動します。~]# systemctl start httpd.service Job for httpd.service failed. See 'systemctl status httpd.service' and 'journalctl -xn' for details.
以下のような SELinux 拒否メッセージが記録されます。setroubleshoot: SELinux is preventing the httpd (httpd_t) from binding to port 12345. For complete SELinux messages. run sealert -l f18bca99-db64-4c16-9719-1db89f0d8c77
- SELinux で、
httpd
がポート 12345 をリッスンできるようにするには、以下のコマンドが必要です。~]# semanage port -a -t http_port_t -p tcp 12345
httpd
を再び起動し、新しいポートをリッスンしていることを確認します。~]# systemctl start httpd.service
httpd
が標準以外のポート (この例では TCP 12345) でリッスンできるように SELinux が設定されました。httpd
はこのポートで正常に起動します。httpd
が TCP ポート 12345 でリッスンして通信していることを証明するには、以下のように、指定したポートへの telnet 接続を開き、HTTP GET コマンドを実行します。~]# telnet localhost 12345 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. GET / HTTP/1.0 HTTP/1.1 200 OK Date: Wed, 02 Dec 2009 14:36:34 GMT Server: Apache/2.2.13 (Red Hat) Accept-Ranges: bytes Content-Length: 3985 Content-Type: text/html; charset=UTF-8 [...continues...]