ドキュメント › 処理の分担

暗号化とセキュリティ

分担の通信をどう暗号化・認証しているか、ワーカーやリレーを安全に運用するには。

Storia サーバー・ワーカー・リレーの間の通信は、すべて共通の secret(合言葉)で 暗号化・認証 されています。 合言葉そのものがネットワークに流れることはありません。

仕組み#

接続が始まると、双方がプロトコルのバージョンと、毎回新しく作る 32 バイトの乱数(ノンス)を送ります。そのあと双方で鍵を導きます。

psk = PBKDF2-HMAC-SHA256(secret, "storia-offload-psk", 200,000 回)
prk = HMAC-SHA256(psk, 接続した側のノンス || 受けた側のノンス)
鍵(接続した側 → 受けた側) = HMAC-SHA256(prk, "i2r")
鍵(受けた側 → 接続した側) = HMAC-SHA256(prk, "r2i")

以降のメッセージは、向きごとのメッセージ番号から作った 96 ビットの IV を使い、AES-256-GCM で保護します。その結果:

  • 合言葉を知らない人は、通信を 読めません。
  • メッセージの 偽造・改ざん・再送・順番の入れ替え はできません。どれも認証に失敗し、接続が切られます。
  • 合言葉が違う 相手は、最初のメッセージで失敗し、拒否されます。
  • ノンスが毎回新しいので、接続ごとに別の鍵 になります。
  • 必要に応じて、暗号化の 前に 圧縮(deflate)します。

プロトコルのバージョンが違う相手は、両方を同じ Storia のリリースにそろえるよう促すメッセージとともに拒否されます。

合言葉の決め方#

  • 8 文字以上が必須です。20 文字以上のランダムな文字列 にしましょう。
  • 次のコマンドで作れます。

    bash openssl rand -base64 24

  • サーバー・すべてのワーカー・リレーで同じ合言葉を使います。

  • パスワードと同じように扱い、storia.yml と relay.properties はサービスを動かすユーザーだけが読めるようにしてください。

合言葉が漏れたら

鍵は合言葉と(公開されている)ノンスから作られます。そのため、通信を録っていた人が あとから 合言葉を知ると、その記録を 復号できてしまいます。漏れた可能性があるときは、すべてのマシンで合言葉を変えてください。 なお、この通信で読めるのは地形データだけです。プレイヤーの情報・チャット・認証情報は一切流れません。

ワーカーにできること・できないこと#

メインサーバーは、ワーカーの返事を信用しない入力として扱います。

  • 返事はすべて、反映する前に 検証 します(セクションの構成、ブロックのデータ、高さマップの大きさ)。おかしな返事は捨て、そのチャンクは自分で生成します。
  • ワーカーが受け取るのは、チャンクの座標・ディメンション・近くの構造物の外形だけです。プレイヤー、インベントリ、チャット、ワールドのファイルは見えません。
  • ワーカーがメインサーバーにコマンドを送ったり、何かを変更したりすることはできません。

ただし、正しい合言葉を持つワーカーなら、形式としては正しいが違う地形を返すことは できてしまいます。ワーカーは自分が管理するマシンでだけ 動かしてください。-Dstoria.verifyOffload=true を使えば、すべてのチャンクを自分でも生成してワーカーを監査できます。

ネットワークのおすすめ#

  • できるだけポート 25590 をインターネットに公開しないでください。LAN、VPN(WireGuard、Tailscale)、または自分のマシンだけを通すファイアウォールを使いましょう。

    ```bash

    ufw:メインサーバーからだけワーカーに接続できるようにする#

    sudo ufw allow from 192.168.0.10 to any port 25590 proto tcp ```

  • Storia Relay を使えば、ポートを開けるのはリレーだけで済みます。ワーカーは自分から接続します。

  • -Dstoria.worker=true で起動したワーカーは、Minecraft・query・RCON のポートを 一切 開きません。