Discordサーバーへの荒らし対策の話+身内のコミュニティが荒らしに破壊されてからの復旧RTAを走った話

これとは違う手口だったんだけど、先日100人規模くらいの身内のサーバーが荒らしによって破壊されたので、その手口および対策と、再建に成功した理由、ついでにもう一度荒らされないために今実施している対策を記載する。

再建までの時間はなんとびっくり3hほど。後述するけど運が非常によかった。

■TLDR;

セキュリティ対策は、対策にかけられるコストや対策によって失われる利便性や空気感と対策の効果を天秤にかけた上で各コミュニティに応じた最適な対策を実施することが重要であって、全部が全部対策しないのが悪いわけではない。

時にはノーガードが正解となることも考慮に入れつつ、各位のコミュニティに応じた最適な対策を見つけ出してほしい。

■事の経緯

時間はだいたいこんくらいって感じ。

■17時ごろ:よく知らんやつが大量に入ってくる

身内鯖なので基本的には知り合いの知り合いくらいの人が月1人来るかな、くらいのペースだったのに、急に5人くらいドカっと入ってきた。
(URLは普通にサーバー管理者などが公開していたので、そこ経由で入ったと思われる)
どこから来たんですか、など話しかけるもイマイチ要領を得ない回答が帰ってくる。

■botが無断で追加される

急にbotが無断で追加される。
サーバー管理者の方針で、BANとキック以外の殆どの権限をeveryoneに渡していたためbotの追加は誰でも出来る状態だったものの、無断での追加はちょっとマナー的にはどうよ、ということでたまたま見ていた僕が連携サービスを削除することでbotを蹴り飛ばす。(幸運ポイント1)

■よく知らんやつがもっと入ってくる

追加で更に人が入ってくる。botも大量追加される。
このあたりで「あ、荒らしか」と感づいてBAN権限を持っている人に連絡を取るも、なかなか反応がなかった(平日17時に反応がある方が異常)

■botによって全チャンネルが削除される

ここで全チャンネルが破壊される。一応連携サービスの設定からbotは蹴り飛ばし続けていたが、物量に負けたので通ってしまった。
とはいえ全チャンネル削除直後にbotが蹴れたのは恐らく幸運ポイント2点目。

■18時ごろ:通話ではしゃぎ始める

もともと管理者や活発なメンバーが「セキュリティより面白さと手軽さ重視」「いつか荒らしで破壊されるだろうな」と話していたこともあって、ついぞ荒らしが来たぞ!! って感じで逆にはしゃぎ回る。
通話に確か30人以上いた。平日だけどリモートワークの社会人が多かったのもありみんなでこれ以上ないくらいゲラゲラ笑っていた。
(もちろんログが消えて悲しんでる人もいたけど、全体の雰囲気的には大喜利したり、通話に入ってきた荒らしの人間をからかって遊んだりしていた)

■19時ごろ:サーバーどうするのって話が出る

一通りはしゃぎ終わって、「消えちゃったチャンネルの再建とか荒らしのBANとかどうすっか」という話が出る。
身内コミュニティとはいえ大規模なサーバーだったので、チャンネルがかなり細分化されていて(例えばソシャゲ関連のチャンネルだけでもFGO、グラブル、ワーフリ、プリコネ、ウマ娘、アイマス関連、原神のチャンネルが存在した)、これは再建するの面倒だよね……という話になった。

が、こんなこともあろうかとサーバーのチャンネル構造のクローンを取っていたので、「荒らし蹴ったり対策するのもめんどいし一旦クローンに移住しようぜ!」と提案した。
残留してチャンネル再建すればいいよ派、クローンを参考にしてチャンネル再建すればいいよ派、クローン移住派などが一瞬分かれるも、活発なメンバーの何人かが「俺は移住します」と宣言したことによって全体の流れが一気に移住の方向に。
暫定的ながらクローンへの移住が決定する。

■20時ごろ:だいたい移住完了

