画像やリンクが無効になっている可能性もあるのでご了承下さい。
はじめに
DNS クエリーのデータ量は少ないけど、その応答はクエリーよりもぐっと多くなる。
オープンリゾルバな DNS サーバーを踏み台にし、ターゲットとなるホストへ文字通り「増幅」(AMP) されたデータを大量に投げつけて負荷を上げ、機能低下やサーバーダウンを引き起こそうとする攻撃が DNS AMP 攻撃。
筆者の管理する DNS サーバーでは、今までこう言った大量のクエリーが外部より飛んでくることは無かったのだが、どうやらここ数日で結構な数の IP アドレスから受けていたようだ。
当然ではあるが、外部参照の再帰クエリーは許していないので受けたクエリーに対しての応答はしていない。
20-Jul-2021 11:55:34.126 query-errors: client @0x7ff9e48735c0 98.156.x.y#80 (pizzaseo.com): view external: query failed (REFUSED) for pizzaseo.com/IN/RRSIG at ../../../bin/named/query.c:7145
20-Jul-2021 11:55:50.651 security: client @0x7ff9e48735c0 98.156.x.y#80 (pizzaseo.com): view external: query (cache) 'pizzaseo.com/RRSIG/IN' denied
fail2ban で 300 個以上の IP アドレスを自動的に遮断していたようだが、このままだと攻撃の流れ弾を喰らっているだけなのが気に食わないから対処することとした。
iptables で遮断しておく
fail2ban でも短時間で大量のクエリーを吐くパターンに引っかかれば自動的に遮断はできるけど、クエリーを投げてくる IP アドレスは時々刻々と変化し、全てを捌くことは不可能と思うのでここは iptables の string モジュールを用いて遮断する。
DNS サーバーのログを見る限り、攻撃の対象とされているホストは pizzaseo.com というところ。
そんな訳で pizzaseo.com を含むクエリーが飛んで来たら iptables で DROP してあげることになる。
今回 iptables に追加したルールは次の通り・
-A INPUT -p udp --dport 53 -m string --algo kmp --hex-string "|0870697a7a6173656f03636f6d00|" -j DROP
53/UDP に pizzaseo.com というホスト名を 16 進数で表した 0870697a7a6173656f03636f6d00
にマッチするデータが入ってきたら DROP
するという動作。
動作確認
sudo iptables -nvL | grep -i 'string match'
9035 524K DROP udp -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:53 STRING match "|0870697a7a6173656f03636f6d00|" ALGO name kmp TO 65535
効いてる効いてる。
おわりに
DNS AMP 攻撃はオープンリゾルバなサーバーを踏み台にするとは知っていても、オープンリゾルバでは無く、攻撃の踏み台としての効果が無い DNS サーバーに対しても無駄にクエリーを投げ続けているんだなーとはあまり考えたことが無かった。
ともあれすぐに無駄なクエリーをたたき落とすことが出来たのでスッキリした。
コメント