暗号化とセキュリティ
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 フォワーディングを使ってください。