Slide 1

Slide 1 text

2023/06/21 Masahiro Nagano @kazeburo DBやめてみた話 TechFeed Expert Night#21 
 Webパフォーマンスチューニング最前線:後編

Slide 2

Slide 2 text

Me • ⻑野雅広(ながのまさひろ) • Twitter/GitHub @kazeburo • さくらインターネット株式会社 
 クラウド事業本部 SRE室 室⻑ • mixi, livedoor (LINE), mercari を経て 
 2021年から現職 • ISUCON本では第五章「データベース」を担当

Slide 3

Slide 3 text

⼀般的なWebサービスの構成 CDN LB App DB Queue Worker Storage Monitoring

Slide 4

Slide 4 text

⼀般的なWebサービスの構成 CDN LB App DB Queue Worker Storage Monitoring ໊લ ղܾ ໊લ ղܾ ໊લ ղܾ ໊લ ղܾ ໊લ ղܾ ໊લ ղܾ ໊લ ղܾ ໊લ ղܾ ໊લ ղܾ ໊લ ղܾ ໊લ ղܾ ໊લ ղܾ

Slide 5

Slide 5 text

DNSは • インターネットにおける重要な基板技術の⼀つ • Webサービス/パフォーマンスにとっても重要な基盤技術 • ロードバランス/スケールアウトの実現 • フェイルオーバーによる可⽤性向上

Slide 6

Slide 6 text

DNSと私 • 前前々職 • /etc/hostsファイルの管理から内部DNSに • 前々職 • PowerDNS + MySQLを利⽤したダイナミックな内部DNS • MySQL Replicaのロードバランスなどを実現 • 主要なサーバではローカルのDNSキャッシュサーバとして unbound を導⼊

Slide 7

Slide 7 text

DNSと私 • 前職 • Consul DNSを利⽤した Service Discovery • データベース、ジョブキュー、プロキシー、内部APIあらゆるサービスに利⽤ • Orchestrator と組み合わせて MySQL PrimaryのF/Oの実現 • サーバ全台にローカルのDNSキャッシュサーバとしてunboundを利⽤ • CoreDNSによる動的なクエリ書き換えによる、マルチクラウドの実現 • 現職 • 権威DNSサービスの開発・運⽤

Slide 8

Slide 8 text

権威DNSサービス • さくらのクラウド DNSアプライアンス、Amazon Route53やGoogle Cloud DNSなど • コントロールパネルやAPIによりゾーンの作成、DNSレコードの操作が可能 • DNSサーバの管理をサービス提供社にまかせることで、脆弱性対策、攻撃対 策、DNSサーバ管理の⼿間を省くことができる

Slide 9

Slide 9 text

権威DNSサービス • さくらのクラウド DNSアプライアンス、Amazon Route53やGoogle Cloud DNSなど • コントロールパネルやAPIによりゾーンの作成、DNSレコードの操作が可能 • DNSサーバの管理をサービス提供社にまかせることで、脆弱性対策、攻撃対 策、DNSサーバ管理の⼿間を省くことができる

Slide 10

Slide 10 text

DNS⽔責め攻撃 • 最近話題 • ランダムサブドメイン攻撃(Pseudo-Random Subdomain Attack)とも • 攻撃対象のゾーンにランダムに⽣成したサブドメインを問い合わせて、DNS の機能停⽌、機能低下を狙う攻撃

Slide 11

Slide 11 text

攻撃の記録 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)

Slide 12

Slide 12 text

攻撃の記録 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仕様) • ラベル数が増えることもあり

Slide 13

Slide 13 text

攻撃の⽅法とアクセス元 • 攻撃の⽅法 • 攻撃者はオープンリゾルバ/Public DNSに対して、⼤量のランダムサブドメ インの問い合わせを発⽣させる • DNSキャッシュサーバにはキャッシュが存在しない。その結果、権威DNS サーバに⼤量の問い合わせが発し。DoSとなる • 攻撃アクセス元は • Google、Cloud fl areのIPアドレスからが多い (有名Public DNS)

Slide 14

Slide 14 text

