squidインストール(2002.04)
最近はsquidでプロクシサーバを構築する企業って少なくなってるのかもしれないですが
特にキャッシュ領域には高速なストレージをマウントしたりして・・・
今は企業の基幹部ではCacheFlowなんかでしょうか・・・
それともNetCacheでしょうか・・・
でも高価なので手が出ないときはなんといってもオープンソースでしょう!
とうことでsquidでのプロクシのインストールをしてみたいと思います。


【準備】
ダウンロードはこちら
http://www.squid-cache.org/Versions/v2/2.5/
から最新版を落としましょう。
メジャーバージョンの後のSTABLEは数が大きいほど新しくなっています。

【インストール】
前提条件としてSolaris8で構築する場合はここのフリーソフトのインストールは
行っているものとします。Linuxでは特に気にする必要はないです。

[root@home6 squid]# tar zxf squid-2.5.STABLE6-src.tar.gz
[root@home6 squid]# cd squid-2.5.STABLE6

●パッチ適用
apacheのチャンクのセキュリティ勧告に伴って
squidもパッチを適用したほうがいいようです。
パッチの適用は以下のパッチをとってきて当てましょう。
http://www.squid-cache.org/Versions/v2/2.4/bugs/squid-2.4.STABLE6-deny_transfer_encoding.patch
パッチはsquidを展開したディレクトリの中においているものとします。
[root@home3 squid-2.4.STABLE6]# patch -p1 < squid-2.4.STABLE6-deny_transfer_encoding.patch

