ドキュメント › Storia Cluster

暗号化とセキュリティ

Cluster の通信をどう暗号化・認証しているか、Relay とワーカーを安全に運用するには。

Storia Worker・Storia Relay・Storia Proxy の間の通信は、すべて共通の 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 文字以上のランダムな文字列 にしましょう。
  • 次のコマンドで作れます。

    openssl rand -base64 24
    
  • Relay・すべてのワーカー・Storia Proxy(storia-proxy.toml の [cluster])で同じ合言葉を使います。

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

合言葉が漏れたら

鍵は合言葉と(公開されている)ノンスから作られるので、通信を記録していた人が後で合言葉を知ると、その記録を 復号できてしまいます。また、合言葉を知っている人はワーカーとして Cluster に参加し、ワールドを読んだり変えたり できます。漏れたと思ったら、すべての場所で合言葉を変えてください。

通信で流れるもの#

チャンク、エンティティ、プレイヤーデータ(インベントリ・位置)、進捗、統計、地図、スコアボードです。Relay はワールド 全体を保管します。ワーカーと Relay は、自分で管理しているマシンだけで動かしてください。

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

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

    # ufw:ワーカーとプロキシだけが Relay に届くようにする
    sudo ufw allow from 10.0.0.0/24 to any port 25590 proto tcp
    
  • 25590 で待ち受けるのは Relay だけです。ワーカーと Storia Proxy は Relay へ接続しに行きます。

  • プレイヤーがワーカーに直接つながることはありません。ワーカーの Minecraft のポートは非公開にし、Storia Proxy から modern フォワーディングを使ってください。