第13章 Apache HTTP サーバー
Apache HTTP サーバーは、現在の HTTP 標準とともにオープンソースの HTTP サーバーを提供します。[14]
Red Hat Enterprise Linux では、httpd パッケージは Apache HTTP Server を提供します。以下のコマンドを実行して、httpd パッケージがインストールされているかどうかを確認します。
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
rpm -q httpd
~]$ rpm -q httpd
package httpd is not installed
インストールされておらず、Apache HTTP Server を使用する場合は、root で
yum ユーティリティーを使用してインストールします。
yum install httpd
~]# 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
~]$ getenforce EnforcingCopy to Clipboard Copied! Toggle word wrap Toggle overflow SELinux が Enforcing モードで実行されていると、このコマンドはEnforcingを返します。 - root で以下のコマンドを入力し、
httpdを起動します。systemctl start httpd.service
~]# systemctl start httpd.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow サービスが実行中であることを確認します。出力には以下の情報が含まれている必要があります (タイムスタンプのみは異なります)。systemctl status 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 agoCopy to Clipboard Copied! Toggle word wrap Toggle overflow httpdプロセスを表示するには、以下のコマンドを実行します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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
~]# systemctl status httpd.service httpd.service - The Apache HTTP Server Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled) Active: inactive (dead)Copy to Clipboard Copied! Toggle word wrap Toggle overflow 出力が異なる場合は、プロセスを停止します。systemctl stop httpd.service
~]# systemctl stop httpd.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow semanageユーティリティーを使用して、SELinux でhttpdがリッスンできるポートを表示します。semanage port -l | grep -w http_port_t
~]# semanage port -l | grep -w http_port_t http_port_t tcp 80, 443, 488, 8008, 8009, 8443Copy to Clipboard Copied! Toggle word wrap Toggle overflow /etc/httpd/conf/httpd.confファイルを編集します。Listenオプションを設定し、httpdの SELinux ポリシー設定で設定されていないポートをリスト表示します。この例では、httpdがポート 12345 をリッスンするように設定されています。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 以下のコマンドを入力して、
httpdを起動します。systemctl start httpd.service
~]# systemctl start httpd.service Job for httpd.service failed. See 'systemctl status httpd.service' and 'journalctl -xn' for details.Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以下のような 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
setroubleshoot: SELinux is preventing the httpd (httpd_t) from binding to port 12345. For complete SELinux messages. run sealert -l f18bca99-db64-4c16-9719-1db89f0d8c77Copy to Clipboard Copied! Toggle word wrap Toggle overflow - SELinux で、
httpdがポート 12345 をリッスンできるようにするには、以下のコマンドが必要です。semanage port -a -t http_port_t -p tcp 12345
~]# semanage port -a -t http_port_t -p tcp 12345Copy to Clipboard Copied! Toggle word wrap Toggle overflow httpdを再び起動し、新しいポートをリッスンしていることを確認します。systemctl start httpd.service
~]# systemctl start httpd.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow httpdが標準以外のポート (この例では TCP 12345) でリッスンできるように SELinux が設定されました。httpdはこのポートで正常に起動します。httpdが TCP ポート 12345 でリッスンして通信していることを証明するには、以下のように、指定したポートへの telnet 接続を開き、HTTP GET コマンドを実行します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow