BIND9 の Response Policy Zone 設定
日本では、児童ポルノサイトのアクセスブロックに使われることの多い RPZ を設定してみる。
目的は、勝手に情報送信されそうなサイトへのアクセスをブロックすること。
今回は自宅ネットワークから Baidu へのアクセスを遮断してみたい。
注意点
ある意味ではドメインを騙るので、下手なブロックをすると意図しない挙動を示す。
特に Web サイト(ポート80)だけをブロックするわけではない*1ことを知らない人もいる。
また、今回の設定では実際に運用されているドメインの応答を書き換えるので、存在しないドメインは応答できない。
ついでに言うと DNSSEC を考慮していないので、DNSSEC 検証とかは必ず失敗する。
参考にしたサイト様など
- http://dnsops.jp/event/20130718/20130718-kume-jipo-blocking-kume-1.pdf
- Chapter 7 - Response Policy Zone
- https://gist.github.com/jt6211/37742011f00caedf982a
- Baidu IMEがクレカ番号など入力情報を勝手に外部送信=超アグレッシブ企業・百度の伝説 : 中国・新興国・海外ニュース&コラム | KINBRICKS NOW(キンブリックス・ナウ)
- まったりlog残し - ESファイルエクスプローラーが謎のIPアドレスへポート80番のアクセスをしているらしいので簡易的に調べてみた
- ASCII.jp:“Baidu IME事件”からIT管理者が学ぶべき本当の教訓とは (1/2)
実際の設定 (ゾーンファイル)
先に、ブロックしたいドメインを記述したゾーンファイルを作る。
本来的には named.conf を書き換えてからゾーンファイルを準備するんだろうけど…
bind9 が読み込むときに全部揃っていれば済む話なわけで、気分的に。
$ su - # cd /var/chroot/bind9/etc/bind/files; pwd # cp -p localhost.zone rpz.zone # vi rpz.zone :%s/^localhost./baidu.com/ ・・・他、記述
ということで、localhost用ゾーンをテンプレート代わりにゾーン作成。
中身は、こんな感じにしてみた。
;; Response Policy Zone $TTL 86400 @ IN SOA localhost. root.localhost. ( 2015041100 ; Serial 10800 ; Refresh after 3 Hours 3600 ; Retry after 1 Hour 604800 ; Expire after 1 Week 86400 ) ; Minimum TTL of 1 Day IN NS localhost. baidu.com IN A 192.168.1.101 *.baidu.com IN A 192.168.1.101 baidu.jp IN A 192.168.1.101 *.baidu.jp IN A 192.168.1.101 baidu.co.jp IN A 192.168.1.101 *.baidu.co.jp IN A 192.168.1.101
ちなみに 192.168.1.101 には、急遽 apache2 をインストールしておいた。
実際の設定 (named.conf)
RPZ 機能を使うことを named.conf の options ステートメントに書く。
# cd /var/chroot/bind9/etc/bind; pwd # [ -d backup ] || mkdir backup # cp -p named.conf backup/named.conf.$(date +'%Y%m%d') # vi named.conf ----- response-policy { zone "rpz.zone"; }; -----
ここで宣言しているゾーン名は、たぶん任意。
# diff named.conf backup/named.conf.$(date +'%Y%m%d') **d** < response-policy { zone "rpz.zone"; }; #
自分の named.conf は、多少脚色*2しているけどこんな感じ。
// home network dns acl "homenetwork" { 192.168.1.0/24; }; acl "bogon" { 0.0.0.0/8; 10.0.0.0/8; 169.254.0.0/16; 172.16.0.0/12; 192.0.2.0/24; 192.168.0.0/24; 192.168.2.0/23; 192.168.4.0/22; 192.168.8.0/21; 192.168.16.0/20; 192.168.32.0/19; 192.168.64.0/18; 192.168.128.0/17; 224.0.0.0/3; }; options { directory "/etc/bind"; allow-transfer { none; }; listen-on port 53 { 127.0.0.1; homenetwork; }; dump-file "/var/dump/cache.dump.db"; statistics-file "/var/dump/named_stats.db"; blackhole { bogon; }; recursion yes; version "unknown"; allow-update { none; }; response-policy { zone "rpz.zone"; }; }; include "named.conf.rndc"; include "named.conf.local"; include "named.conf.zones";
options ステートメントで「RPZ を、この "rpz.zone" ゾーンで使うよ」と宣言した。
次は「"rpz.zone" ゾーンは、このファイルで使うよ」と宣言する。
"named.conf.local" にするか "named.conf.zones" にするかで迷ったけど、一度書いたら書き換える機会がそうそうない "named.conf.local" に書いておく。
これは root.hint とか localhost とか、書いているファイルなので…。
type は master で良い。
file は、さっき作った files/rpz.zone で記述。
# cd /var/chroot/bind9/etc/bind; pwd # cp -p named.conf.local backup/named.conf.local.$(date '+%Y%m%d') # vi named.conf.local # diff named.conf.local backup/named.conf.local.$(date '+%Y%m%d') 4,6d3 < // Response Policy Zone //////////////////////////////////// < zone "rpz.zone" {type master; file "files/rpz.zone"; }; <
# named-checkconf -t /var/chroot/bind9 # rndc reload rndc: connection to remote host closed This may indicate that * the remote server is using an older version of the command protocol, * this host is not authorized to connect, * the clocks are not synchronized, or * the key is invalid.
・・・!!?!!????
named-checkconf は OK なのに rndc がダメとか、どういうこと?
# service bind9 restart [....] Stopping domain name service...: bind9rndc: connect failed: 127.0.0.1#953: connection refused . ok [ ok ] Starting domain name service...: bind9. # rndc status version: 9.8.4-rpz2+rl005.12-P1 (unknown) CPUs found: 4 worker threads: 4 number of zones: 21 debug level: 0 xfers running: 0 xfers deferred: 0 soa queries in progress: 0 query logging is OFF recursive clients: 0/0/1000 tcp clients: 0/100 server is up and running # rndc reload server reload successful # vi /var/chroot/bind9/etc/bind/files/rpz.zone ----- シリアル値をひとつ上げて保存 ----- # rndc reload rndc: connection to remote host closed This may indicate that * the remote server is using an older version of the command protocol, * this host is not authorized to connect, * the clocks are not synchronized, or * the key is invalid. #
どうやら、rpz.zone のシリアルが上がると rndc コマンドが使えなくなるみたい… orz
なんだこれ?
起動は OK なのに rndc コマンドが使えなくなるって…意味がわからない。
とりあえず、クライアント側でアクセスを試みてみると、192.168.1.101 の Web サイトが表示される。
# tail /var/log/syslog Apr 11 13:58:31 raspberrypi named[15566]: client 192.168.1.2#59496: rpz QNAME Local-Data rewrite baidu.co.jp via baidu.co.jp.rpz.zone
うん、ログもきちんと rewrite してくれているのを出している。
service bind9 restart をすれば、とりあえず問題は出ないのを確認。
でも、もうちょっと設定を見直さないと、まずいかもしれないなぁ…