手当たり次第もともといた人にDMを投げまくって(DM規制食らった)クローンサーバーのURLを伝えて移住してもらった。
サーバーが荒らされても参加者一覧が取れないわけではないので、一部メンバーが抜けや漏れを確認しながらDMを送ったり、Twitterで何人かが「この鯖爆破されたので移ってます、連絡ください」と書き残しておいたりで、概ね当日中に7割くらいは移住終わったんじゃないかと思う。
もともとあまりサーバー見てないタイプの人が後から気づいて入ってきたりっていうのはあったけど、よく書き込んでる人間に限れば20時くらいにはほぼ移住できた。

記録はだいたい3h。完走した感想ですが、幸運に恵まれました。

■荒らしの手口

botからのチャンネル全削除。同様の被害にあった他のサーバーの事例を考えると、恐らくbotのサービス連携を解除していなかった場合にはeveryoneへの大量のリプライが飛んできたんじゃないかと思う。
荒らしのメンバーの一部の人間はだいたい半年くらい前からサーバーに参加しており、もともと目をつけられていたっぽい。
一部のbotを無断で追加したり、チャンネルを勝手に作ったり(チャンネルを作るの自体は忌避されてはいないが、まあマナーとして報告くらいはしてくれよな、みたいな感じの運用がされてた)でかなり心証が悪かったが、今にして思えばサーバーの権限周りが緩いのを確認してたんだと思う。

■荒らしの対策はどうなってたの?

完全ノーガード。メンバーのBANキック以外のほぼ全ての権限がeveryoneに与えられていた。

ただ、これは「荒らされる可能性があっても良く、それ以上にみんながロールなどで区別されず、everyoneで平等にやりとりできるといいよね」という運営指針があったということは強調しておきたい。
リスク・リターンを鑑みた上でなおこちらのリターンを取ったほうが面白い・美しいという思想があった。(と思う、僕は運営してなかったので知らないけど)
対策をしないのか? という話が出たのも比較的後のほうにサーバーに参加していた僕が見ている限りでさえ一度や二度ではなく、そのたびにサーバーの運営理念に従ってセキュリティを強化しないことをあえて選択してきたのであって、決してセキュリティ対策がわからなかったとか、荒らしを考慮しなかったわけではない。
あくまでリスクとリターンを考えた上で、僕たちのコミュニティではその時そういう判断だったのであるし、少なくとも僕個人としてはその判断に同意したことに対して不満も後悔もない。

なので爆破されたのはもうしょうがないよね、いつか来るやつだよね、という感覚が強く、そういう意味ではあんまり怒ってない。(もちろんマジで悲しんでる人もいたけど、それはそれ)

■なぜコミュニティ復旧に成功したのか

率直に言えば運が良かったおかげで以下の2+1点がたまたま満たせたから。
強いて言うならだいたい皆仲良かったり大人だったりするので揉めが発生しなかったのは大きい。仮に対策をしてあっても騒動に伴う揉めが発生していたらコミュニティは破壊されていだろう。例えば、移住or再建はどちらにもメリットがある択だが、最終的には流れに乗って移住するという選択をしてもらった。
各位に感謝。

■サーバーが使用不能にならなかった

チャンネル全部削除されたとはいえ、大量の通知爆撃によって実質的にサーバーが見れない状態になったり、あるいはサーバーそのものが削除されたりはしなかった。
そのため元いたメンバーなどの把握には困らず、連絡を取る際にほとんど障害にならなかった。
今回の復旧成功の要因の7割くらい。

■アクティブな人間が早めに方針を決めうった

コミュニティの中でのリーダー的な立ち位置の人が「俺は移行します」と言い切ったことによって全体がその流れになったのでグダグダしなかった。
移行したのがよかったって言うよりは再建するのか・クローンに移住するのかの択とか、再建するとして今来た荒らしやもしかしたら潜んでるかもしれない荒らしをどう蹴るかとか、様々な決断が素早く行われた。
これは多くの人がリモートワークをしている時期だったこともあり、アクティブな廃人面々が揃っていたことが大きい。