patching file `src/client_side.c'
Hunk #1 succeeded at 2688 (offset 1 line).
patching file `src/HttpHeader.c'
patching file `src/enums.h'

[root@home6 squid-2.5.STABLE6]# ./configure \
--enable-delay-pools \
--enable-useragent-log \
--enable-referer-log \
--enable-snmp \
--enable-ssl \
--with-openssl \
--disable-internal-dns \
--enable-default-err-language=Japanese \
--enable-err-languages=Japanese 2>&1| tee configure.log
※sslオプションをつけるときは事前にopensslを入れておく。

[root@home6 squid-2.5.STABLE6]# make 2>&1|tee make.log
[root@home6 squid-2.5.STABLE6]# make install 2>&1 |tee make_install.log

【設定】

[root@home6 squid]# vi /usr/local/squid/etc/squid.conf
hierarchy_stoplist cgi-bin ?
acl QUERY urlpath_regex cgi-bin \?
#http_port 8080
http_port 192.168.128.13:3128
※↑↓複数のIPアドレスでリスンしたい場合は複数行記述する
https_port 192.168.128.13:3128

no_cache deny QUERY
cache_mem 8 MB
acl all src 0.0.0.0/0.0.0.0
acl manager proto cache_object
acl localhost src 127.0.0.1/255.255.255.255
acl myhome src 192.168.128.0/255.255.255.0
↑かならず追記デフォルトではローカル以外アクセスできない
acl SSL_ports port 443 563
acl Safe_ports port 80 # http
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 563 # https, snews
acl Safe_ports port 70 # gopher
acl Safe_ports port 210 # wais
acl Safe_ports port 1025-65535 # unregistered ports
acl Safe_ports port 280 # http-mgmt
acl Safe_ports port 488 # gss-http
acl Safe_ports port 591 # filemaker
acl Safe_ports port 777 # multiling http
acl CONNECT method CONNECT

http_access allow manager localhost
http_access allow myhome
↑かならず追記デフォルトではローカル以外アクセスできない
http_access deny manager !myhonme
cachemgrを使う場合は追記  ↑
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access deny all

#icp_access allow all
icp_access deny all

visible_hostname squid.example.com
↑↓これがないと起動時にエラーが出ます。
cache_effective_user cached

cache_effective_user nobody
cache_effective_group nobody
pid_filename /var/run/squid.pid
cache_log /usr/local/squid/logs/cache.log

cache_dir /usr/local/squid/cache 20000 1024 1024
※cache_dir の次は
 ディレクトリ名
 キャッシュ容量MB(20GB)
 サブディレクトリの分割個数(1024個)
 サブディレクトリの下の分割個数(1024個)

cache_mem 512 MB
※squidが使うメモリは指定の2〜3倍になることを計算にいれて
  適切に設定してください。

# ftp_user Squid@
※ftpサイトへのアクセス時に使用するユーザIDになります。
  デフォルトでも別に問題なくアクセスできると思いますが一応
  実際にメールアドレスを入れたほうが良いかも。

  時には実在するメールアドレスでないとアクセスできないときがあるので。
# logfile_rotate 10
※ログファイルを保存する世代数を指定できます。
  squidは"/usr/local/squid/sbin/squid -k rotate"このコマンドを実行すると
  ログのローテーションを実行できます。
  そこで過去のログをどれだけ残すかをここで決めるということになります。
  も週一回とかのローテーションで組んでいてひとつのファイルが大きい場合は
  この数を2とか3にすると良いかもしれません。
  とりあえず運用上様子を見て後から決めてみてください。

# hierarchy_stoplist hotmail.com
※もしHot Mailサイトにうまくアセスでいないとかユーザから苦情来たときは
  この設定を入れておけば何とかいけるはず・・・
※↑このsquid.confは
[root@home6 squid]# grep -v ^# /usr/local/squid/etc/squid.conf.default > /usr/local/squid/etc/squid.conf
を実行してそのファイルを編集したものです。(元のファイルは丁寧なコメント多くて逆にわかりにくいので・・・)
とりあえずは下線の部分ぐらいで最低限squidは起動するでしょう。
明示的にパラメータが入っていない部分はすべてデフォルト設定が適用されます。
各パラメータの詳細については/usr/local/squid.conf.defaultを参照ください。
全ての設定できるパラメータを見たければ
# grep TAG squid.conf
でみれます。
さらにsquid.confに間違いがないかどうかは
# /usr/local/squid/sbin/squid parse
で確認できます。warningやerrorが出ないか確認しておきましょう。

キャッシュディレクトリを作成
[root@home6 squid]# mkdir /usr/local/squid/cache
[root@home6 squid]# chown nobody:nobody /usr/local/squid/cache /usr/local/squid/logs
※squidはデフォルトでnobodyユーザで起動します。特に不都合がない限りnobodyで問題ないでしょう。
  もしもバッファオーバーフローが今後見つかったときに攻撃を受けても、nobodyユーザで実行していれば
  被害はそうひどくないでしょう・・・

※もしかするとLinuxのディストリビューションの中にはnobodyグループがない場合が
  あるかもしれないので確認してください。


・squidの初期化
[root@home6 squid]# /usr/local/squid/sbin/squid -z
※ここでsquid.confに指定したcache_dirディレクティブを参照します。
 実行する前に必ずsquidの起動ユーザがchacheディレクトリに書き込み権がある状態に
しておかないとパーミッションがないと怒られます。

ここまででsquidを起動する準備ができたので実際に起動してみます。
[root@home6 squid]# /usr/local/squid/sbin/squid -D
※squidの起動オプションについては--helpを参照!!

[root@home6 squid]# ps -ef |grep squid

nobody 668 666 0 18:03:33 ? 0:01 (squid) -D
root 666 1 0 18:03:33 ? 0:00 /usr/local/squid/sbin/squid -D
と起動していればsquid自体の起動はOKです。
あとはアクセスリストに加えたネットワークからプロキシを指定してブラウザでアクセスしてみましょう。

・http://  のサイト
・https://  のサイト
・ftp://   のサイト
以上3つぐらい試験をしてみます。起動時にえらーなどがでている場合は
よくメッセージをみてsquid.confをきちんと設定しましょう。

【起動ファイルの設定】
[root@home6 squid]# vi /etc/init.d/squid
#!/bin/sh

PATH=$PATH:/usr/bin:/bin export PATH

case "$1" in
start)
if [ ! -f /var/run/squid.pid ]; then
echo "Squid Starting";
/usr/local/squid/sbin/squid -D -f /usr/local/squid/etc/squid.conf;
else
echo "process squid allready running!\n";
exit 1;
fi
;;


stop)
if [ -f /var/run/squid.pid ]; then
/usr/local/squid/sbin/squid -k kill;
#kill `cat /var/run/squid.pid`;
echo "Squid Stopped";
else
echo "process squid not running!\n";
exit 1;
fi
;;


restart)
"$0" stop;
sleep 1;
"$0" start;
;;
*)
echo "usage: /etc/rc2.d/S99squid {start|stop}"
esac
exit 0
[root@home6 squid]# chown root:sys /etc/init.d/squid
[root@home6 squid]# chmod 744 /etc/init.d/squid
[root@home6 squid]# ln -s /etc/init.d/squid /etc/rc2.d/S99squid

※Linuxであれば/etc/rc.localに記述するか/etc/init.d/squidファイルを作成して
 chkconfigでaddしてlevel 2345でonにしておきましょう。

【ログローテーション】
[root@home6 squid]# EDITOR=vi export EDITOR
[root@home6 squid]# crontab -e
0 4 * * 0 /usr/local/squid/sbin/squid -k rotate > /dev/null 2>&1
毎週日曜の午前4時にログ回しときましょ。
これは様子をみて周期を変えるしかありません。
またsquid.confでの残す世代も適当に調整しましょう。

後はこのログを統計取れるようにすればsquidの運用管理は立ち上がるでしょう。
ログの統計については別ページでそのうち暇を見つけて説明します。

また、ほかにpacの機能やユーザ認証の機能もやってみたい項目の一つです。
透過プロキシは80ポートのhttpリクエストしか使えないので、今ひとつ魅力がありませんね・・・

ログの解析には結構たくさんのフリーなソフトが存在します。
こちらを参考に吟味してください。メジャーなのはCalamarisでしょうか。

あとこの辺からMRTGからsquidの監視をするときの参考になります。
mibの情報については展開したソースファイルの中のsrcディレクトリの中の
mib.txtがあるのでnet-snmpさえ使える人であれば後は自由に監視できると思います。
ただし--enable-snmpつけずにコンパイルしてしまってる場合は、再インストールになるので
必ず運用前にmibで監視するかどうかきちんと決め手おきましょう。

このsquidのインストールはちょいと手抜きだったかもしれません・・・あしからず。
時間があれば後日pacとユーザ認証については検証してみましょ。

【アクセス制限】
●URLでのアクセス制限
・aromanという単語が含まれるサイトを拒否
・http://www.microsoft.co.jpで始まるサイトを拒否

# vi /usr/local/squid/etc/squid.conf
でaclを書いているあたりを探します。
/^acl
そこに以下の2行を追加する

acl deny_url aroman
acl deny_url2 url_regex ^http://www.microsoft.com

そしてhttp_accessでaclを適用している行を探す
/^http_access
その一番最初のhttp_access上に

http_access deny deny_url
http_access deny deny_url2

後はsquidを再起動
# /etc/init.d/squid restart
クライアントからアクセス制御ができているかどうか試してみよう。

のようになればOKでしょう。
このエラーメッセージを変え足りもできます。
あとアダルトサイトを規制したりもできます。

http://squid.robata.org/faq_10.html

が非常に参考になります。


【情報漏洩を防ぐ】
たいしたことはできないが、squidを使ってまず
診断君などを見てみよう。

以下の環境変数が外部に漏れているので
なるべく漏れる情報を少なくしたい。
2.4では制限がありますのでなるべく2.5を使うことをお勧めします。

squid2.4での設定値
変数名 squid.conf設定値 説明
HTTP_X_FORWARDED_FOR forwarded_for off LAN上のローカルIPを外に出さない
HTTP_VIA visible_hostname unknown LAN上のローカルドメイン名を公開しない
HTTP_USER_AGENT anonymize_headers deny User-Agent WWW-Authenticate Link クライアントPCの使用しているブラウザ種別を公開しない
HTTP_USER_AGENT fake_user_agent Mozilla/4.0 (compatible; MSIE 12.3;Windows NT 5.1;) クライアントのブラウザの情報をすべて同じにする。
HTTP_REFERER anonymize_headers deny From Referer Server リンク元の情報を公開しない

squid2.5以上だと

squid2.5での設定値
変数名 squid.conf設定 説明
HTTP_X_FORWARDED_FOR header_access X-Forwarded-For deny all LAN上のローカルIPを外に出さない
HTTP_VIA header_access Via deny all LAN上のローカルドメイン名を外に出さない
HTTP_CACHE_CONTROL header_access Cache-Control deny all CACHE_CONTROL情報を外に出さない

でヘッダー情報を出さないようにできるようです。

同じ設定をsquid2.4でやると

2004/08/17 23:48:43| parseConfigFile: line 2796 unrecognized: 'header_access X-Forwarded-For deny all '
2004/08/17 23:48:43| parseConfigFile: line 2797 unrecognized: 'header_access Via deny all '
2004/08/17 23:48:43| parseConfigFile: line 2798 unrecognized: 'header_access Cache-Control deny all '

となります。なので上記のようなものでしか対応できないでしょう。
squidだと外のサーバに知られないためにはsquid2.5以上をつかった
前述の3行を入れるのがよいでしょう。

この3行をsquid.confの最下行にでも入れておくと
おそらく外のサーバからはproxyとはわかりません。
診断君などで検査してみましょう。