Linux Server

BindのBlackholeを自動化する

ご注意下さい

この記事は3年以上前に書かれた記事ですので、内容が古い可能性があります。

0
(0)

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を構築する管理者それぞれがちゃんと責任を持って確認するようにしましょう。以下のサイトで「オープンリゾルバの確認に進む」をクリックするだけで簡単にチェックできます。

オープンリゾルバ確認結果

blog.kamata-net.comのDNSはオープンリゾルバではありません

記事は以上!

この記事は役に立ちましたか? | Is this article useful for you?

評価をお願いします | Please leave your rating.

平均 | Av.: 0 / 5. 投票数 | Votes: 0

最初の評価を下さい | Please vote for the first rating.

-Linux Server
-, , ,

© 1999 - 2021 蒲田ネット