判断の良し悪しや個々人が完全に納得して従ったかというのは一旦置いておいても、こういう決断は長引いても結論が出ないことが多いため、即座に決断した各位と、それに素直に従った各位に関しては感謝の念に堪えない。

今回の復旧成功の要因の3割。人が揃っていたのは本当に単に運がよかっただけで、例えば深夜とかに同じことされてたらもっとひどいことになっていたのは想像に難くない。

■クローンを取ってるやつがいた

実のところ復旧成功の要因ではないんだけど、復旧を早めるための効果としては大きかった。
Discordのサーバーテンプレートの機能を使用するとチャンネル構造(チャンネルの設定や説明)や、ロール・サーバー設定などをコピーしたサーバーを作成することができる。
書き込みがないこと・各ユーザのロールが初期化されることを除けば基本的にはテンプレートの元となったサーバーと同じように利用できるため、荒らしの実質的な被害をかなり減らすことができる。

長らく運用されているコミュニティだとチャンネルの数も膨大になって正しく把握している人間がいなくなってしまうだろうし、そうしたチャンネルを1から作り直すのは非常に手間がかかる。
そこが時短されるというだけでもかなり効果的。

■今回の実質的な被害

・リアクションやスタンプの移植作業の発生
・サーバーのメンバーをクローンに招待するための作業の発生
・サーバーブースト(なんとLv3だったので20人くらいブーストしてた)移行の作業と、移行の案内作業の発生
・書き込みの消失
・バックアップ日~被害を受けた日までの間に作成したチャンネルの消失

だいたいこんなところである。さらっと書いてあるがリアクションやスタンプの移植作業の発生が一番物量があった。
リアクションに関してはWeb版Discordからだと画像が保存できるためそれでちまちま保存→新鯖に登録を繰り返した。(1日50件までの登録制限があるらしく3日くらいかかった、担当者には感謝しかない)
スタンプに至ってはWeb版からの保存がうまくいかなかったらしく、最終的にはスタンプの作成者が保存していたものを貰って再度登録という作業をするしかなかった。

招待に関しては言うほど手間ではなかったが、これも100人規模だから耐えていただけでもっと人数が多かったら厳しかっただろう。

サーバーブーストの移行も面倒ではあるが手間はなかった。数人旧サーバーをブーストしっぱなしだったので案内を出したくらい。

書き込み・チャンネルの消失に関してはネガティブに受け止めていない人も多かったが、悲しい思いをした人もいた。心情的には一番デカい被害かもしれない……が、まあ、個人的にはDiscordの書き込みなんていつでも爆散していいもんだと思っている。

■今回の騒動で得られたもの

・話のネタ
・怪しげなユーザーの排除
・新サーバーにおけるセキュリティ対策の知見

話のネタはデカい。こうしてnoteを書けるくらいである。
怪しげなユーザーの排除に関しては今回の荒らしのようにコミュニティに参加するだけしておいて目をつけている担当のようなユーザーの排除という意味で、まあ一回一掃できたのはよかったんじゃないかと思っている。個人的には。

セキュリティ対策の知見はまああって困るもんでもなし。

■荒らされ対策って結局何をすればよかったのか

集合場所と対応方針を決めておく。これに尽きる。
今回はたまたまサーバーが荒らされはしたもののリプライ爆撃チャンネルの常時削除などもなかったため荒らされた元のサーバーが集合場所として機能したが、botの種類や対応次第ではこうはならなかっただろう。
一度集まっているコミュニティが破壊されてしまった時に、次に集まる避難場所のようなものは決めておいたほうがよい。
これはDiscordのサーバーでなくともいい。なんなら、そうでないほうがいい。例えば、サーバー管理者のTwitterを見るように示し合わせておくとか。
今回はたまたまユーザーのBANもサーバーの破壊もなかったので集まれたが、冒頭の記事にあるような方法だとDiscordのユーザーごと破壊されて連絡を取るのが不可能になるリスクがある。当たり前のことではあるが、プラットフォームは分けてリスク分散するに越したことはない。

