セーブポイント

特にジャンルの決まってない雑記です。

身内Minecraft鯖運営から学んだ荒らし対策の教訓

最近身内向けにMinecraftのサーバーを運営していたら人生で初めて荒らし被害にあったので、二度と再発しないように願いを込めて書きます。

24時間開けっ放しで鯖運営している人向けです。遊ぶときだけ開けている人(自分のPCでプレイしながら鯖も建てている人など)は荒らしに遭遇してもその場で対処できると思うのであまり気にしなくてもいいかもしれませんが、対策はしておいて損は無いでしょう。

前提

自分は最近バニラのサーバーを建てる際には専らPaperがさらに最適化されたフォークであるPurpurを利用しています。

purpurmc.org

Paper自体Spigotの後継であり、Spigotプラグインが利用できます。鯖の挙動をバニラに寄せるために少し設定を変更したりする必要はありますが、バニラに強く依存している鯖でなければ現状Purpurを使っておけば問題無いと思っています。
よほどのサバイバルガチ勢でなければ。

実際に受けた被害

4月の初め頃から身内向けにMinecraftのマルチサーバーを運用していました。Oracle Cloud Infrastructureインスタンスを借りています。

で、ある日サーバーにログインするとこんな感じに……。

初期スポーン地点周辺

画像の手前のところは倉庫だったのですが、溶岩を使ったのかTNTを使ったのか、ほとんど燃やされているといった状態でした。

サーバー側のログも取得してあり、以下のようになっていました。

ログイン時の挙動

荒らし行為を行ったユーザーのUUIDは7db2c642-8e0a-4728-bb61-664d11ad5c40であり、IPアドレスを逆引きしてみたところロシアからのアクセスらしい。暇なんか?

初めにplコマンドを使っているのは、荒らし対策プラグインの有無を確認している?荒らしにある程度慣れていそうで気持ちが悪いです。

このときの敗因は下に挙げた対策を全てしていなかったことです……。どれか一つでもやっておけばなんとかなったかもしれないのに、本当に自分がバカでした。

対策1. ホワイトリストを使う

これはPurpurに限らず、公式のサーバーでもできる対策です。正直これだけできていれば全て済む*1

デメリットとして、新しく人に参加してもらうときに手動で鯖の管理者やモデレーターがホワイトリスト機能のオンオフをしないといけなくなりますが、逆にそれだけです。

メリットの方が絶対大きいので、やっておきましょう。

また、荒らしを受けた鯖でもホワイトリスト機能自体は利用していたのですが、メンバーを追加する際一時的にオフにしたまま戻し忘れていました。鍵のかけ忘れには気をつけましょう

対策2. サーバーで利用するポートを変更する

そもそもの話、荒らし被害に会う前にIPアドレスを外に公開しなければよくない?と思っている人もいるかと思うのですが、これって実は大嘘です。

身内だけにしかサーバーのアドレスを公開しなくとも、総当り攻撃でサーバーのアドレスを割ってくる人が存在します。そのためのホワイトリストというわけです。

自分が運営していたサーバーもIPアドレスTwitterなどで一般公開したことはなく、Discordのコミュニティ上でのみ共有していました。

この問題への(部分的な)対策として、ホワイトリストとは別にポートを変更するという方法もあります。

Minecraftのサーバーはデフォルトだと通信に25565番のポート(TCP/UDP)を利用することになっています。このとき、例えばMinecraftサーバーを動かしているマシンのIPアドレス111.112.113.114であるとすると正しいサーバーアドレスは111.112.113.114:25565になりますが、省略して111.112.113.114マルチプレイサーバーに接続できます。

で、これだと問題があって先程言ったようなIPアドレスブルートフォース攻撃に弱いです。サーバーに使うポート番号を25565以外に設定してあげることで単純な総当り攻撃に耐性を持たせることができます。(SSHのポートを22以外にするのと似たような感じでしょうか)

使うポートを変えてもポートスキャンなどによって探索される可能性もまだありますが、そこまでやってくる荒らしには今のところ遭遇したことがありません。

24時間稼働のサーバーを建てる際にはこの対策も検討すると良いと思います。

対策3. ワールドのロールバックができるプラグインを入れる

これはSpigot鯖特有の対策です。

有名な荒らし対策用のプラグインとして、CoreProtectというものがあります。

詳しい解説などは既にネット上に存在する記事などを参照してもらうと良いと思いますが、このプラグインは各プレイヤーの操作を記録し、必要に応じてワールドの状態の巻き戻し・復元を可能にしてくれます。
しかも、これは単純なロールバック処理ではなく荒らしプレイヤーが関与したブロックの変更などのみを対象にロールバックを行うことができ、他の人の作業が同時に巻き戻ってしまう問題を解決してくれます。

サーバーに導入しておくだけでこのメリットを享受することができるため、入れるだけ入れておくと良いでしょう。使う機会が無いことが一番いいですが、備えは大事です。

また、CoreProtect以外にもWorldGuard(ワールドの領域保護)やLWC(チェストのロック機能)といった有名プラグインがありますが、これらは身内鯖というより大規模の公開サーバー向けな気がするので省略します。

対策4. ワールドのバックアップを取る(重要)

これもSpigot関係なしにできる根本的な対策ですが、本当に重要だと実感しました。

前の項でCoreProtectを紹介しましたが、やっぱり多少手間はかかるので定期的にバックアップをとってそこにロールバックをしてしまうというのが一番速い解決策な気がします。

バックアップ間隔などの設定によってはかなり作業が巻き戻ってしまうこともあると思うので、そういう場合にはCoreProtectを利用するとよいでしょう。ただし、CoreProtectを利用しても荒らしの程度によっては復元が本当に可能か怪しいので*2、CoreProtectと物理バックアップは併用した方が好ましいと思います。

また、定期的にバックアップを残してくれる機能を持つSpigotプラグインもあります。

server-backup.net

Linuxサーバーの場合cronとかでやってもいいですがサーバーを止める必要があります。こういったプラグインを利用することでサーバーを起動した状態のまま動的にバックアップを作成できます。こちらも入れておくだけで初期設定では毎日バックアップが作成されるようになっているので、使いやすいと思います。

対策5. MCBansを利用する

こちらも割と有名だと思いますが、MCBansという他のサーバーとユーザーのBAN情報を共有できるプラグインがあります。

www.mcbans.com

サーバーに導入しておくだけでも、評価値が一定より低いユーザーはサーバーに参加できなくなるようです。

MCBansにあまり詳しくないので他の対策方法と比べるとオススメ度は個人的には低いですが、導入しておくと荒らしユーザーに対して多少の威圧にはなりそうな感じです。

まとめ

今回は5つ荒らし対策の手法を紹介しましたが、正直ホワイトリスト機能さえ使えていれば他の対策は要らなくなるくらい強力です。これだけはやっておきましょう。本当に。

あとは、鯖荒らし以外でもバックアップが必要になることが極稀にあるので*3、対策1と4は常にやっておくといいかな~と思います。

なんらかの事情でホワイトリスト機能は使いたくないという場合には、対策1以外全てやっておくと良いと思います。LuckPermsなどを利用した権限の管理も忘れずに。

*1:ただし、大規模鯖の場合はDDoSとかもありうると思います。

*2:自分のワールドの場合も村人が殺害されたりチェストの中身が消滅していたりしたので、本当に全部綺麗に巻き戻せるのか不明

*3:なんらかの原因により急にサーバーのマシンが落ちてチャンクのデータが破損するなど