Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

第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 プロセスを示しています。この例では、httpdsetroubleshootsetroubleshoot-server、および policycoreutils-python パッケージがインストールされていることを前提としています。
  1. getenforce コマンドを実行して、SELinux が Enforcing モードで実行されていることを確認します。
    ~]$ getenforce
    Enforcing
    
    SELinux が Enforcing モードで実行されていると、このコマンドは Enforcing を返します。
  2. 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
    
  3. 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 によるアクセスを可能にするには、ファイルが正しくラベル付けされている必要があります。たとえば、httpdhttpd_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 ユーザーとして実行します。
  1. 以下のコマンドを実行して、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
  2. semanage ユーティリティーを使用して、SELinux で httpd がリッスンできるポートを表示します。
    ~]# semanage port -l | grep -w http_port_t
    http_port_t                    tcp      80, 443, 488, 8008, 8009, 8443
    
  3. /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
    
  4. 以下のコマンドを入力して、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
    
  5. SELinux で、httpd がポート 12345 をリッスンできるようにするには、以下のコマンドが必要です。
    ~]# semanage port -a -t http_port_t -p tcp 12345
  6. httpd を再び起動し、新しいポートをリッスンしていることを確認します。
    ~]# systemctl start httpd.service
  7. httpd が標準以外のポート (この例では TCP 12345) でリッスンできるように SELinux が設定されました。httpd はこのポートで正常に起動します。
  8. 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...]
    


[14] 詳細は、System Administrator's GuideThe Apache HTTP Sever セクションを参照してください。