こんにちは!元気です。
今回はVRChatのワールドギミックの解説と導入提案(無料)の記事になります。
一般の方向けの用語解説などはありませんのであしからず・・・!
VRChatの鍵の技術
良い感じの鍵、欲しくないですか?
[ 画像:VOLT Dance Club / DigitrevX様 (※パスワードは無いです)]
VRChatのワールドで特別な部屋にロックを掛けたい場合、鍵が必要になります。
今回作ったワンタイムパスワードロックシステム(OTP方式)は現行手法のデメリットを軽減もしくは解決する目的で作りました。
ただ現行手法にもメリット・デメリットがあるため、まずはそれらを紹介します。
なお、VRChat公式のモデレートツールガイドライン(規約に準ずる)についても後述で触れます。
現行手法
主に3つの手法があります。
① 固定パスワード方式:
ワールド製作者が決めた秘密のパスワードをパスした人のみアンロック。
メリット:
メンバーの増減に関係なく、パスワードを通知されたメンバー全員がアンロックできます。
デメリット:
セキュリティが他方式と比べて低いです。総当たり攻撃でパスを攻略されて、掲示板などでワールドURLと共に公開されてコンテンツが不特定多数に漏洩してしまうことがあります。実例を何件も見ました。
(メンバーが漏洩した可能性も排除できないので精神衛生上も良くないですね)
② ホワイトリスト方式:
VRChatのユーザー名でホワイトリストを作って対象のみアンロック。
VRChatのワールドに入場したプレイヤー自身のディスプレイネームはAPI(Networking.LocalPlayer.displayName)を用いて取得することができ、それとホワイトリストと照合してアンロックする仕組みです。
ディスプレイネームはVRChat上で一意(重複しない)のためホワイトリストに無い人が名前をなりすましてアンロックすることはできません。
メリット:
パスワードが存在せず入力の手間がありません。また漏洩の問題も無くセキュアです。
デメリット:
ホワイトリストの更新の都度ワールドを再アップロードするため、メンバーの増減に対してワールド製作者の負担が掛かること、また即応性の問題があります。小規模のコミュニティ向けといえます。(ただUnityでのリスト更新とワールドのアップロードを定時実行するよう自動化できれば負担に関してはこの限りではありません)
③ 動画プレイヤー方式:
VRChatのユーザー名でホワイトリストを作り、シリアライズ→画像→動画にエンコードしてアップロード、VRChat上で動画プレイヤーからカメラで画像を取得してホワイトリストにデコード、アンロック。
VRC名の収集と動画エンコード、サーバーアップロードの自動化部分は実装難度高めです。(自動化しないと②の手法のワールド更新の手間との比較になります)中~大規模のコミュニティ向きと言えます。
文字列の動画取得についての技術はこちらの記事で紹介されています。
【VRCAdvent Calendar】VRChatへ外部から文字列を渡すよ(C# only) - 神城デジタル事務所
メリット:
パスワードが存在せずセキュアで入力の手間がありません。またメンバー増減の反映は動画の更新で行えるのでワールドの再アップロードが不要です。
デメリット:
動画プレイヤーは仕様のアップデートが多く対応のためにワールド更新が必要なことがあります。またUntrustedなURLを避ける場合はyoutubeなどのアップロード頻度の制限からメンバー増減の即応性が遅れる場合があります。さらに動画プレイヤーはまれに読み込みを失敗するため安定動作のためには実装に工夫が必要です。
ホワイトリスト方式のギミック配布
先に挙げたホワイトリスト方式ですがメンバーがほとんど増減しない用途で有ればシンプルかつ強固で有効です。この用途ではOTP方式よりも適しているためギミックを作りました。良ければお使いください。
なお、VRChat公式のモデレートガイドラインの対応については配布物のマニュアルの序章に記載しているので気になる方はご参照ください。同様の内容をOTPの運用マニュアルにも記載しています。
OTP方式:
今回作成したOTP方式は中~大規模のコミュニティに適します。
メンバーはアンロックの際、discordのbotからパスワード(PIN)を取得してVRChatで入力し開錠します。 メンバーの増減は自動で即時反映され、ワールド再アップロードの必要はありません。
OTP方式の仕組み:
図示します。(仕組みを知らなくても本システムは利用できます)
原寸画像: Dropbox - OTP-structure.png - Simplify your life
Botサーバーの管理は私が担当しているのでワールド製作者はdiscordサーバーでのbot導入とVRChatワールドでのギミック導入を行えば利用できます。
システムは少し複雑に見えますがメンバー視点ではボタンを押してPINを確認し、VRChatで入力するだけの簡単操作です。
OTP方式の特徴:
① パスワード(PIN)が数分ごとに変わります。
→ 総当たり攻撃を回避します。
② discord上のbotでPINを都度生成するため、サーバー(の特定チャンネル)に居るメンバーのみPINを取得できます。
→ メンバーの増減をdiscordだけで管理でき、ワールドの再アップロードは必要ありません。
PINは数分で失効するのでチャンネルから去ったメンバーはその後アンロックできません。
③ PINはVRChatのディスプレイネームに基づいて生成されるため個々人によって異なります。
→PINが外部に漏洩しても外部の人間にとっては無効なPINなのでアンロックされません。(VRC名は一意で重複しません)
メンバーのVRC名の登録は初回のみdiscord上で行います。登録は即反映されPIN生成が可能になります。メンバーに登録して頂くのでワールド製作者の負担はありません。
④ 動画プレイヤーは使用していません。
→実績(後述)で安定運用できています。対応が必要なVRChat側の仕様変更もありませんでした。
他手法と比較したデメリット:
都度DiscordでPINを生成するメンバーの手間が発生します。
軽減案:
・PINの有効時間を延ばせばVRChatに入る前にPINを取得できて楽です。ただし有効時間は総当たり攻撃に対する強度と反比例するので考慮が必要です。運用マニュアルに指針が記載されています。
・XS Overrayなどを持っているメンバーはVR上でdiscordを操作、PINの生成ができます。
実績:
本システムは既に利用中のサーバー(非公開)があります。
登録メンバーは約100人で1か月ほど運用していますが現在、不具合による停止は報告されていません。
そちらでは技術的なご支援も頂きシステムの完成度向上に貢献頂きました。この場を借りて感謝申し上げます。
OTPのデモと導入について:
以下のdiscordサーバーでOTPシステムとデモワールドが体験できます。ユーザーマニュアル、設定・運用マニュアルもこちらで配布しています。
そしてOTPシステムの利用申請窓口でもあります。
システムの利用は無料ですがbot運用の都合上、ワールド製作者15名様までの提供になります
2022年11月13日21:21 追記:システムに修正が必要な個所があったため、対応完了までbot導入の新規受付は一時停止します。申し訳ありません。
入退室は自由で見学もOKなのでご興味ある方はサーバーに参加頂ければ幸いです。
まとめ:
- 鍵は用途に応じて適した方式を選んでね。
- ホワイトリストギミックを作ったので無料配布したよ。小規模のときに良い感じ。
- ワンタイムパスワードシステムを作ったよ。無料で使えるよ。中~大規模のときに良い感じ。
- ダイナミックイメージは全てを解決するはずなので早く実装して欲しいね。(何年も待ってるよ)
それでは皆さん良きVRChatライフを!
謝辞:
koyashiroさん
botプログラムのリファクタリングや技術的助言を沢山頂きました。sql構文のライブラリがprismaに置き換わってた時はすごく驚きました。ありがとうございます!
ヨドコロちゃんさん
VRChatで様々なギミックを作っている方で、侵入者防止システムの暗闇シェーダーをご提供頂きました。また、同期ギミックについて種々助言頂きました。ありがとうございます!
HAYA-CHANさん
スクショのモデルとして協力頂きました。ギミックやワールドを作成する際、テストやモデルでいつもお世話になっています!