第20章 Squid キャッシングプロキシ

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

20.1. Squid キャッシングプロキシと SELinux

SELinux を有効にすると、squid はデフォルトで制限のあるサービスとして実行されます。制限のあるプロセスはそれ自体のドメイン内で実行され、他の制限のあるプロセスとは分離されます。制限のあるプロセスが攻撃を受けると、SELinux ポリシー設定に応じて、攻撃側のリソースへのアクセスと攻撃者による被害は限定されます。以下で squid が自身のドメイン内で実行している 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 ファイルを設定して、squid がデフォルトの TCP ポート 3128、3401、4827 以外のポートでリッスンするようにするには、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. 以下のコマンドを実行して、SELinux で 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 を編集します。SELinux ポリシー設定では squid 用に設定していないポートをリッスンするよう http_port オプションを設定します。この例では、このデーモンがポート 10000 でリッスンするよう設定します。
    # Squid normally listens to port 3128
    http_port 10000
  4. setsebool コマンドを実行し、squid_connect_any ブール値をオフに設定します。これで、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 で squid がこの例で使用しているポート 10000 をリッスンできるようにするには、以下のコマンドが必要になります。
    ~]# semanage port -a -t squid_port_t -p tcp 10000
  7. squid を再起動して、新規ポートをリッスンするようにします。
    ~]# systemctl start squid.service
  8. これで、Squid が非標準ポート (この例では TCP 10000) でリッスンできるように SELinux を設定したので、このデーモンはこのポートで正常に起動するようになります。


[17] 詳細情報は、Squid Caching Proxy プロジェクトページを参照してください。

このページには機械翻訳が使用されている場合があります (詳細はこちら)。