Red Hat Training

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

第19章 Squid キャッシングプロキシー

Squid は、Web クライアント向けの高パフォーマンスのプロキシーキャッシュサーバーで、FTP、Gopher、および HTTP のデータオブジェクトをサポートします。これにより、帯域幅が削減され、頻繁に要求される Web ページのキャッシュと再利用により応答時間が改善されます。[17]
Red Hat Enterprise Linux では、squid パッケージに Squid キャッシングプロキシーが同梱されています。以下のコマンドを実行して、squid パッケージがインストールされているかどうかを確認します。
~]$ rpm -q squid
package squid is not installed
パッケージがインストールされておらず、squid を使用する場合は、yum ユーティリティーを使って root でインストールします。
~]# yum install squid

19.1. Squid キャッシングプロキシーおよび SELinux

SELinux が有効になると、Squid はデフォルトで制限されて実行します。制限のあるプロセスは、独自のドメインで実行され、他の制限のあるプロセスから分離されます。制限のあるプロセスが攻撃者によって侵害された場合、SELinux ポリシーの設定に応じて、攻撃者のリソースへのアクセスと、攻撃者が行う可能性のある損害は制限されます。以下の例は、独自のドメインで実行している Squid プロセスを示しています。この例では、squid パッケージがインストールされていることを前提としています。
  1. getenforce コマンドを実行して、SELinux が Enforcing モードで実行されていることを確認します。
    ~]$ getenforce
    Enforcing
    
    SELinux が Enforcing モードで実行されていると、このコマンドは Enforcing を返します。
  2. root で次のコマンドを実行して、squid デーモンを起動します。
    ~]# systemctl start squid.service
    サービスが実行中であることを確認します。出力には以下の情報が含まれている必要があります (タイムスタンプのみは異なります)。
    ~]# systemctl status squid.service
    squid.service - Squid caching proxy
       Loaded: loaded (/usr/lib/systemd/system/squid.service; disabled)
       Active: active (running) since Mon 2013-08-05 14:45:53 CEST; 2s ago
  3. squidプロセスを表示するには、次のコマンドを実行します。
    ~]$ ps -eZ | grep squid
    system_u:system_r:squid_t:s0    27018 ?        00:00:00 squid
    system_u:system_r:squid_t:s0    27020 ?        00:00:00 log_file_daemon
    
    squid プロセスに関連付けられた SELinux コンテキストはsystem_u:system_r:squid_t:s0 です。コンテキストの 2 番目の部分 squid_t はタイプです。タイプは、プロセスのドメインとファイルのタイプを定義します。この例では、squid プロセスが squid_t ドメインで実行しています。
SELinux ポリシーは、制限のあるドメイン (squid_tなど) で実行されるプロセスが、ファイル、その他のプロセス、およびシステム一般とどのように対話するかを定義します。squid によるアクセスを可能にするには、ファイルが正しくラベル付けされている必要があります。
/etc/squid/squid.conf ファイルが、デフォルトの TCP ポート 3128、3401、または 4827 以外のポートを squid がリッスンするように設定されている場合は、semanage port コマンドを使用して、必要なポート番号を SELinux ポリシー設定に追加する必要があります。以下の例では、SELinux ポリシー設定で最初に定義されていないポートをリッスンするように squid を設定すると、サーバーが起動しなくなります。また、この例では、ポリシーで定義されていない標準以外のポートをデーモンが正常にリッスンできるように SELinux システムを設定する方法も示しています。この例では、squid パッケージがインストールされていることを前提としています。この例では、各コマンドを root ユーザーとして実行します。
  1. squid デーモンが実行していないことを確認します。
    ~]# systemctl status squid.service
    squid.service - Squid caching proxy
       Loaded: loaded (/usr/lib/systemd/system/squid.service; disabled)
       Active: inactive (dead)
    
    出力が異なる場合は、プロセスを停止します。
    ~]# systemctl stop squid.service
  2. squid がリッスンできるポートを表示するには、以下のコマンドを実行します。
    ~]# semanage port -l | grep -w -i squid_port_t
    squid_port_t                   tcp      3401, 4827
    squid_port_t                   udp      3401, 4827
    
    
  3. root で/etc/squid/squid.conf を編集します。http_port オプションを設定して、squid 用の SELinux ポリシー設定で設定されていないポートの一覧を表示するようにします。この例では、デーモンがポート 10000 をリッスンするように設定されています。
    # Squid normally listens to port 3128
    http_port 10000
    
  4. setsebool コマンドを実行して、squid_connect_any のブール値が off に設定されていることを確認します。これにより、squid が特定のポートでのみ動作するようになります。
    ~]# setsebool -P squid_connect_any 0
  5. squid デーモンを起動します。
    ~]# systemctl start squid.service
    Job for squid.service failed. See 'systemctl status squid.service' and 'journalctl -xn' for details.
    
    以下のような SELinux 拒否メッセージが記録されます。
    localhost setroubleshoot: SELinux is preventing the squid (squid_t) from binding to port 10000. For complete SELinux messages. run sealert -l 97136444-4497-4fff-a7a7-c4d8442db982
    
  6. SELinux で、httpd がポート 10000 をリッスンできるようにするには、以下のコマンドが必要です。
    ~]# semanage port -a -t squid_port_t -p tcp 10000
  7. squid を再起動して、新しいポートでリッスンするようにします。
    ~]# systemctl start squid.service
  8. 現在、SELinux は、標準以外のポート (この例では TCP 10000) で Squid がリッスンできるように設定されており、このポートで正常に起動します。


[17] 詳細は、Squid キャッシングプロキシー プロジェクトページを参照してください。