匿名掲示板を作ってたらDDoS攻撃が来たのでCloudflare片手に戦ってた--2023晩夏

イントロダクション

前回の記事の通りで、趣味で専ブラに対応した掲示板を作っていた。 sasau.hatenablog.com

作ったものの、あまり宣伝や運営をする意欲もなかったので過疎掲示板としての時間が流れていた...。
というところまでが前回までの話だった。

その後、攻撃を受けるなどして、最終的になんでも実況Edge板は閉鎖してしまう...。のだけど、攻防の経緯をログとして残してあったので、この時どんなことを考えていたかも含めて、お伝えしておきたいと思う。

攻撃を振り返る

8/26

最初は8月26日に関連する掲示板に大規模な攻撃が来たことから始まる。

DDoS攻撃の経緯8/26

8月26日は、プロ野球のシーズン中で通常の試合が行われていた。野球に限らずだけど、実況民は実況中は本当に試合中のような行動をする。すなわち、実況中に何らかの要因でその会場が喪われると、安定した場所を求めて凄まじい勢いの大移動が起きる。エッジ板もそうした避難所の頭数となっていて、白羽の矢が立ったのが事の発端だった。余談だけどここで触れている防弾なんGは、その後も継続的なDDoS攻撃の標的にされてしまい、閉鎖の憂き目にあうことになる。

8/27~28

DDoS攻撃の経緯8/27~28

ここでDDoS攻撃を初めて経験した。エッジ板はCloudflareでのみ動いているため、そこまで遅くはならないだろうと高を括っていたのだが、明らかに読み書きのレスポンスが遅くなる。そのため、WAFを使ったIPアドレスベースのブロックを行うことになった。
CloudflareのWAFは無料でも超有能で、デフォルトでアクセスログIPアドレスの所有元を示すASNまで提供してくれる。なので、これを検索することでリクエスト元を調べることができた。明らかに大量のリクエストを送ってくるASNはMiku Network Limitedowl limitedなど、聞いた事のない海外のVPS事業者からだった。

8/27のアクセスグラフ

↑が8/27のアクセス量のグラフで、すこし分かりづらいけど、突然55k/hくらいのアクセスが発生していた。

8/29~30

DDoS攻撃の経緯8/29~30

8/29から本当の意味でのDDoS攻撃が行われることになる。この時点では攻撃リクエストには↑に書いているようにリファラに特徴があり、それによって大量の攻撃が一般回線から来ていることが浮き彫りになった。
このような攻撃はマルウェアに感染したゾンビPCにより構成されるボットネットから来ている可能性が高く、詳しくはわからないが、とある場所ではこのようなネットワークを時間貸ししているのだと言われる。
30日に実施したリファラによるブロックは功を奏し、一時的な平穏を得る。

9/3

DDoS攻撃の経緯9/3

少し空いて9/3、無意味な投稿をしてスレッドを埋めることを企図したスクリプトが発生した。これは本家5chでは日常的に発生しているため、予測したことであった。今後は書き込み前に

エッジ板認証画面

↑のように認証をしてもらうことでスクリプトを弾くことを目論んだ。
しかし...。

9/5

DDoS攻撃の経緯9/5

9/5、認証はhttps://d1ch.cc/authから書き込み時に返している6文字の英数の入力をすれば誰でもできてしまうので、なんらかの代行サービスを使ったのか簡単に突破されてしまった。
今思うとこの辺りでスクリプトに対して手動で対応していたのは疲弊の原因になった気もする...。

攻撃に関してのまとめ

  • DDoS攻撃は脅威だが、リファラを使ったブロックがある程度功を奏していた、ただしこれは一時しのぎであることは明らかだった
  • 認証は代行などを使えば認証済みのCookieを大量に抱えられてしまう問題があった
  • 認証処理自体にもパフォーマンス上の問題を抱えていた

以上のような課題があり、パフォーマンス改善と、認証の脆弱性を塞ぐための改修を行うことにした。

9/9改修

9/9の朝、改修を行なった。それに伴いDBは作り直しになり、まっさらなところからの再出発となった。更新作業は滞りなく完了することができた。

9/9改修の内容

技術的な詳細は↑の通り。
まず、DBにCookieテーブルなどがあって、これに認証フラグ等を持たせていたのだが、これが現状では明確に遅かったのでCloudflareのキーバリューであるCloudflare KVを使うことにした。Cloudflare KVはなかなかすごいというか、RedisのようなシンプルなAPIであるが、Redisのようには動かない。具体的にいうと、書き込んだあと、それが全てのノードに伝播するまで最大1分かかる。しかしReadは限りなく無限にスケールする。後述するけど、パフォーマンスとしてはこれが多大な効果があった。

