第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 パッケージがインストールされていることを前提としています。
- getenforce コマンドを実行して、SELinux が Enforcing モードで実行されていることを確認します。
~]$ getenforce Enforcing
SELinux が Enforcing モードで実行されていると、このコマンドはEnforcing
を返します。 - 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
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 ユーザーとして実行します。
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
squid
がリッスンできるポートを表示するには、以下のコマンドを実行します。~]# semanage port -l | grep -w -i squid_port_t squid_port_t tcp 3401, 4827 squid_port_t udp 3401, 4827
- root で
/etc/squid/squid.conf
を編集します。http_port
オプションを設定して、squid
用の SELinux ポリシー設定で設定されていないポートの一覧を表示するようにします。この例では、デーモンがポート 10000 をリッスンするように設定されています。# Squid normally listens to port 3128 http_port 10000
- setsebool コマンドを実行して、
squid_connect_any
のブール値が off に設定されていることを確認します。これにより、squid
が特定のポートでのみ動作するようになります。~]# setsebool -P squid_connect_any 0
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
- SELinux で、
httpd
がポート 10000 をリッスンできるようにするには、以下のコマンドが必要です。~]# semanage port -a -t squid_port_t -p tcp 10000
squid
を再起動して、新しいポートでリッスンするようにします。~]# systemctl start squid.service
- 現在、SELinux は、標準以外のポート (この例では TCP 10000) で Squid がリッスンできるように設定されており、このポートで正常に起動します。