第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 パッケージがインストールされていることを前提としています。
  1. getenforce を実行して、 SELinux が enforcing モードで実行しているか確認します。
    $ getenforce
    Enforcing
    
    SELinux が enforcing モードで実行している場合は、 getenforce コマンドを実行すると Enforcing が返されます。
  2. root ユーザーで service squid start を実行し、 squid を起動します。
    # service squid start
    Starting squid:                                            [  OK  ]
    
  3. 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 ユーザーで実行してください。
  1. service squid status を実行し、 squid が実行中ではないことを確認します。
    # service squid status
    squid is stopped
    
    出力が上記と異なる場合は、 service squid stop を実行してプロセスを停止します。
    # service squid stop
    Stopping squid:                                            [  OK  ]
    
  2. 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
    
    
  3. root ユーザーで /etc/squid/squid.conf を編集します。SELinux ポリシー設定では squid 用に設定していないポートをリッスンするよう http_port オプションを設定します。この例では、ポート 10000 でリッスンするよう squid を設定しています。
    # Squid normally listens to port 3128
    http_port 10000
    
  4. setsebool コマンドを実行し、 squid_connect_any Boolean をオフに設定します。 これで、 squid の動作は特定ポート上に限られることになります。
    setsebool -P squid_connect_any 0
    
  5. 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
    
  6. squid によるポート 10000 のリッスンを SELinux で許可するには、例で使用しているものと同じ次のコマンドが必要になります。
    # semanage port -a -t squid_port_t -p tcp 10000
    
  7. もう一度 service squid start を実行して、 squid を起動させ新しいポートをリッスンするようにします。
    # service squid start
    Starting squid:						   [  OK  ]
    
  8. これで、 squid による非標準のポート (この例では TCP 10000) でのリッスンを許可する SELinux 設定が完了しました。 squid はこのポートで正常に起動するようになります。