大規模多人数同時参加型オンライン ゲームのインストールのベスト プラクティス
この記事では、大規模多人数同時参加型オンラインゲーム (MMOG) のクライアント インストールとカスタム ゲーム アップデート システムのための信頼チェーン設計の作成について説明します。この設計は、Windows 環境、特に Windows Vista と Windows 7 のセキュリティ モデルに適合するものです。 このアプローチは、ハード ドライブとシステム レジストリへのアクセスが制限されている標準ユーザー アカウントをサポートしながら、MMOG タイトルのパッチ適用を可能にするように設計されています。
- MMOG クライアントに従来の小売購入ゲームと異なる要件がある理由
- 信頼チェーン アプローチの概要
- すべてがサーバーで検証されても、クライアントがハッキングされる心配はあるのか?
- 信頼できるローダー アプリケーションの構築
MMOG クライアントに従来の小売購入ゲームと異なる要件がある理由
MMOG は常時接続され、絶えず進化する性質があるため、セキュリティの脆弱性を修正し、ゲーム プレイ エクスペリエンスを拡張するために、クライアント コードとコンテンツを定期的に更新することが基本的な要件となります。 ほぼ毎日更新が行われる可能性があるため、MMOG のシナリオでは、ユーザー フレンドリなエクスペリエンスを確保するために慎重な管理が必要です。 これは、製品の小売出荷日に近い時期に少数のパッチが提供される可能性がある、従来の小売購入モデルとは異なります。 オペレーティング システムに付属の Windows インストーラーの制限付きユーザー向けパッチ適用テクノロジは、少数のアプリケーション パッチを処理するように設計されており、MMOG に必要な大量かつ高頻度のパッチを処理するように設計されていません。 したがって、開発中の特定の MMOG 固有の特別な要件を含め、MMOG のニーズに対応するために、カスタム パッチ適用システムの開発が必要になることがよくあります。
多くのコンピューターがインターネットに接続されているため、Windows Vista と Windows 7 では、ユーザーを保護するためのより厳しいセキュリティ制限と対策があり、アプリケーションがハード ドライブのさまざまな領域にアクセスできる範囲が制限されています。 Windows XP とは異なり、これらの制限はユーザー アカウントの既定モードで有効になっています。 これらの制限は、ゲーム、実行可能ファイル、データのレイアウト、および関連するパッチ適用システムを設計する際に考慮する必要があります。 オペレーティング システムが提供するセキュリティ対策の詳細については、「ゲーム開発者向けのユーザー アカウント制御」を参照してください。
信頼チェーン アプローチの概要
このホワイトペーパーで紹介するカスタム更新アプローチは、ゲームの実行可能ファイルとデータをすべてのユーザーがアクセスできる共有領域に保持しながら、信頼できるローダー アプリケーションを保護された Program Files フォルダーにインストールすることに基づいています。 信頼チェーンは、起動前にゲームのバイナリとデータの有効性チェックを実行するローダーから始まります。
信頼できるローダーには、ゲームを起動する前に、ゲームの実行可能ファイルとその他のバイナリが改ざんされていないことを検証できる、十分なロジックが必要です。 ローダーは必要に応じてゲームデータも検証できますが、通常、ゲームデータのサイズが大きすぎるため、1 回のパスですべてをチェックすることはできません。 代替アプローチとして、データ セット全体の検証が時間をかけて行われるようなサンプリング パターンを使用する方法があります。 ローダー アプリケーションには、インストールされたゲームに更新プログラムを統合するための信頼できる方法を提供する、ゲーム パッチ適用エンジンが含まれている場合があります。
すべてがサーバーで検証されても、クライアントがハッキングされる心配はあるのか?
クライアントが侵害されていないと信頼することはできません。そのため、MMOG サーバーがクライアントから受信したすべてのデータを検証するのが一般的です。 この処理によってゲーム世界内で侵害されたクライアントやチートを行うクライアントを特定できますが、サーバーはゲーム クライアントが直面する可能性のあるすべての問題を簡単に特定することはできません。 クライアントをサービス、他のユーザー、またはクライアント マシン自体への攻撃のベクトルとして使用しようとするハッカーからの保護を強化することが重要です。 コード署名とデータ検証手法の適用は、侵害されたクライアントを実行する前に検出するのに役立ちます。 パッチ適用メカニズムでは、Program Files の標準の読み取り専用アクセス許可によって保護されていない実行可能ファイルと DLL バイナリを公開する必要があるため、これらのファイルを起動する前に検証することが全体的なシステム セキュリティにとって重要です。
このモデルは、ローダー自体が侵害される可能性のある悪意のある管理者ユーザー シナリオに対処しようとするものではなく、標準ユーザーが改ざんされたコードを誤って実行することから保護することに焦点を当てています。 従来のサーバー クライアント検証手法は、悪意のあるクライアント システム管理者による脅威に対しては、実質的に唯一の有効な対策となります。
信頼できるローダー アプリケーションの構築
バックグラウンド読み取り
読者は、ソフトウェア ベースの信頼のベスト プラクティスを確保するための基盤となるテクノロジの詳細を提供する、次のドキュメントをよく理解しておく必要があります。
-
コード署名
-
SignTool
-
MSDN 上の SignTool
次のセクションでは、ローダー アプリケーションを構築するために使用する必要のある API について詳しく説明します。この API はインストール用のディスク レイアウトをサポートし、信頼チェックの検証に対応します。
信頼できるローダーとパッチャーのインストール
信頼できるローダーとパッチャー ユーティリティの基本バージョンは、従来のインストールと同様に、HDD の保護された Program Files フォルダーにインストールするとよいでしょう。 ローダー アプリケーションのインストールとパッチ適用には管理者権限が必要なため、エンド ユーザーが頻繁に昇格する必要がないように、ローダーの更新頻度を最小限に抑えることが重要です。ただし、ローダーのパッチ適用では、Windows インストーラーの制限付きユーザー パッチ適用により昇格を回避できます。
「Windows XP、Windows Vista、Windows 7 でのゲーム ソフトウェアのパッチ適用」の記事を参照してください。
ゲームの実行可能ファイル、DLL、データのインストール
管理者権限なしで標準ユーザーがゲームを更新できるようにするには、ゲームの実行可能ファイル、DLL、データを、すべてのユーザーが書き込みアクセス可能なハード ディスクの領域にインストールする必要があります。 オペレーティング システムには、「すべてのユーザーのアプリケーション データ」領域が用意されており、インストールの既定の場所として使用できます。 この領域のファイル パスを決定するには、CSIDL_COMMON_APPDATA キーで SHGetFolderPath を使用する必要があります。 このキーが返すパスはユーザーが構成できる可能性があるため、パスを想定しないことが重要です。
インストールでは、タイトルの更新に必要な書き込みアクセスをすべてのユーザーが共有できるように、フォルダーのアクセス許可を変更または管理する必要があります。 適切なアクセス許可があれば、ローダー プログラムのゲーム更新機能は、標準ユーザーによって起動された場合を含め、ユーザー アカウントからの特別な権限を必要とせずに、ゲームに簡単にパッチを適用できます。
アクセス制御リスト変更コード
Windows XP の場合は、アクセス制御リスト (ACL) を手動で変更するコードを実行する必要があります。その方法を示す関数の例を次に示します。
HRESULT ChangeACLtoAllowUserRW( WCHAR* strDir )
{
EXPLICIT_ACCESS explicitaccess;
PACL NewAcl = NULL;
DWORD dwError;
BuildExplicitAccessWithName( &explicitaccess, L"BUILTIN\\Users",
GENERIC_ALL, GRANT_ACCESS,
SUB_CONTAINERS_AND_OBJECTS_INHERIT );
dwError = SetEntriesInAcl( 1, &explicitaccess, NULL, &NewAcl );
if( dwError == ERROR_SUCCESS)
{
dwError = SetNamedSecurityInfo( strDir, SE_FILE_OBJECT,
DACL_SECURITY_INFORMATION,
NULL, NULL, NewAcl, NULL );
if( dwError == ERROR_SUCCESS)
{
if( NewAcl != NULL ) AccFree( NewAcl );
return S_OK;
}
}
if( NewAcl != NULL ) AccFree( NewAcl );
return E_FAIL;
}
このコード例は Windows Vista と Windows 7 でも動作します。ただし、これらの OS では、ファイルの ACL を編集するためのコマンド ライン ユーティリティ icacls も提供されており、代わりにこのツールを使用することもできます。
このツールを実行すると詳細なヘルプが表示されますが、ツールの使用例の 1 つを次に示します。
icacls "C:\Users\All Users\Game" /grant Rex:(D,WDAC)
この使用方法では、ユーザー Rex に、ハード ドライブの [すべてのユーザー] 領域に保存されているゲーム フォルダーに対する削除と書き込みの DAC アクセス許可が付与されます。
上級ユーザー向けのインストール
上級ユーザーのインストール シナリオでは、ユーザーがゲームのインストール パスを手動で指定することを望む場合があります。 ディレクトリの選択は、Program Files 以外のディレクトリに制限して、フォルダーがハード ドライブの真に共有可能な領域にあることを確実にする必要があります。 ユーザーが選択したパスは、ゲームの実行可能ファイルとデータのみに使用されるようにするとよいでしょう。ゲームのローダーとパッチャーの実行可能ファイルは、セキュリティを強化するために、常にセキュリティで保護された Program Files フォルダーにインストールする必要があるためです。
ローダーによる信頼の検証
Windows では、署名されたコードの有効性を確認するための WinVerifyTrust 関数が用意されており、この関数はオペレーティング システムの暗号化サービスに基づいています。 この関数については、MSDN の「WinVerifyTrust 関数」で詳しく説明されています。
プログラムの実行可能ファイルが有効な証明書で署名されているかどうかを判定する関数の使用方法の詳細については、「C プログラムの例: PE ファイルの署名の検証」を参照してください。
署名されたゲームの実行可能ファイルがローダー内から実行するのに信頼できるものであることを検証する目的では、汎用の検証アクションで十分です。
-
[値]
-
WINTRUST_ACTION_GENERIC_VERIFY_V2
-
意味
-
Authenticode ポリシー プロバイダーを使用してファイルまたはオブジェクトを検証します。
この関数は、信頼プロバイダーが指定されたアクションを処理するために必要な情報を含む入力構造体引数を受け取ります。 前述の例のように、構造体には通常、信頼プロバイダーが評価しなければならないオブジェクトを識別する情報が含まれています。
構造体の形式は、アクション識別子に固有です。 WinTrust プロバイダーの構造体の例の詳細については、「WINTRUST_DATA 構造体」を参照してください。
信頼プロバイダーが指定されたアクションの対象が信頼できると検証した場合、戻り値はゼロです。 ゼロ以外の値は、成功した戻り値と見なさないようにしてください。
データ検証
コード署名メカニズムは、実行可能ファイル、DLL、Windows インストーラー パッケージ (.msi ファイル)、キャビネット (.cab) ファイルなど、いくつかの特定の種類のファイルの署名のみをサポートしています。 WinVerifyTrust API は、ビッグ データ ファイル (.cab ファイルなど) が改ざんされていないことの検証に使用しないでください。なぜなら、非常に大きなファイルを検証する際にパフォーマンスと安定性に問題があるためです。 プログラムの実行可能ファイルは通常、WinTrust プロバイダーを使用して完全な信頼チェックを実行できるほど十分小さいですが、ゲームのデータ ファイルは多くの場合、数 GB のサイズになります。 ローダーがゲーム データの検証に採用するアプローチは、ゲームの実行時間にわたってデータ セットの小さなサンプルをテストするものにしましょう。 このアプローチにより、検証テストのコストがゲーム プレイ エクスペリエンスの全期間にわたって分散され、長い待ち時間なしのシームレスなユーザー エクスペリエンスをもたらすことができます。 これを実現するには、データの慎重な編成が必要になる場合があります。 一部の MMOG では、時間の経過に伴うゲーム資産の管理、維持、正確性の検証に役立つデータベース アプローチを採用しています。
セキュリティの観点から、信頼できるローダーで何らかの基本的なデータ検証を使用している場合でも、クライアント コードはデータ ファイルを信頼しないように設計するとよいでしょう。 ヘッダー チェック、ハッシュ、その他の従来の整合性チェックを採用するとよいでしょう。 クライアントの I/O コードを強化する作業には、さらにファズ テストなどの手法を使用したり、Visual Studio 2005 および Visual Studio 2008 の /analyze スイッチ (Visual Studio Team System および Windows SDK に付属する無料のコンパイラで使用可能) などの自動静的コード分析ツールを利用したりしてもよいでしょう。
ソフトウェア セキュリティの詳細については、「ゲーム開発におけるセキュリティのベスト プラクティス」を参照してください。