暑い夏2020、DNSと戯れていました。
レジストラの脆弱性でDNSが改竄されてサイトがハッキングされる事件を見て、これを防ぐ方法がなかったので7月末にDNS改ざん検知ツール NSchecker を作って公開しました。
結論
忙しい方のために結論だけ先に。NSchecker Ver0.03ではDNS改竄検知速度が60秒程度に大幅改善しました!(Ver0.01では最大48時間の検知遅延)
NScheckerのソースコードはこちら。
詳細
このツールはDNSのNSレコードが改竄されるとSlackで通知できる(slack以外も可能)ため便利だったのですが、NSレコードの参照がDNSキャッシュサーバだったため検知が最大で48時間ぐらいかかる問題がありました。(NSchecker Ver 0.01)
無いよりはマシなツール程度になってしまっていたので、この問題を解決しなくてはと思い、夏季休暇を利用して問題を解決しました。(NSchecker Ver 0.03)
このテスト用にドメインを取得し、whoisに出てくるNSサーバの情報を書き換えて試したところ、Ver0.03では数秒程度で改竄を検知しました。Ver0.01では数時間たっても検知できていませんでした。
ツールの前提
Ver 0.03では、.com .net .jpの3つのドメインかつ、セカンドレベルドメインに限定してDNSキャッシュサーバを利用しない形にしました。(Ver 0.04ではサードレベルドメインにも対応)
例えば、vaddy.net はこの条件を満たしているためキャッシュサーバは利用されず検知速度も数秒程度になります。
foo.bar.co.jpのように4レベルドメインやexample.infoのようなドメインは引き続きローカルのDNSキャッシュサーバが利用されますのでご注意ください。
Ver1.0.0で全ドメイン対応しました。
今後の課題
上記の前提の改善を行うかもしれません。 .infoなどのドメインに対応するのは簡単なので要望があれば教えてください。
4階層以上のドメインの対応は、反復的に権威サーバに問い合わせていかないといけないため、対応するかどうかはわかりません。
上記、Ver1.0.0で全ドメインに対応しました。
雑記
今回、DNSパケットを自力で作ってみて、ビット単位のフォーマットをgolangで扱ってみました。通信はBig Endianだったり、DNSの応答パケットは512byte制限があるため解決したNSレコードが圧縮されてたりと、DNSのフォーマットレベルで理解できて楽しかったです。tcpdumpで1バイト単位でDNSフォーマットと比較してみたり、RFC1035を読んだり、たのしい夏の休暇となりました。