対応方針についてはざっくり言うと「人が減るの覚悟で移行する」「荒らしをキックしきれないことを覚悟でチャンネルを作り直す」の2択。
ただ、後者に関してはサーバー参加のURLや参加ルートが既に荒らしを行うユーザーによって目をつけられているという観点からおすすめはしにくい。
できれば移行に舵を切りたいが、移行するならするでどこに移行するのかというのが課題になりうる。
サーバー作成者はDiscord上での権限を多く持つため、最悪の場合は権限を争った結果2サーバーに分かれてコミュニティの分裂が発生することも考えられる。
今回は幸運にも1箇所に集まったが、クローンサーバーを作った人間にどうしても権限を持たせたくないケースも存在しうるだろう。コミュニティの中でも問題のある人物がクローンを作っていた場合とか。

今回のケースで言うと僕がクローンサーバーを作成していたことはそれとなくコミュニティ内で主張していたので、「じゃあそこに移ろうか」という流れが出来たものの、事前に決めておくに越したことはない。ここで揉めるとコミュニティが確実に壊れる。
そういう意味では僕が最低限サーバー作成者として問題のある行動を起こさないだろうという信頼をされていた(……されてるよね?)のは幸運の1つだったと言える。

■そもそも荒らされないという観点の対策

文中でも述べている通り、「荒らしによるサーバー破壊のデメリットを背負ったとしても全ユーザーにメッセージ編集権限やチャンネル作成・削除権限、botの追加権限を渡して平等になる」という観点で運営されていたので、そういう意味では今回のコミュニティでは荒らされないという選択肢はなかったので、過去どうしていたらよかったということには意味がない。

ただ、実際に荒らされた後にはさすがに「次はこうならんようにちょっと対策しよっか」という流れになったこともあり、不肖の身ながらクローンサーバーの作成者である僕を含む数人でセキュリティ対策を実施することにした。

「Discordのセキュリティ対策って何をどこまでやったらいいのかわからん」という諸氏も多いかと思うので、参考になればいいなと思って書き残す。

■2段階認証の必須化

前提として「前のサーバーから極力利便性を損なわない」「極力全員が平等になるようにする」という運用なので、今回はボツにした。
が、荒らし対策としては間違いなく最高の効果を発揮するので、今回のような特別なコミュニティの信念がない限りは必須にしたほうがいい。

リモートでTCG遊ぶ人たちがスマホ用アカウントとPC用アカウントで運用して、スマホ用アカウントでカメラ写しながらPC用アカウントで相手の画面を見る運用をしてたので、そこに影響出ちゃうのは今回は許容しなかった。
カメラ買えってのもなんか違うし。

■everyoneから権限の剥奪

書き込みと閲覧以外のほとんどの権限を封じている。
後述の認証(手動)と合わせての運用。
当たり前だが入った瞬間からbot追加やらメッセージ削除が出来るのはセキュリティ的には問題外もいいところ。

■実質的なeveryoneロールであるActiveロールの採用

チャンネルの作成・削除権限、メッセージの編集権限は旧サーバーのころから使用頻度が高かったので、これを渡さない選択肢はなかった。
が、everyoneに対して渡す≒入った瞬間にその権限があるという状態は問題があるので、実質的に全員に渡したい権限を全て詰め込んだ「Active」というロールを導入し、全員に付与した。

新しい人が入ってきたときには誰の知り合いかの確認を取った上で、信頼できそうならActiveロールを付与する、という運用を行っている。
もちろんこの「信頼できる」の基準が難しいのだが……現状は「誰かの友達なのが確認できたらOK」くらいの緩い基準になってしまっている。
このあたりはどこまで人の善意に頼る・悪意を見出すかによるところもあるので、コミュニティによってケースバイケースで運用される部分だと思う。

また、ほぼ使われていないのでeveryoneへのメンション権限は剥奪した。100人全員に飛ぶeveryoneを使ってまで通知したいことなんて管理者ですらそうそうない。