さくらのクラウドでの攻撃事例 • 2022年8⽉にサービスに影響するものとして初めて発⽣ • 現在に⾄るまで断続的に攻撃は継続 • 800万クエリ/分が数時間〜3⽇間継続ことも • (Route53のコストだと100万円になる • 最⼤4000万クエリ/分 (通常5000クエリ/分)

Slide 15

Slide 15 text

DNSアプライアンスが影響を受けた理由 • ⼤量のクエリ • DNSサーバのバックエンドとしてMySQLを利⽤していた • PowerDNS Authoritative Server のバックエンドとしてRDBMSを利⽤ • データベースを使うことでお客様のゾーンを管理しやすい • 反⾯、負荷が上がりやすい

Slide 16

Slide 16 text

DNSアプライアンスの構成(DBあり) PowerDNS API MariaDB MariaDB レプリケーション 更新 参照 クエリ− dnsX サーバ API サーバ PowerDNS MariaDB 参照 クエリ− dnsY サーバ

Slide 17

Slide 17 text

DNSアプライアンスが影響を受けた理由 • 通常の名前解決ではDNSサーバ側に備わるキャッシュが有効に働き、DBへの アクセス、負荷は⼤きくない • ⽔責め攻撃ではキャッシュは役に⽴たない。基本ヒットしない😇 • 都度SQLが発⾏される • DNSでは最⻑マッチのため、クエリ中に「.」ドットが増えるとその分クエ リが増える。最悪N+1が起きる(なんだっry

Slide 18

Slide 18 text

⽔責め攻撃への対策 • スケールアップ☝ • クラウド上のインスタンスなので停⽌・起動でスケールアップが可能 • PowerDNSのアップデートおよびチューニング💉 • アップデートやコネクション数のチューニングを実施 • MariaDBのチューニング • dnsdistによるフィルタリング • 👉 次のページ

Slide 19

Slide 19 text

MariaDBのチューニング • Webサービスでよく⾏われる対策は有効ではない • innodb_buffer_pool_size: そもそもゾーンデータは⼩さい • innodb_ fl ush_log_at_trx_commit: 更新はあまりない • innodb_ fl ush_method: 更新はあまり(ry • query_cache_type: 更新は少ないもののキャッシュヒットしない!

Slide 20

Slide 20 text

dnsdistによる対策 • dnsdist(dnsdist.org) はPowerDNSの開発元がOSSとしてリリースしている DNSのプロキシーソフトウェア。DNSのロードバランシング、リクエストの フィルタ、RateLimitの機能を備わる PowerDNS port:53 クエリ− dnsX サーバ PowerDNS port:1053 クエリ− dnsX サーバ dnsdist port:53 フィルタ/ QPS制限 変更前 変更後

Slide 21

Slide 21 text

dnsdistのフィルタリング addLocal("0.0.0.0:53", {reusePort=true}) newServer({address="127.0.0.1:1053",name="backend1"}) domain1 = newSuffixMatchNode() domain1:add(newDNSName("example.com.")) addAction( AndRule({ SuffixMatchNodeRule(domain1), OrRule({QTypeRule(DNSQType.A),QTypeRule(DNSQType.AAAA)}), NotRule(QNameRule("example.com.")), NotRule(QNameRule("www.example.com.")), MaxQPSIPRule(3,16) }), DropAction() ) • ネイキッドドメインおよびwwwをホワ イトリストとし、それ以外のアクセス が3QPS以上あればDropする • 全てのゾーンに適⽤が不可能 • 設定の爆発🤯 • そもそもゾーンにワイルドカード 「*.example.com」があったら?

Slide 22

Slide 22 text

💪 根本のパフォーマンスを強化する

Slide 23

Slide 23 text

RDBMSをやめる

Slide 24

Slide 24 text

PowerDNS バックエンドごとの性能評価 ΫΤϦඵ 0 40000 80000 120000 160000 ϥϕϧ਺ 51,892 69,942 98,716 159,720 30,042 41,071 69,694 158,095 4,617 6,895 16,124 159,167 .Z42- -.%# #*/%[POF fi MF 6倍 キャッシュヒットするので 変わらない

Slide 25

Slide 25 text

BIND zone file backend? • 昔から利⽤されるBINDの「ゾーンファイル」を読み込み、オンメモリ処理す るバックエンド

Slide 26

Slide 26 text

ゾーンファイル $TTL 3600 @ SOA ns1 example.com. ( 1 ; serial 3600 ; refresh 900 ; retry 2419200 ; expire 300 ; ncache ) @ 259200 NS ns1 ns1 259200 A 192.0.2.1 @ 259200 NS ns2 ns2 259200 A 192.0.2.2 test 3600 A 192.0.2.1

Slide 27

Slide 27 text

BIND zone file backend化にあたり • ゾーンファイルをサーバ間でコピーし、必要に応じてPowerDNSに再読み込み、 あるいは破棄させる必要 • レプリケーションのような⾼速な反映 • DNSの反映は15秒から1分以内がSLO • シンプルでスケールするアーキテクチャ • 将来的にはスケールアウトしたい • クラウドのマネージドサービスを使えれば..

Slide 28

Slide 28 text

BIND zone file backend化の構成 API Maria DB 更新 API サーバ tar (2) アーカイブ取得 workerはIf-Modi fi ed-Sinceリクエストを送る serverはIf-Modi fi ed-Sinceリクエスト受け、 更新されるまでファイルの更新⽇付をpollingしつつ、レスポンスを遅延/blockingする リクエスト頻度を下げて負荷を削減し、更新を⾼速に反映 tar Server tar Worker PowerDNS ゾーン ファイル named .conf (1) ゾーンファイル群の 
 tarアーカイブを作成 
 別名ファイルでの作成とmvにより 
 アトミックな操作 (3) ゾーンファイルを展開 named.confを⽣成し、必要に応じて pdnsのリロード処理を⾏う DNSサーバ

Slide 29

Slide 29 text

まとめ • DNSはインターネットでもWebのシステムでも重要な基盤 • DNSをうまく使うことでできることは多い • DNS⽔責め攻撃は対策が難しい • 適材適所でRDBMS/DBをやめる「選択」 • アトミックな更新、レプリケーションなどRDBMSがやっていてくれたこと を他ミドルウェアで実現、⾃分で実装する必要

Slide 30

Slide 30 text

SAKURA internet ࣾձΛࢧ͑Δ 
 ύϒϦοΫΫϥ΢υɾେن໛ܭࢉࢿݯΠϯϑϥΛ 
 Ұॹʹ࡞Γ·ͤΜ͔ʁ ソフトウェア開発、 インフラ基盤から フロントエンドまで 採⽤強化中! さくらインターネットではエン ジ ニア採⽤を強化しています さくらインターネットは新たなアイ デ アの創出に強い熱意と情熱を持って挑戦するお客様を は じ め、私たちとつな が りのあるす べ ての⼈たちのために、未来のある べ き姿を想い描きな が ら ―「やりたいこと」を「 で きる」に変える ― あらゆるア プ ローチを “インターネッ ト”を通 じ て提供します。 詳しくはWebサイトにて、カジュアル⾯談もやってます 👉 www.sakura.ad.jp/lp/22engineer/