第9章 Squid キャッシングプロキシ
Squid Caching Proxy プロジェクトページより抜粋:
原文: "Squid is a caching proxy for the Web supporting HTTP, HTTPS, FTP, and more. It reduces bandwidth and improves response times by caching and reusing frequently-requested web pages. Squid has extensive access controls and makes a great server accelerator." (訳文: Squid とは HTTP、 HTTPS、 FTP などに対応する Web 用キャッシングプロキシです。 頻繁に要求される Web ページをキャッシングして再利用することで帯域幅の使用を抑えます。 Squid は豊富なアクセス制御機能が備わっている強力なサーバーアクセラレーターになります。)
Red Hat Enterprise Linux では、 Squid キャッシングプロキシは squid パッケージにより提供されます。
rpm -q squid
を実行して squid パッケージがインストールされているか確認します。squid を使用する予定にも関わらず、このパッケージがインストールされていない場合は、root ユーザーで次のコマンドを実行してパッケージのインストールを行ないます。
# yum install squid
9.1. Squid キャッシングプロキシと SELinux
SELinux を有効にすると、 squid はデフォルトで制限のあるサービスとして実行されます。 制限のあるプロセスはそれ自体のドメイン内で実行され、 他の制限のあるプロセスとは分離されます。 制限のあるプロセスが攻撃を受けると、 SELinux ポリシー設定に応じて、 攻撃側がリソースにアクセスして加えることができる被害は限定されます。 以下に、 squid 自体のドメイン内で実行している squid プロセスの例を示します。 ここでは squid パッケージがインストールされていることを前提としています。
getenforce
を実行して、 SELinux が enforcing モードで実行しているか確認します。$ getenforce Enforcing
SELinux が enforcing モードで実行している場合は、getenforce
コマンドを実行するとEnforcing
が返されます。- root ユーザーで
service squid start
を実行し、squid
を起動します。# service squid start Starting squid: [ OK ]
ps -eZ | grep squid
を実行し、squid
プロセスを表示させます。$ ps -eZ | grep squid unconfined_u:system_r:squid_t:s0 2522 ? 00:00:00 squid unconfined_u:system_r:squid_t:s0 2524 ? 00:00:00 squid unconfined_u:system_r:squid_t:s0 2526 ? 00:00:00 ncsa_auth unconfined_u:system_r:squid_t:s0 2527 ? 00:00:00 ncsa_auth unconfined_u:system_r:squid_t:s0 2528 ? 00:00:00 ncsa_auth unconfined_u:system_r:squid_t:s0 2529 ? 00:00:00 ncsa_auth unconfined_u:system_r:squid_t:s0 2530 ? 00:00:00 ncsa_auth unconfined_u:system_r:squid_t:s0 2531 ? 00:00:00 unlinkd
squid
プロセスに関連する SELinux コンテキストはunconfined_u:system_r:squid_t:s0
です。 コンテキストの最後から 2 番目の部分、squid_t
がタイプになります。 プロセスのドメインやファイルのタイプを定義するのがタイプです。 この例の場合、squid
プロセスはsquid_t
ドメイン内で実行しています。
squid_t
などの制限ドメイン内で実行しているプロセスがファイルや他のプロセス、 システムなどとどのように交信するのかをSELinux ポリシーで定義します。squid によるアクセスを許可するには、 ファイルに適切なラベルを付けを行なう必要があります。
/etc/squid/squid.conf
を設定して、squid
にデフォルトの TCP ポート 3128、3401、4827 以外のポートでリッスンさせる場合は、semanage port
コマンドを使って SELinux ポリシー設定にそのポート番号を追加する必要があります。以下では、SELinux ポリシー設定では最初 squid
用には定義されていなかったポートでリッスンするよう squid
を設定したため、squid
の起動に失敗する例を示します。また、SELinux システムを設定し、ポリシーではまだ定義されていなかった非標準のポートで squid
によるリッスンを許可する方法についても示します。ここでは、squid パッケージがインストールされていることを前提としています。各コマンドは root ユーザーで実行してください。
service squid status
を実行し、squid
が実行中ではないことを確認します。# service squid status squid is stopped
出力が上記と異なる場合は、service squid stop
を実行してプロセスを停止します。# service squid stop Stopping squid: [ OK ]
semanage port -l | grep -w squid_port_t
を実行して、 SELinux で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
を編集します。SELinux ポリシー設定ではsquid
用に設定していないポートをリッスンするようhttp_port
オプションを設定します。この例では、ポート 10000 でリッスンするようsquid
を設定しています。# Squid normally listens to port 3128 http_port 10000
setsebool
コマンドを実行し、squid_connect_any
Boolean をオフに設定します。 これで、 squid の動作は特定ポート上に限られることになります。setsebool -P squid_connect_any 0
service squid start
を実行し、squid
を起動します。# service squid start Starting squid: .................... [FAILED]
以下のような 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
squid
によるポート 10000 のリッスンを SELinux で許可するには、例で使用しているものと同じ次のコマンドが必要になります。# semanage port -a -t squid_port_t -p tcp 10000
- もう一度
service squid start
を実行して、squid
を起動させ新しいポートをリッスンするようにします。# service squid start Starting squid: [ OK ]
- これで、
squid
による非標準のポート (この例では TCP 10000) でのリッスンを許可する SELinux 設定が完了しました。squid
はこのポートで正常に起動するようになります。