また、喫緊の認証の問題は、専ブラでのリクエストに使われたIPアドレスと認証リクエストに使われたIPアドレスが一致することを要求し、また認証の操作を5分以内に行ってもらうことで対応した。

他には、専ブラは書き込み内容を特定の形式にして、それをShift-jisにしたものしか受け付けないのだけど、この処理を毎回GETリクエストが来た時に行うのはかなり遅いような気がした。そこで、d1のSQLiteにblob型のカラムを用意し、Shift-jisにしたものをそこに入れてしまって、書き込みを返すときは単なるバイト列のconcatだけで済むようにといった地味な最適化も行った。

改修の成果

まず、認証の脆弱性を突いた攻撃は発生しなくなった。これは予想外の結果だった。認証代行を使うのは難しくなったとはいえ、まだ手動で認証を済ませたCookieを作り出すことは可能であり、嫌がらせに使ってくるかなと思ったため。労力に見合わないと判断したのか、何か使いたくない事情があるのかなと考えていた。
しかし、IPアドレスの一致を要求することは、いくつかの技術的な問題を誘発した。専ブラによっては常にIPv4で通信しているものがあり、その場合ブラウザがIPv6を使って通信してしまうと何度やってもIPアドレスが一致しない。このような場合はユーザー側がどうにか対応する必要があるなど、大小の問題が発生した。

次にパフォーマンスについて。改修前はどうしても60k/hくらいで遅くなり始め、80k/hくらいからエラーが出始めるような感覚だった。

改修前8/28のリクエストログ

改修後は、200k/hを超えてもほぼ負荷を感じないレベルまでパフォーマンスの改善が見られた。この日はタイガースのアレ前夜。

改修後の9/13のアクセスログ

この日はタイガースの「アレ」の日。

タイガースアレ時のログ

ここまでいくと、DDoS攻撃なのか、純粋な住民の熱狂なのか区別はつかないが、少なくとも読み込みにおいて「重い」と感じることは減っていった。
負荷が集まると3分程度500エラーが発生してしまうことはあり、完全な無停止とは行かないものの、掲示板としては及第点を取ることはできていたように感じる。 ただ、パフォーマンスとのトレードオフとはいえ、Cloudflare KVの最大1分の伝播時間の問題は地味にご不便をおかけしたように思う。認証したのに通らなくて不快に思われたことがあれば申し訳なく思う。

その後、閉鎖まで

技術的には諸々克服の兆しが見えていたのだが、精神的にはかなり疲弊していた。
特にDDoS攻撃は可視化された悪意の数字であり、Cloudflareのダッシュボードにログインしてこの数値を見るたびに心身の健康が少しずつ削られていった。

これはある日のアクセスログであり、どちらかといえば脅かしに近いのだが4M/1hのリクエストが送られてきていた。これもダメージが大きく、この状況では継続が困難であると判断した。10月1日に閉鎖の告知を行い、なんでも実況Edge板を閉じさせていただくことにした。
叩かれると思っていたのだが、告知のスレッドでは暖かい言葉を掛けていただき、本当にありがたかった。

なんでも実況Edge板まとめ

書き込み数: 1,426,894
スレッド数: 18,187

実況的にあったこと

掛かった費用について

↑が実況的にはかなり回転していた9月の領収書。元々払っていたCloudflare Workersの5$プランを入れても費用は18$程度で収まっている。 ただし、d1はα版を使用していたためか請求に含まれていない。しかし、これがWorkersと同程度の金額だとしても30$弱であり、あり得ないほどの盛況でも50$程度を見ればある程度運営できるのではないか、と思う。

感想

結果的には色々なものに負けてしまい、申し訳ない気持ちと残念な気持ち、またたった一人でしか事に当たることができなかった自分の限界などを感じる。しかしながら、エッジコンピューティングを使ったアプローチでDDoSやスクリプト攻撃に対しても一定の可能性を示すことはできたかなと思っており、そこに関しては成果かなと思う。
短い間だけど自分のコードで戦うような「エッジランナー」の心持ちでいられたことはなんだか幸せなことだなと思っていた。

使っていただいた方へ

住民の方には、もっと早く感謝や、多少でも有益な情報を届けたい思いはあったのだけど、閉鎖の判断を下すのは自分の中でとても辛く、苦い思い出になってしまっており、様々な思いを無視する形で気がつけば今年も最後の日になってしまっていました。
今日までその後の情報は入れることが出来ていませんでしたが、現在ではこの技術スタックを用いた避難所開発のコミュニティができつつあるようで、救われた思いになりました。もちろん自分はその成果を何ら主張する立場にはないですが、それらの活動に最大限の感謝とリスペクトを送らせてください。ありがとうございます。ここでの情報が何かお役に立てば幸いです。