labunix's blog

labunixのラボUnix

下位プロキシサーバとして、Squid3+SquidGuardを導入する。

■下位プロキシサーバとして、Squid3+SquidGuardを導入する。
 上位プロキシサーバのSquid3+SquidGuardは後述の設定に
 以下のようなブロックリストがあったり、
 ACL等も若干厳しく設定してあるが、ここでは触れない。

 Squid3のブロックリストを設定してみる。
 http://labunix.hateblo.jp/entry/20151012/1444653178

$ lsb_release -d
Description:	Debian GNU/Linux 8.2 (jessie)

■プロキシを通らないと外部に出れない環境なのでまずはSquid3の設定を。
 「localnet」として定義した「172.16.0.0/12」からのアクセスを許可、
 「cache_peer」と「never_direct」の2行の上位プロキシサーバに渡す。

 若干の隠蔽用の設定は通常は要らない。
 また、ユーザエージェントが「Gozzilla」だったり、
 そもそもユーザエージェントを書き換えること自体に不都合があるかも知れない。

$ cat /etc/apt/apt.conf
Acquire::http::Proxy "http://172.31.31.254:3128/";

$ sudo apt-get install -y squid3
$ sudo cp /etc/squid3/squid.con{f,f.bak}
$ sudo diff /etc/squid3/squid.conf* | awk '/^</{ print substr($0,3)}'
acl localnet src 172.16.0.0/12	# RFC1918 possible internal network
http_access allow localnet
http_port 8080
cache_peer 172.31.31.254       parent    3128  0  default
never_direct allow all
logformat combined   %>a %[ui %[un [%tl] "%rm %ru HTTP/%rv" %>Hs %<st "%{Referer}>h" "%{User-Agent}>h" %Ss:%Sh
access_log daemon:/var/log/squid3/access.log combined
via off
request_header_access User-Agent deny all
request_header_replace User-Agent Gozilla/5.0
visible_hostname unknown_internal
dns_nameservers 172.31.31.251
forwarded_for off

■プロキシの設定
 「profile」はログイン時に読み込む設定のため、
 反映させるには再ログインが必要。
 「apt」は毎回読み込むので再ログインは要らない。

$ cat /etc/apt/apt.conf
#Acquire::http::Proxy "http://172.31.31.254:3128/";
Acquire::http::Proxy "http://172.31.31.60:8080/";

$ cat /etc/profile.d/proxy.sh 
#!/bin/bash
export http_proxy=http://172.31.31.60:8080
export ftp_proxy=http://172.31.31.60:8080
export HTTP_PROXY=http://172.31.31.60:8080
export FTP_PROXY=http://172.31.31.60:8080

■SquidGuard連携
 wheezyでもjessieでもSquidGuard連携はずっと継続してきたので、
 大した量ではないけれど、メンテナンスしてきた
 「personal」や「whitelist」の資産がある。
 また、ブロック時にクライアントはリダイレクトページを返されるので
 タイムアウトを待つ必要がなく、サーバ側にはブロックログが出るので
 とても良い。

 Debian Lenny にsquidGuardを導入
 http://d.hatena.ne.jp/labunix/20120311

 SqueezeにもsquidGuardを導入
 http://d.hatena.ne.jp/labunix/20120312

 debian SquidGuardでブロックログを出力
 http://d.hatena.ne.jp/labunix/20120315

■「upper-squid」に「personal」があるものとして。

$ scp -r upper-squid:/var/lib/squidguard/db/{personal,whitelist} .
domains                                                     100%  162     0.2KB/s   00:00    
urls.db                                                     100% 8192     8.0KB/s   00:00    
domains.db                                                  100% 8192     8.0KB/s   00:00    
urls                                                        100%  162     0.2KB/s   00:00    
domains                                                     100%   36     0.0KB/s   00:00    
urls.db                                                     100% 8192     8.0KB/s   00:00    
domains.db                                                  100% 8192     8.0KB/s   00:00    
urls                                                        100%   37     0.0KB/s   00:00    

$ sudo apt-get install -y squidguard
$ cd /var/lib/squidguard/db/
$ wget http://squidguard.mesd.k12.or.us/blacklists.tgz
$ tar zxvf blacklists.tgz
$ sudo mv blacklists/* /var/lib/squidguard/db/
$ sudo mv {personal,whitelist} /var/lib/squidguard/db/
$ sudo chown proxy:proxy -R /var/lib/squidguard/db/*
$ sudo find /var/lib/squidguard/db -type f -exec chmod 644 {} \;
$ sudo find /var/lib/squidguard/db -type d -exec chmod 755 {} \;
$ sudo -u proxy /usr/bin/squidGuard -d -C all
2015-11-14 19:55:44 [6748] INFO: New setting: dbhome: /var/lib/squidguard/db
2015-11-14 19:55:44 [6748] INFO: New setting: logdir: /var/log/squidguard
2015-11-14 19:55:44 [6748] Added User: root
2015-11-14 19:55:44 [6748] Added User: foo
2015-11-14 19:55:44 [6748] Added User: bar
2015-11-14 19:55:44 [6748] destblock good missing active content, set inactive
2015-11-14 19:55:44 [6748] destblock local missing active content, set inactive
2015-11-14 19:55:44 [6748] destblock porn missing active content, set inactive
2015-11-14 19:55:44 [6748] INFO: squidGuard 1.5 started (1447498544.193)
2015-11-14 19:55:44 [6748] INFO: db update done
2015-11-14 19:55:44 [6748] INFO: squidGuard stopped (1447498544.204)

■デフォルト設定でも「foo」や「bar」ユーザを許可するのはおかしいので
 削除してバックアップを取得。

$ sudo sed -i -e 's/foo bar//' /etc/squidguard/squidGuard.conf
$ sudo cp -pi /etc/squidguard/squidGuard.con{f,f.bak}

■ACL設定
 DBの生成時間の短縮のために「domains」と「urls」が2000より小さいディレクトリに限定している。
 その分「personal」に重複分があるのだけど、ここでは触れない。
 また、別の方式でこのプロキシサーバにアクセスする手段が限られているので送信元を制限していない。
 制限と言えば、設定ファイルの「{}」内にコメントをつけてはいけないという変な制限があるので注意。

$ wc -l */*s | awk -F\/ '!/whitelist/{print $1}' | \
    awk '/[a-z]$/{cnt[$2]+=$1};END{for (key in cnt){if(cnt[key]<2000){print key}}}' | \
    awk 'BEGIN {print "dbhome /var/lib/squidguard/db"; \
                print "logdir /var/log/squidguard"; \
                print "dest whitelist {"; \
                print "\tdomainlist whitelist/domains"; \
                print "\turllist    whitelist/urls"; \
                print "\tlogfile /var/log/squidguard/block/whitelist.log"; \
                print "\tredirect http://172.31.31.254/block.html"; \
                print "}";} \
               {print "dest "$1" {"; \
                print "\tdomainlist "$1"/domains"; \
                print "\turllist    "$1"/urls"; \
                print "\tlogfile /var/log/squidguard/block/"$1".log"; \
                print "\tredirect http://172.31.31.254/block.html"; \
                print "}";} \
         END   {print "acl {"; \
                print "\tdefault {"; \
                print "\t\tpass whitelist"; \
                print "\t\tredirect http://172.31.31.254/block.html"; \
                print "\t}"; \
                print "}"}' | sudo tee /etc/squidguard/squidGuard.conf
dbhome /var/lib/squidguard/db
logdir /var/log/squidguard
dest whitelist {
	domainlist whitelist/domains
	urllist    whitelist/urls
	logfile /var/log/squidguard/block/whitelist.log
	redirect http://172.31.31.254/block.html
}
dest aggressive {
	domainlist aggressive/domains
	urllist    aggressive/urls
	logfile /var/log/squidguard/block/aggressive.log
	redirect http://172.31.31.254/block.html
}
dest hacking {
	domainlist hacking/domains
	urllist    hacking/urls
	logfile /var/log/squidguard/block/hacking.log
	redirect http://172.31.31.254/block.html
}
dest warez {
	domainlist warez/domains
	urllist    warez/urls
	logfile /var/log/squidguard/block/warez.log
	redirect http://172.31.31.254/block.html
}
dest drugs {
	domainlist drugs/domains
	urllist    drugs/urls
	logfile /var/log/squidguard/block/drugs.log
	redirect http://172.31.31.254/block.html
}
dest mail {
	domainlist mail/domains
	urllist    mail/urls
	logfile /var/log/squidguard/block/mail.log
	redirect http://172.31.31.254/block.html
}
dest suspect {
	domainlist suspect/domains
	urllist    suspect/urls
	logfile /var/log/squidguard/block/suspect.log
	redirect http://172.31.31.254/block.html
}
dest personal {
	domainlist personal/domains
	urllist    personal/urls
	logfile /var/log/squidguard/block/personal.log
	redirect http://172.31.31.254/block.html
}
dest ads {
	domainlist ads/domains
	urllist    ads/urls
	logfile /var/log/squidguard/block/ads.log
	redirect http://172.31.31.254/block.html
}
dest violence {
	domainlist violence/domains
	urllist    violence/urls
	logfile /var/log/squidguard/block/violence.log
	redirect http://172.31.31.254/block.html
}
acl {
	default {
		pass whitelist
		redirect http://172.31.31.254/block.html
	}
}

■上記では宛先が「whitelist」に無いと通過しないので、以下を追加する。

$ sudo -u proxy awk '/^dest / && !/whitelist/ {printf "!"$2" "};END{print "all"}' /etc/squidguard/squidGuard.conf
!aggressive !hacking !warez !drugs !mail !suspect !personal !ads !violence

$ sudo sed -i -e \
    's/pass whitelist$/pass whitelist !aggressive !hacking !warez !drugs !mail !suspect !personal !ads !violence all/' \
     /etc/squidguard/squidGuard.conf; \
  sudo chown proxy:proxy /etc/squidguard/squidGuard.conf

■存在しないACLファイルやログディレクトリを作成しておく。

$ ls */*s | awk -F\/ '!/whitelist/{print $1}' | \
    awk '{print "touch "$1"/doamins;";print "touch "$1"/urls;"}' | sudo -u proxy sh

$ sudo -u proxy /var/log/squidguard/block/

■squidguardのdb作成
 小さなDBしか使わないのでほぼ一瞬で終わる。

$ sudo -u proxy /usr/bin/squidGuard -d -C all
2015-11-14 22:14:07 [8510] INFO: New setting: dbhome: /var/lib/squidguard/db
2015-11-14 22:14:07 [8510] INFO: New setting: logdir: /var/log/squidguard
2015-11-14 22:14:07 [8510] init domainlist /var/lib/squidguard/db/whitelist/domains
2015-11-14 22:14:07 [8510] INFO: create new dbfile /var/lib/squidguard/db/whitelist/domains.db
2015-11-14 22:14:07 [8510] init urllist /var/lib/squidguard/db/whitelist/urls
2015-11-14 22:14:07 [8510] INFO: create new dbfile /var/lib/squidguard/db/whitelist/urls.db
2015-11-14 22:14:07 [8510] init domainlist /var/lib/squidguard/db/aggressive/domains
2015-11-14 22:14:07 [8510] INFO: create new dbfile /var/lib/squidguard/db/aggressive/domains.db
2015-11-14 22:14:07 [8510] init urllist /var/lib/squidguard/db/aggressive/urls
2015-11-14 22:14:07 [8510] INFO: create new dbfile /var/lib/squidguard/db/aggressive/urls.db
2015-11-14 22:14:07 [8510] init domainlist /var/lib/squidguard/db/hacking/domains
2015-11-14 22:14:07 [8510] INFO: create new dbfile /var/lib/squidguard/db/hacking/domains.db
2015-11-14 22:14:07 [8510] init urllist /var/lib/squidguard/db/hacking/urls
2015-11-14 22:14:07 [8510] INFO: create new dbfile /var/lib/squidguard/db/hacking/urls.db
2015-11-14 22:14:07 [8510] init domainlist /var/lib/squidguard/db/warez/domains
2015-11-14 22:14:07 [8510] INFO: create new dbfile /var/lib/squidguard/db/warez/domains.db
2015-11-14 22:14:07 [8510] init urllist /var/lib/squidguard/db/warez/urls
2015-11-14 22:14:07 [8510] INFO: create new dbfile /var/lib/squidguard/db/warez/urls.db
2015-11-14 22:14:07 [8510] init domainlist /var/lib/squidguard/db/drugs/domains
2015-11-14 22:14:07 [8510] INFO: create new dbfile /var/lib/squidguard/db/drugs/domains.db
2015-11-14 22:14:07 [8510] init urllist /var/lib/squidguard/db/drugs/urls
2015-11-14 22:14:07 [8510] INFO: create new dbfile /var/lib/squidguard/db/drugs/urls.db
2015-11-14 22:14:07 [8510] init domainlist /var/lib/squidguard/db/mail/domains
2015-11-14 22:14:07 [8510] INFO: create new dbfile /var/lib/squidguard/db/mail/domains.db
2015-11-14 22:14:07 [8510] init urllist /var/lib/squidguard/db/mail/urls
2015-11-14 22:14:07 [8510] urllist empty, removed from memory
2015-11-14 22:14:07 [8510] init domainlist /var/lib/squidguard/db/suspect/domains
2015-11-14 22:14:07 [8510] INFO: create new dbfile /var/lib/squidguard/db/suspect/domains.db
2015-11-14 22:14:07 [8510] init urllist /var/lib/squidguard/db/suspect/urls
2015-11-14 22:14:07 [8510] urllist empty, removed from memory
2015-11-14 22:14:07 [8510] init domainlist /var/lib/squidguard/db/personal/domains
2015-11-14 22:14:07 [8510] INFO: create new dbfile /var/lib/squidguard/db/personal/domains.db
2015-11-14 22:14:07 [8510] init urllist /var/lib/squidguard/db/personal/urls
2015-11-14 22:14:07 [8510] INFO: create new dbfile /var/lib/squidguard/db/personal/urls.db
2015-11-14 22:14:07 [8510] init domainlist /var/lib/squidguard/db/ads/domains
2015-11-14 22:14:07 [8510] INFO: create new dbfile /var/lib/squidguard/db/ads/domains.db
2015-11-14 22:14:07 [8510] init urllist /var/lib/squidguard/db/ads/urls
2015-11-14 22:14:07 [8510] INFO: create new dbfile /var/lib/squidguard/db/ads/urls.db
2015-11-14 22:14:07 [8510] init domainlist /var/lib/squidguard/db/violence/domains
2015-11-14 22:14:07 [8510] INFO: create new dbfile /var/lib/squidguard/db/violence/domains.db
2015-11-14 22:14:07 [8510] init urllist /var/lib/squidguard/db/violence/urls
2015-11-14 22:14:07 [8510] INFO: create new dbfile /var/lib/squidguard/db/violence/urls.db
2015-11-14 22:14:07 [8510] INFO: squidGuard 1.5 started (1447506847.331)
2015-11-14 22:14:07 [8510] INFO: db update done
2015-11-14 22:14:07 [8510] INFO: squidGuard stopped (1447506847.374)

■Squid3と連携する設定を「# ACCESS CONTROLS」の手前に挿入。

$ ls -l /etc/squidguard/squidGuard.conf /usr/bin/squidGuard
-rw-r----- 1 proxy proxy  1792 1114 23:20 /etc/squidguard/squidGuard.conf
-rwxr-xr-x 1 root  root  96280 1226  2014 /usr/bin/squidGuard

$ sudo cp /etc/squid3/squid.con{f,f.`date '+%Y%m%d'`}
$ sudo diff /etc/squid3/squid.con{f,f.`date '+%Y%m%d'`}
582,585d581
< redirect_program /usr/bin/squidGuard -c /etc/squidguard/squidGuard.conf
< redirect_children 8
< redirector_bypass on
< 

■旧来の「/etc/init.d/squid3 restart」は結果的にsystemdを呼び出すので、
 どちらでも良い。

$ sudo squid3 -k check
$ sudo /etc/init.d/squid3 restart || sudo systemctl restart squid3.service

■2000行以下の「www」で始まるドメインリストのみでアクセステスト
 ※ホワイトリストについては、通過が意図した動作なので問題ありませんが、
  ブラックリストについては上位で必ずブロック出来る環境で試してください。

$ wc -l */*s | awk -F\/ '{print $1}' | \
  awk '/[a-z]$/{cnt[$2]+=$1};END{for (key in cnt){if(cnt[key]<2000){print "grep ^www "key"/domains"}}}' | \
  sh | awk '{print "w3m -dump "$1" | head -2"}' | sh
Deny Pages!

Deny Pages!

Deny Pages!

Deny Pages!

ログイン/サインアップ
*
ナビゲーションをスキップ
JP

■ログに残ることを確認

$ sudo find /var/log/squidguard/block/ -type f -size +1 -ls
2622864    4 -rw-r--r--   1 proxy    proxy        1219 1114 23:22 /var/log/squidguard/block/personal.log

■IPv6の無効

$ sudo netstat -anp | grep ^..p6
udp6       0      0 ::1:49566               ::1:50151               ESTABLISHED 11869/(pinger)  

$ sudo grep "^pinger\|0.0.0.0\$" /etc/squid3/squid.conf
pinger_enable off
udp_incoming_address 0.0.0.0
udp_outgoing_address 0.0.0.0

$ sudo squid3 -k check && sudo squid3 -k reconfigure