mackerel Meetup #14 Tokyo - 2023/07/11
さくらインターネット Masahiro Nagano @kazeburoDNS⽔責め攻撃と監視mackerel Meetup #14 Tokyo - 2023/07/11
View Slide
Me• ⻑野雅広 (ながのまさひろ)• @kazeburo - Twitter, Threads & GitHub• さくらインターネット株式会社 クラウド事業本部 SRE室 室⻑• mixi, livedoor (LINE), mercari を経て 2021年から現職• mackerelアンバサダー
本⽇のアジェンダ• DNS⽔責め攻撃と監視• DNSとSLO
%/4ਫΊIUUQTKBXJLJQFEJBPSHXJLJ&&#"%&"#&%#&&'&&"&&"&
DNS⽔責め攻撃• 2023年3⽉頃より攻撃件数が急増、社会的な影響もあり• ランダムサブドメイン攻撃(Pseudo-Random Subdomain Attack)とも• 攻撃対象のDNSのゾーンにランダムに⽣成したサブドメインを問い合わせて、DNSの機能停⽌、機能低下を狙う攻撃
実際の攻撃の記録07:25:11.719035 IP 209.216.160.2.50051 > 133.242.64.100.53: 43104 A? meetmodeling.example.com. (50)07:25:11.719057 IP 205.171.30.238.44916 > 133.242.64.100.53: 64321% [1au] A? _.modeling.example.com. (71)07:25:11.719069 IP 172.70.109.31.63292 > 133.242.64.100.53: 40380 [1au] A? osaExpe1-pLatINUM.exAmpLe.cOm. (66)07:25:11.719071 IP 3.139.136.204.44597 > 133.242.64.100.53: 32383% [1au] A? webdirect.foster.example.com. (65)07:25:11.719113 IP 18.188.77.103.42513 > 133.242.64.100.53: 14853 [1au] A? note-modeling.example.com. (62)07:25:11.719132 IP 172.70.33.19.27971 > 133.242.64.100.53: 35379 [1au] A? indian-awarded.example.com. (63)07:25:11.719147 IP 12.121.89.48.43564 > 133.242.64.100.53: 23891 A? matchfiling.example.com. (49)07:25:11.719156 IP 74.125.181.130.64517 > 133.242.64.100.53: 25285% [1au] A? xmL.mODeLING.eXaMple.CoM. (61)07:25:11.719166 IP 165.225.41.202.17203 > 133.242.64.100.53: 53044% [1au] A? qatawarded.example.com. (59)07:25:11.719176 IP 96.114.53.67.20082 > 133.242.64.100.53: 41999 [1au] A? netherlands.filing.example.com. (67)07:25:11.719190 IP 172.253.195.196.35276 > 133.242.64.100.53: 45639% [1au] A? tdd-modeling.example.com. (61)07:25:11.719195 IP 172.253.217.12.40587 > 133.242.64.100.53: 62658% [1au] A? web.modeling.example.com. (61)07:25:11.719197 IP 172.253.9.4.50295 > 133.242.64.100.53: 37961% [1au] A? co.awarded.example.com. (59)07:25:11.719224 IP 172.71.29.39.30489 > 133.242.64.100.53: 2496 [1au] A? SfaaSobvioUs.ExamplE.Com. (61)07:25:11.719235 IP 209.66.107.33.57264 > 133.242.64.100.53: 50511 [1au] A? hap.modeling.example.com. (61)07:25:11.719275 IP 96.114.53.69.53157 > 133.242.64.100.53: 5679 [1au] A? gitcn-awarded.example.com. (62)07:25:11.719312 IP 172.70.229.30.59530 > 133.242.64.100.53: 45890 [1au] A? ipafoster.example.com. (58)07:25:11.719336 IP 172.217.46.78.59507 > 133.242.64.100.53: 60186% [1au] A? testcloud-modeling.example.com. (67)07:25:11.719351 IP 69.47.193.166.52891 > 133.242.64.100.53: 238 [1au] A? bfmpassing.example.com. (59)07:25:11.719353 IP 34.218.119.91.26001 > 133.242.64.100.53: 31511% [1au] A? signal-modeling.example.com. (64)07:25:11.719365 IP 34.218.119.91.13381 > 133.242.64.100.53: 4210% [1au] A? pairfiling.example.com. (59)• ランダムな⽂字列、単語の組み合わせ• ⼤⽂字・⼩⽂字まざり(Google Public DNS仕様)• ラベル数が増えることもあり
攻撃⽅法のイメージbot化したサーバ群攻撃者(?)オープンリゾルバパブリックDNS権威DNSサーバʮय़ʹى͖ͨ%/4ਫΊឿᓾരܸͷ؍هʯΛࢀߟIUUQXXXFPOUBQDPNNJTDJPUTMJEFQBQFSIUNM
攻撃のアクセス元• オープンリゾルバ、Public DNS• 仕様に準じたクエリなのでネットワーク機器でのフィルタリングが不可能• クエリ発⾏数の上位はGoogleやCloudflareのIPアドレスが多い• ⼀般のユーザも利⽤している• rate limitやクエリのblockができない• ここがDNS⽔責め攻撃の対策の難しいところ
さくらのクラウドでの攻撃事例• 2022年8⽉にサービスに影響を与えるものとして発⽣• 以後、現在に⾄るまで断続的に攻撃が継続• 最⼤4000万クエリ/分 (通常5000クエリ/分)• 800万クエリ/分が数時間〜3⽇間継続ことも• (Route53のコストだと100万円になる
⽔責め攻撃への対策• スケールアップ• dnsdist (DNS⽤proxy)でのホワイトリスト• 頻繁に攻撃のあるゾーンに対してDNSサーバの前段でフィルタリング• DNSサーバ(PowerDNS)のバックエンドの切り替え• RDBMSを利⽤したバックエンドからインメモリでの処理に• RDBMSによる管理性が失われるので、ゾーンデータを配布するミドルウェアを新たに書き起こした• 可視化・モニタリング
Mackerel plugins• mackerel-plugin-pdns• https://github.com/kazeburo/mackerel-plugin-pdns• hanazuki/mackerel-plugin-pdns のGo⾔語版• mackerel-plugin-dnsdist• https://github.com/kazeburo/mackerel-plugin-dnsdist
⽔責め検知とアラート• dnsdistでのクエリ数が⼀定でアラート• 対策が進むにつれて閾値をだいぶあげた• サービスに影響がなければアラートは 抑えるのが⼤事
グラフボードでざっくり確認• 週に数回グラフボードをみて、気になればログで攻撃対象ゾーンを確認• 新たなゾーンへの攻撃であれば対策が必要か検討する
mackerel-plugin-maxcpu• バックグラウンドで毎秒CPU使⽤率を計測し、その最⼤・平均・パーセンタイル値をメトリクスとして記録• https://github.com/kazeburo/mackerel-plugin-maxcpu• 攻撃による瞬間的な負荷を把握するため
DNSとSLO
DNSの役割• 名前と対象(IPアドレスなど)を、あらかじめ対応つけておく• 名前と対象の対応付けを調べて、問い合わせ元に返すIUUQTXXXOJDBEKQKBNBUFSJBMTJXPOEFNBOEEOT࣌ؒͰֶͼ͢%/4ͷΈͷΩϗϯ
DNSの役割• 名前と対象(IPアドレスなど)を、あらかじめ対応つけておく• 権威DNSサーバ• 名前と対象の対応付けを調べて、問い合わせ元に返す• フルリゾルバ、DNSキャッシュサーバIUUQTXXXOJDBEKQKBNBUFSJBMTJXPOEFNBOEEOT࣌ؒͰֶͼ͢%/4ͷΈͷΩϗϯ
DNSキャッシュサーバ• サービスの付随要素として提供• 例えばISPの提供するDNSキャッシュサーバ• 共有型での提供(社内でも利⽤)• SLA?
DNSキャッシュサーバ• 重要な基盤技術のひとつ• しかし、障害が起きるまで意識されない• SLOの公開によって、社内外で名前解決の可⽤性を共有モデルとしていくことはできないか• DNSサーバの管理チームにSLOを提案
DNSのSLIを考える• ユーザ視点で考える• 弊社のDNSキャッシュサーバのユーザとは• クラウド/VPSの仮想サーバ、MaaSの物理サーバ、レンタルサーバのホストなど各種基盤。Linux や FreeBSD が多い• クライアントを知ることが⼤事、また、サービス本来の利⽤者・エンドユーザも考慮
resolv.confとDNS名前解決• resolv.conf が右のように書かれていた場合1. 198.51.100.3 がタイムアウト5秒2. 198.51.100.4 が 5秒 × 2 ÷ サーバ台数 (⼩数点切り捨て)のタイムアウト=5 秒3. これを2回繰り返して、合計20秒間名前解決を⾏う• 正直⻑い• options timeout:Nや試⾏回数を増やすoptions attempts:Mは利⽤者側にて対応をが必要• (systemd-resolvedになると別)nameserver 198.51.100.3nameserver 198.51.100.4nameserver 198.51.100.3nameserver 198.51.100.4options timeout:1 rotate
DNSキャッシュサーバのSLI(検討)• 2台(2 IP)で1組• resolv.confのデフォルト状態• 5秒、5秒 × 2回の20秒• resolv.confでtimeoutを1秒、attempts:3を想定し、5秒以内にレスポンス• 1秒、1秒 × 3回
Mackerel Plugin• mackerel-plugin-resolver-synthetic• https://github.com/kazeburo/mackerel-plugin-resolver-synthetic• resolv.confの設定と動作を真似して名前解決ができるかをメトリクス化• さくらのクラウドの仮想サーバから、提供しているDNSキャッシュサーバをモニタリング
# one of them is alive% ./mackerel-plugin-resolver-synthetic --timeout 5s -H 198.51.100.1 -H 198.51.100.2 -H 8.8.8.8 -Q example.com2023/06/27 21:20:08 failed to resolv on 198.51.100.1 with timeout 5.000000s: read udp 192.168.68.110:58507->198.51.100.1:53: i/o timeout2023/06/27 21:20:11 failed to resolv on 198.51.100.1 with timeout 3.000000s: read udp 192.168.68.110:49304->198.51.100.1:53: i/o timeoutresolver-synthetic.service.available 100 1687868403resolver-synthetic.rtt.milliseconds 8023 1687868403# all dead% ./mackerel-plugin-resolver-synthetic --timeout 5s -H 198.51.100.1 -H 198.51.100.2 -Q example.com2023/06/27 21:21:56 failed to resolv on 198.51.100.1 with timeout 5.000000s: read udp 192.168.68.110:51016->198.51.100.1:53: i/o timeout2023/06/27 21:22:01 failed to resolv on 198.51.100.2 with timeout 5.000000s: read udp 192.168.68.110:59771->198.51.100.2:53: i/o timeout2023/06/27 21:22:06 failed to resolv on 198.51.100.1 with timeout 5.000000s: read udp 192.168.68.110:53296->198.51.100.1:53: i/o timeout2023/06/27 21:22:11 failed to resolv on 198.51.100.2 with timeout 5.000000s: read udp 192.168.68.110:50395->198.51.100.2:53: i/o timeoutresolver-synthetic.service.available 0 1687868511resolver-synthetic.rtt.milliseconds 20002 1687868511
SLOダッシュボード• 値の取得開始から2週間• 今後、SLOの数値のチーム内での決定、社内への告知、社外への公開• 可⽤性向上のヒント、事例も合わせて公開する必要
まとめ• 権威DNSサーバへの⽔責め攻撃と監視• mackerel-plugin-{pdns,dnsdist,maxcpu}• DNSキャッシュサーバの監視とSLO• mackerel-plugin-resolver-synthetic
SAKURA internetࣾձΛࢧ͑Δ ύϒϦοΫΫϥυɾେنܭࢉࢿݯΠϯϑϥΛ Ұॹʹ࡞Γ·ͤΜ͔ʁソフトウェア開発、インフラ基盤からフロントエンドまで採⽤強化中!さくらインターネットではエンジニア採⽤を強化していますさくらインターネットは新たなアイデアの創出に強い熱意と情熱を持って挑戦するお客様をはじめ、私たちとつながりのあるすべての⼈たちのために、未来のあるべき姿を想い描きながら ―「やりたいこと」を「できる」に変える ― あらゆるアプローチを “インターネット”を通じて提供します。詳しくはWebサイトにて、カジュアル⾯談もやってます 👉 www.sakura.ad.jp/lp/22engineer/