DNSのログに以下のような不正問い合わせ(オープンリレーならば踏み台にしてやろう的な)の痕跡ログが大量にあり、精神衛生上良くないので対処することにしました。
Feb 13 20:47:38 kamatans named[1347]: client @0x7fa3ac0106b0 121.75.182.126#6672 (sl): view external: query (cache) 'sl/ANY/IN' denied Feb 13 20:47:38 kamatans named[1347]: client @0x7fa3ac0106b0 121.75.182.126#6672 (sl): view external: query (cache) 'sl/ANY/IN' denied Feb 13 20:47:38 kamatans named[1347]: client @0x7fa3ac0106b0 121.75.182.126#6672 (sl): view external: query (cache) 'sl/ANY/IN' denied Feb 13 20:47:39 kamatans named[1347]: client @0x7fa3ac0106b0 121.75.182.126#6672 (sl): view external: query (cache) 'sl/ANY/IN' denied Feb 13 20:47:39 kamatans named[1347]: client @0x7fa3ac0106b0 121.75.182.126#6672 (sl): view external: query (cache) 'sl/ANY/IN' denied Feb 13 20:47:40 kamatans named[1347]: client @0x7fa3ac0106b0 121.75.182.126#6672 (sl): view external: query (cache) 'sl/ANY/IN' denied
/etc/named.conf(named-chrootの場合は/var/named/chroot/etc/named.conf)の中でoptionsセクション中のblackholeを定義することで、定義されたIPアドレスからの応答に応えない設定となります。
ですので、
options { listen-on port 53 { any; }; listen-on-v6 port 53 { any; }; directory "/var/named"; dump-file "/var/named/data/cache_dump.db"; statistics-file "/var/named/data/named_stats.txt"; memstatistics-file "/var/named/data/named_mem_stats.txt"; secroots-file "/var/named/data/named.secroots"; recursing-file "/var/named/data/named.recursing"; allow-query { my-network; my-network-ipv6; }; blackhole { 1.2.3.4; #拒否したいIPアドレスの例 5.6.7.8; };
のように定義すればいいのですが、キリがない。後から後から新たなIPアドレスからの問い合わせがあります。
ですので、自動化することにしました。
まずはblackhole部分を切り出して外部ファイル定義化します。
include "/etc/blacklist.txt"; options { listen-on port 53 { any; }; listen-on-v6 port 53 { any; }; directory "/var/named"; dump-file "/var/named/data/cache_dump.db"; statistics-file "/var/named/data/named_stats.txt"; memstatistics-file "/var/named/data/named_mem_stats.txt"; secroots-file "/var/named/data/named.secroots"; recursing-file "/var/named/data/named.recursing"; allow-query { my-network; my-network-ipv6; }; blackhole { black-list; };
上記のように21行目で/etc/blacklist.txt(実際は/var/named/chroot/etc/blacklist.txt)を読み込み、このファイルの中で以下のようにblacklistを定義し、それを33行目で指定します。
acl "blacklist" { };
1時間に一度上記blacklist.txtを自動生成して、systemctl reload named-chrootすることにします。
/etc/cron.hourlyに以下のスクリプトを配置します。
#!/bin/bash FILE=/var/log/messages LIST=/var/named/chroot/etc/blacklist.txt # Feb 8 10:04:38 kamatans named[1318]: client @0x7f7d6c01bca0 174.101.79.68#6672 (sl): view external: query (cache) 'sl/ANY/IN' denied echo "acl \"black-list\" {" > $LIST cat $FILE | grep 'denied' | grep 'view external' | grep -v 'inao.jp' \ | awk '{print $8}' | awk -F '#' '{print $1}' | sort | uniq -c \ | awk '$1 > 20 {print $2";"}' >> $LIST echo "};" >> $LIST systemctl reload named-chroot
上記スクリプトでは、syslog中に「denied」と「view external」を含む行を抜き出し、IPアドレス部分をawkで抜き出した後、sortし、出現回数付きのユニーク化(uniq -c)をしています。出現回数が20回より大きいIPアドレスについて/var/named/chroot/etc/blacklist.txtに吐き出しています。
ちょうどログがローテーションされて1つもIPアドレスがなかった場合についてはnamed-chrootのreloadに失敗しそうな気がしますが…。そんなことはないぐらいアクセスが来ているので一旦これで良しとします。
1日で545件のリストができるほどです…。
おまけ
オープンリレーになっていないかはDNSを構築する管理者それぞれがちゃんと責任を持って確認するようにしましょう。以下のサイトで「オープンリゾルバの確認に進む」をクリックするだけで簡単にチェックできます。
記事は以上!