今のActiveのロール権限を渡したとしても最悪で手動ないしアカウント経由のAPIで連投・チャンネルの削除・書き込みの削除を出来るくらいなので、リスクとして許容している。

■botの追加権限を与えない

Webフックの追加権限とサーバー管理の権限のこと。ここに安易に権限を与えるとbot経由でありとあらゆる暴虐が行われるので、既存のユーザーの利便性を落とすとしても仕方なしとして許容した。

代わりに自分を含むよくDiscordを見ている暇人アクティブな人間数人に「労務」という名称のロールを付与し、そこにはwebフックの追加権限とサーバー管理の権限を渡している。
これはもう手動で追加対象のbotを精査する以外の運用は思いつけなかった。各種利便性のあるbotを追加できない環境は論外であったため。

このロールを例えば「管理者」や「運営」などとすると他のユーザーとの格差が可視化されて、もともとの運営の理念であるユーザーの平等という部分と外れてしまうので、できるだけ雑用に近く、あくまで対象のbotに問題がないかを確認するだけですよ、というスタンスで運用することを徹底するために「労務」という名称にしている。
労務になりたい人間全てに渡すとセキュリティ上の問題が大きくなるだけなので当面はメンバーを増やす予定はない。

このあたりが「ただ仲良しグループが集まったら100人を超えた」というコミュニティの特異性の難しさで、「格差を感じさせない」「特定個人が恣意的な判断を出来る状態を避ける」という、コミュニティの雰囲気を守るためにマストな要件と、「万人が重要な権限を持つと悪意を持った人間に権限を悪用される」という部分の折衷のように感じる。
この方法がベストなソリューションというわけではなく、このコミュニティについては各位の温かいご理解を頂いた上でこうさせていただいている、というだけの話なので、コミュニティごとにベストな権限の持ち方というのは慎重に決定するべきだと思う。
なんならノーガードも一つの択ではあるくらいなので。

■一定の実績のないbotの追加を許可しない

これで実際に拒否したbotは今の所ないが、荒らし行為の実例として「大手セキュリティ系botの追加を装って管理者に依頼するが、そのbotが実は荒らし用のbotだった」という実例がある。
このため労務は個人だけの判断で追加の許可・不許可を判断せず、サーバー上の見える場所で追加対象のbotを調べた上で(といっても、そんなに厳密なものではないが)追加するようにしている。
githubにソースコードがあったりすると安心できるが、中身まで見るわけではないことも多いので最終的には依頼者に信用があるかどうか・botが大手のものであるかどうかという話も大きくなってきているという部分に脆弱性が残るが、手間暇を考えるとこのあたりが限界のように感じている。
労務のITリテラシーが悪かった瞬間に瓦解する運用なので気を引き締めていきたい。

■参加可能なURLをできるだけ公開しない

もともとはかなりパブリックに公開されていたが、今回を機にTwitterなどで公開することはやめてもらった。
暫定的な措置としてそうというだけなので今後どうなるかはわからないものの、今のところは事実上の招待制のような形になっている。(別にそんな意図があるわけではないが)

荒らす側としてはどうとでも参加してくる可能性はあるが、ノーガードよりは気休めになりうる。

■※検討中 アクセストークンのような文字列を自動で削除する

Dyno bot(超メジャーなので安心なやつだけど自分のサーバーに入れる時はちゃんと精査してください。URLが偽物じゃないかどうかとか)の機能に、ある特定の文字列が書き込まれた時に自動で削除したり、権限を付与したりできる……らしい。

URLではないがアルファベットや記号・数字が連続してn文字以上だった場合に自動で書き込みを削除&書き込み者に対してActive剥奪+書き込み禁止のロールを与えることでうまいこと記事冒頭の荒らしを防げないか検討している。

■終わりに

荒らしが存在する事実はどうしようもないので、適度にリスクを許容しつつ最適なセキュリティ対策を探していきたいですね。

この記事が気に入ったらサポートをしてみませんか?