Code Day's Night

ichikawayのブログ

DNS改竄検知ツールをgolangで作った(Slack通知付き)

DNSのNSレコード、MXレコードの改竄を検知(変更検知)し、オプションでSlack通知もできるツールを公開しました。

https://github.com/ichikaway/nschecker

Go言語で開発し、LinuxとMacのバイナリもダウンロードできます。 すぐに実行できるため、cron指定しておけば意図しないレコードの変更がわかります。

作った経緯

最近、ドメインハイジャックの事件を目にするよになりました。

DNS設定の改ざんによるドメイン名ハイジャックに注意喚起(JPRS) | ScanNetSecurity

2020年6月にコインチェックのドメインハイジャック事件が起きています。

コインチェックのドメインハイジャックの手法を調査した - Shooting!!!

この記事を読むと、改竄されたレコードは、ns-1515.awsdns-"0"61.orgのような一見正しそうだが悪意あるドメインに書き換えられて、メールの不正取得などに繋がっています。
このケースではレジストラの脆弱性をつかれてレコード改竄されているため、自分たちでは防げないなと感じました。

そこで、レコードの変更を定期的にチェックすれば早めに対応できるため被害も減らせると考えました。

利用方法

githubのリポジトリのbinディレクトリにLinux/Macのバイナリを入れていますのでそれをcronで定期実行させます。

./bin/nschecker-linux-64bit  NS  "vaddy.net" "ns1.example.com. , ns2.example.com." 

Linuxの場合はこのようにします。第1引数でNSかMXを指定。第2引数はドメイン名、第3引数はレコードをカンマ区切りで指定。 これを実行して問題がなければ何も出力せず正常終了します。 問題があればエラーメッセージを出力して異常終了します。

Linuxのバイナリを直接ダウンロードする場合はこちら。
https://github.com/ichikaway/nschecker/raw/master/bin/nschecker-linux-64bit

通知方法

READMEにあるように環境変数をセットすればSlack通知も行えます。

export SLACK_WEBHOOK_URL="webhook url"
export SLACK_FREE_TEXT="<!channel> from AWS lambda"

この2つだけ指定しておけばまずは良いかと思います。 SLACK_FREE_TEXTは自由に指定できるので、@channel通知をする<!channel>や、監視元のサーバ名など記載しておくと便利です。

実際に通知された画面はこのようになります。

f:id:ichikaway:20200727114629p:plain
nschecker-slack

何か他のツールと組み合わせるのであれば、終了ステータスが異常終了の場合に通知するなどシェルスクリプトを作れば可能です。
問題がある時は標準エラー出力で変更されたレコードが出力されるため、cron実行している場合はcronからメールが届くと思います。

今後の対応

(2020/7/28 10:30 追記) 現在はOSが利用するDNSキャッシュサーバに問い合わせしているため、キャッシュ期限によって検知が遅くなります。
次のバージョンではROOTサーバから再帰的に問い合わせしてキャッシュを利用しない検知に対応する予定です。