第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 EnforcingSELinux が 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 unlinkdsquidプロセスに関連する 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_anyBoolean をオフに設定します。 これで、 squid の動作は特定ポート上に限られることになります。setsebool -P squid_connect_any 0service 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-c4d8442db982squidによるポート 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はこのポートで正常に起動するようになります。