ゲーム開発者向け Windows ファイアウォール
ゲーム ディベロッパー グループ
2004 年 12 月
はじめに
この記事では、Windows ファイアウォールについて、その存在意義、実現できる機能、およびその実現方法を説明します。説明では、Windows ファイアウォールと適切に連動するようにゲームを構成する方法について重点を置きます。
目次
- ファイアウォールとは
- ゲームが影響を受ける場合の措置
- Windows XP SP2 以前のファイアウォール
- 機能が向上した Windows XP SP2 のファイアウォール
- Windows ファイアウォールの操作
- InstallShield InstallScript を使用した統合
- Wise for Windows Installer への統合
- Windows インストーラーへの統合
- 推奨事項
ファイアウォールとは
ファイアウォールは、ネットワークからの侵入に対する障壁となります。ファイアウォールによって、要求されていない着信トラフィックがブロックされ、インターネット制御メッセージプロトコル (ICMP) 要求を拒否することによってインターネットからシステムがほとんど不可視になります。つまり、ping と tracert が機能しなくなります。ファイアウォールでは、無効なパケットの確認と拒否も実行されます。
この障壁によって、機会便乗型攻撃が拒否されます。攻撃は、同じ脆弱性を持つ多くのシステムを見つけることによって広まっていきます。ファイアウォールでは、現在使用されていない機能に対して "応答不可" とマークすることによって多くの攻撃を阻止できます。攻撃は無視されるため、被害を受けることはありません。Windows ファイアウォールの最も重要な利点は、使用されていない機能とアプリケーションが攻撃の手段に利用されないことです。
ユーザーは、使用の必要があり、ネットワークで公開する必要があるアプリケーションと機能を特定するようにシステムを構成します。これは、アプリケーションのインストール時、またはネットワークへアプリケーション自身の公開が試行されるときに発生します。
ゲームが影響を受ける場合の措置
Windows XP SP2 の登場と共に、Windows ファイアウォールは幅広く導入されるようになりました。これは、すべてのマルチプレイヤー Windows ゲームにある程度影響します。一般にクライアントは問題ありませんが、サーバー、ホスト、およびピアツーピアのピアはすべて、動作を続行するように構成する必要があります。特に、要求していない着信トラフィックはドロップされます。ファイアウォールは、パケットの内容および最近のネットワーク活動に基づいて、ネットワークトラフィックのフィルターパケットをインターセプトします。この内容と活動を使用して、パケットを転送するか、ドロップするかが決められます。ファイアウォールを適切に構成すると、ゲームで要求していない着信トラフィックを以前のように受け入れることができるようになります。
要求していない着信トラフィックを受信するアプリケーション
- クライアント/サーバー :すべての参加者が、セントラル サーバーに接続します。セントラル サーバーは、要求していない着信トラフィックを受信します。セントラル サーバーに接続しているクライアントは、リターン トラフィックの送信を要求します。リターン トラフィックは、クライアントに対するルールが遵守されている場合にファイアウォールの通過が許可されます。クライアント トラフィックがファイアウォールを通過できるように、要求していないトラフィックを受け入れるようセントラル サーバーを構成する必要があります。
- 大規模なマルチプレイヤー (MMP) :すべての参加者が、データ センターに接続されます。データ センターが要求していない着信トラフィックを受けるため、クライアントとサーバーの関係は複雑になります。参加者がクライアントで、通常は、要求していないトラフィックを受け入れる必要はありません。
- すべての参加者がお互いに直接接続されるピアツーピア :すべての参加者が、グループに新しく参加したプレイヤーからの要求していないトラフィックを受け付けられる状態である必要があります。ある意味で、各参加者はホストとして機能する必要があるため、すべての参加者をホストであるかのように構成する必要があります。
一般にクライアントには影響がありません。クライアントの送信の伝送制御プロトコル/インターネット プロトコル (TCP/IP) 接続は正常に機能し、送信のユーザー データグラム プロトコル (UDP) メッセージも正常に機能し、これらのメッセージに対する応答も適切なタイミングで機能します。ファイアウォールでは、送信メッセージの返信を見込んで、各送信メッセージの後 90 秒間ポートが開いたままになります。
Windows XP SP2 以前のファイアウォール
Windows XP および Windows Server 2003 のインターネット接続ファイアウォール (ICF) は、ステートフル パケット フィルターの 1 つで、インターネット プロトコル バージョン 4 (IPv4) およびインターネット プロトコル バージョン 6 (IPv6) の両方を扱います。ただし、ICF は、デフォルトでは有効になっておらず、全国的な電話会社を含む大規模なインターネット プロバイダーなど、全世界の多数のサード パーティ ネットワーク スタックがサポートされていません。
Windows XP SP2 をインストールしていない場合は、ICF を有効にすることを強くお勧めします。お使いの PC を保護する初歩の手順として、https://www.microsoft.com/japan/protect/default.mspx にあるインターネット ファイアウォール使用の手順を参照してください。インターネット接続ファイアウォール (ICF) では、パケット フィルターをオーバーライドするためのポート マッピングを使用できます。基本的には、開くポートを指定すると、そのポートは閉じるまで開いたままです。ユーザーがポートを閉じる前に再起動した場合でも、ポートは明示的に閉じられるまで開いたままです。ファイアウォールの制御とポート マッピングの管理は、INetSharingManager (IPv4) および INetFWV6Mgr (IPv6) を使用して実行されます。
Windows XP SP2 用の Windows ファイアウォールはより包括的なソリューションで、サード パーティのネットワーク スタックをサポートし、ポートがよりインテリジェントな方法で扱われます。アプリケーションがポートをアクティブな状態のままにする必要がある場合にのみ、ポートが開いたままになります。
機能が向上した Windows XP SP2 のファイアウォール
Windows XP SP2 では、セキュリティに関する選択肢と設定が前面に出ています。デフォルトでの保護が目的とされており、ユーザーは、使用するコンピューターで実行を許可するアプリケーションを情報に基づいて選択できます。
この新しい Windows ファイアウォールは、Windows XP SP2 と Windows Server 2003 Service Pack 1 (SP1) の両方でサポートされています。これは、ICF と同様に、IPv4 と IPv6 の両方をサポートするソフトウェア ファイアウォールですが、ICF とは次の点で異なります。
- システム起動時の保護が提供され、起動時の小さな脆弱性の隙を排除します。
- サード パーティのネットワーク スタックをサポートします。
- 要求していない着信パケットすべてをブロックする "例外なく有効" のモードがあります。これは、空港やコーヒー ショップなどのパブリック ネットワークを使用する場合に有用です。
"例外なく有効" のモードでは、すべての静的なホールが閉じます。静的ホールを開く API 呼び出しは、許可されますが遅延します。つまり、ファイアウォールが通常の動作に戻るまで API 呼び出しは適用されません。アプリケーションによるリッスン要求もすべて無視されます。送信接続は引き続き正常に実行されます。
新しいアプリケーションの場合、インストール時にアプリケーションを "例外の一覧" に追加します。INetFWAuthorizedApplications インターフェイスを使用し、完全なパスを入力して、アプリケーションを追加できます。詳細は後述の例で示します。
なお、ユーザーの介入なしに、アプリケーションが例外の一覧からアプリケーションの追加および削除を実行できることはセキュリティ上のリスクではないかと危惧するユーザーがいるかもしれません。また、さらに大きなリスクとして、アプリケーションがファイアウォールも一緒に無効にしてしまう可能性があるのではないかと考えるかもしれません。このレベルの設定を行うには、アプリケーションに管理者権限が必要です。システムに管理者モードで実行されてい不正コードがある場合は、ゲームは既に終了しており、ハッカーが勝利を収めています。ハッカーは、脚注を作成するのと同じ程度の労力でファイアウォールを無効にできてしまいます。
ユーザーが Windows XP SP2 にアップグレードする前にインストールしたアプリケーションを含めて、レガシ アプリケーションは、例外の一覧のポップアップを使用して処理されます (図 1 を参照)。このダイアログは、アプリケーションが着信トラフィックに対してポートを開こうとしたときに表示されます。つまり、0 以外の UDP ポートについて bind() を呼び出したとき、または TCP/IP プロトコルについて accept() を呼び出したときに表示されます。アプリケーションの [ブロックの解除] を選択するには、管理者として実行している必要があります。[後で確認する] を選択すると、今回は許可されませんが、次回に再度確認されます。
これは、ブロック不可のシステム モーダル ダイアログ ボックスです。全画面 Microsoft Direct3D アプリケーションを実行している場合、このダイアログはアプリケーションの下に表示されるため、ユーザーはアプリケーションが全画面モードを終了したとき、または Alt + Tab キーを押してデスクトップに戻ったときに処理できます。ただし、ゲームが全画面で実行されているときは、このダイアログが表示されたことがユーザーに常に明らかであるとは限りません。このため、次の説明のように、INetFWAuthorizedApplications インターフェイスを使用して、このダイアログを表示しないようにすることが重要です。
図形 1. 例外の一覧ポップアップ ダイアログ
このポップアップでは、アプリケーションの名前とパブリッシャーが認識されていることがわかります。手品が使用されたわけではありません。実行可能ファイルのバージョン情報から引き出されただけです。これは、システム管理上の重要な情報の 1 つで、現行のアプリケーションの互換性処理でも使用されます。アプリケーションによっては、このバージョン情報が最新に保たれていない場合があります。
ユーザーは、ユーザー インターフェイス (UI) を使用してアプリケーションを追加することもできます (図 2 を参照)。
図形 2. ファイアウォールの構成
図形 3. ファイアウォールの例外の一覧へのプログラムの追加
最善のシナリオは、例外の一覧での追加と削除を自動化することです。これらの追加と削除を実行する最適なタイミングは、インストールおよびアンインストール プロセスです。ファイアウォールの例外の一覧からの追加と削除には、管理者権限が必要なことを忘れないでください。
Windows ファイアウォールの操作
前述のとおり、ゲームがサーバーとして機能できる場合、またはゲームにピアツーピアの通信プロトコルが実装されている場合、ほとんどのゲームについて、必要な処理はファイアウォールの例外の一覧に追加することだけです。FirewallInstallHelper.dll は、インストーラーから呼び出すことができる DLL の 1 例です。ソースを直接のアプリケーションに統合できるようにソースが提供されています。このサンプル ファイルは、次の場所にあります。
ソース : | (SDK ルート)\Samples\C++\Misc\FirewallInstallHelper |
実行可能ファイル : | (SDK ルート)\Samples\C++\Misc\Bin\<arch>\FirewallInstallHelper.dll |
この DLL からエクスポートされる関数は、次のとおりです。
- AddApplicationToExceptionListW
この関数によって、アプリケーションが例外の一覧に追加されます。この関数は、実行可能ファイルへの完全なパスとファイアウォールの例外の一覧に表示されるフレンドリ名を取得します。この関数には、管理者権限が必要です。 - AddApplicationToExceptionListA
AddApplicationToExceptionListW の ANSI バージョンです。 - RemoveApplicationFromExceptionListW
この関数によって、アプリケーションが例外の一覧から削除されます。この関数は、実行可能ファイルへの完全なパスを取得します。この関数には、管理者権限が必要です。 - RemoveApplicationFromExceptionListA
RemoveApplicationFromExceptionListW の ANSI バージョンです。 - CanLaunchMultiplayerGameW
この関数は、アプリケーションが無効になったこと、または例外の一覧から削除されたことをレポートします。この関数は、ゲームを実行するたびに呼び出す必要があります。この関数は、実行可能ファイルへの完全なパスを取得します。この関数には、管理者権限は必要ありません。 - CanLaunchMultiplayerGameA
CanLaunchMultiplayerGameW の ANSI バージョンです。 - SetMSIFirewallProperties
Windows インストーラーでカスタム アクションを使用する場合にのみこの関数を呼び出します。詳細については、以下の説明を参照してください。 - AddToExceptionListUsingMSI
Windows インストーラーでカスタム アクションを使用する場合にのみこの関数を呼び出します。詳細については、以下の説明を参照してください。 - RemoveFromExceptionListUsingMSI
Windows インストーラーでカスタム アクションを使用する場合にのみこの関数を呼び出します。詳細については、以下の説明を参照してください。
次のセクションでは、この FirewallInstallHelper からエクスポートされた DLL 関数を InstallShield、Wise、または Windows インストーラー パッケージ内で呼び出す方法について説明します。すべての方法が同じ結果になるため、どのメソッドを実装するのかを決めるのは開発者の判断によります。
InstallShield InstallScript を使用した統合
ファイアウォール API を使用する代わりに、InstallShield InstallScript へ関数呼び出しを追加する方法があります。統合に必要な手順は非常に簡単です。
- InstallShield エディターで InstallScript プロジェクトを開きます。
- このプロジェクトに FirewallInstallHelper.dll をサポート ファイルとして追加します。
- [プロジェクト アシスタント] タブの [アプリケーション ファイル] タブを開きます。
- [ファイルの追加] ボタンをクリックして、ファイルを対象のフォルダーに追加します。
- 作成した FirewallInstallHelper.dll を参照するか、DirectX SDK で提供されている FirewallInstallHelper.dll を選択して、プロジェクトに追加します。
- プロジェクトへ InstallScript を追加します。
[インストール デザイナー] ビューを開いて、[動作とロジック]、[InstallScript] の順にクリックします。
InstallScript ファイル (通常は setup.rul) をクリックして、エディターで開きます。
次のコードを InstallScript ファイルに貼り付けます。
#include "ifx.h" prototype BOOL FirewallInstallHelper.AddApplicationToExceptionListW( WSTRING, WSTRING ); prototype BOOL FirewallInstallHelper.RemoveApplicationFromExceptionListW( WSTRING ); function OnMoved() WSTRING path[256]; begin // The DLL has been been installed into the TARGETDIR if !MAINTENANCE then // TRUE when installing UseDLL( TARGETDIR ^ "FirewallInstallHelper.dll" ); path = TARGETDIR ^ "TODO: change to relative path to executable from install directory"; FirewallInstallHelper.AddApplicationToExceptionListW( path, "TODO: change to friendly app name" ); UnUseDLL( TARGETDIR ^ "FirewallInstallHelper.dll" ); endif; end; function OnMoving() WSTRING path[256]; begin // The DLL is about to be removed from TARGETDIR if MAINTENANCE && UNINST != "" then // TRUE when uninstalling UseDLL( TARGETDIR ^ "FirewallInstallHelper.dll" ); path = TARGETDIR ^ "TODO: change to relative path to executable from install directory"; FirewallInstallHelper.RemoveApplicationFromExceptionListW( path ); UnUseDLL( TARGETDIR ^ "FirewallInstallHelper.dll" ); endif; end;
TODO コメントを、ファイアウォールの例外の一覧に表示されるアプリケーション名、およびインストール ディレクトリからゲーム実行可能ファイルへの相対パスに変更します。
Wise for Windows Installer への統合
Wise for Windows Installer と統合するには、次の操作を実行します。
- Wise for Windows Installer プロジェクトを開きます。
- 下部にある [インストール エキスパート] タブを選択します。
- [ファイル] をクリックして、DXSDK からゲームのインストール ディレクトリに FirewallInstallHelper.dll を追加します。
- 下部にある [MSI スクリプト] タブを選択します。
- 下部にある [即時実行] タブを選択します。
- CostFinalize の後ろに、"[INSTALLDIR]インストールディレクトリから実行可能ファイルへの相対パス" へ FULLPATH (完全パス) を設定する "Set Property" アクションを追加します。たとえば、"[INSTALLDIR]game.exe" を追加します (引用符は含まない)。
- 下部にある [遅延実行] タブを選択します。
- PublishProduct の後ろに、"NOT Installed" (大文字と小文字を区別) の条件で "If" ステートメントを追加します。
- If ブロック内に "Call Custom DLL from Destination" アクションを追加します。
- [DLL ファイル] フィールドを "[INSTALLDIR]FirewallInstallHelper.dll" に設定します。
- [関数名](Function Name) フィールドを "AddApplicationToExceptionListA" に設定します。
- 種類が "string pointer"、値のソースが "Property"、プロパティ名が "FULLPATH" のパラメーターを追加します。
- 種類が "string pointer"、値のソースが "Constant" の 2 つ目のパラメーターを追加して、定数値を、ファイアウォールの例外の一覧に表示するアプリケーションのフレンドリ名に設定します。
- "End Statement" を追加して If ブロックを終了します。
- 上部の RemoveFiles アクションのすぐ上に、別の If ブロックを追加し、条件 "REMOVE~="ALL"" (大文字と小文字が区別され、外側の引用符は含まない) を指定します。
- この 2 つ目の If ブロック内に "Call Custom DLL from Destination" アクションを追加します。
- [DLL ファイル] フィールドを "[INSTALLDIR]FirewallInstallHelper.dll" に設定します。
- [関数名](Function Name) フィールドを "RemoveApplicationFromExceptionListA" に設定します。
- 種類が "string pointer"、値のソースが "Property"、プロパティ名が "FULLPATH" のパラメーターを追加します。
- "End Statement" を追加して 2つ目の If ブロックを終了します。
Windows インストーラーへの統合
高度なレベルで Windows Installer と統合するには、次の操作を実行します。詳細については後述します。
- 後述の説明に従って、FriendlyNameForFirewall と RelativePathToExeForFirewall の 2 つのプロパティを追加します。
- CostFinalize アクションの次に、SetMSIFirewallProperties を即時カスタム アクションで呼び出して、その他のカスタム アクションに適切な MSI プロパティを設定します。
- InstallFiles アクションの後のインストール時に、FirewallInstallHelper の "AddToExceptionListUsingMSI" 関数を使用する遅延カスタム アクションを呼び出します。
- InstallFiles アクションの後のアンインストール時に、FirewallInstallHelper の "RemoveFromExceptionListUsingMSI" 関数を使用する遅延カスタム アクションを呼び出します。
- ロールバック時に、FirewallInstallHelper の "RemoveFromExceptionListUsingMSI" 関数を呼び出す遅延カスタム アクションを呼び出します。
次に、Platform SDK に含まれる Orca などの MSI エディターを使用して上記を実行するときに必要な手順を示します。エディターによっては、次の手順の一部を簡略化するウィザードを使用する場合があります。
Orca で MSI パッケージを開きます。
Binary テーブルに以下を追加します。
名前 データ FIREWALL FirewallInstallHelper.dll を指すようにこれを設定します。このファイルは、MSI パッケージに埋め込まれるため、FirewallInstallHelper.dll を再コンパイルするたびにこの手順を実行する必要があります。 CustomAction テーブルに以下を追加します。
アクション 種類 Source ターゲット FirewallSetMSIProperties msidbCustomActionTypeDll + msidbCustomActionTypeBinaryData + msidbCustomActionTypeContinue = 65 FIREWALL SetMSIFirewallProperties FirewallAdd msidbCustomActionTypeDll + msidbCustomActionTypeBinaryData + msidbCustomActionTypeContinue + msidbCustomActionTypeInScript + msidbCustomActionTypeNoImpersonate = 3137 FIREWALL AddToExceptionListUsingMSI FirewallRemove msidbCustomActionTypeDll + msidbCustomActionTypeBinaryData + msidbCustomActionTypeContinue + msidbCustomActionTypeInScript + msidbCustomActionTypeNoImpersonate = 3137 FIREWALL RemoveFromExceptionListUsingMSI FirewallRollBackAdd msidbCustomActionTypeDll + msidbCustomActionTypeBinaryData + msidbCustomActionTypeContinue + msidbCustomActionTypeRollback + msidbCustomActionTypeInScript + msidbCustomActionTypeNoImpersonate = 3393 FIREWALL RemoveFromExceptionListUsingMSI FirewallRollBackRemove msidbCustomActionTypeDll + msidbCustomActionTypeBinaryData + msidbCustomActionTypeContinue + msidbCustomActionTypeRollback + msidbCustomActionTypeInScript + msidbCustomActionTypeNoImpersonate = 3393 FIREWALL AddToExceptionListUsingMSI InstallExecuteSequence テーブルに以下を追加します。
アクション 条件 シーケンス 備考 FirewallSetMSIProperties 1010 これは、CostFinalize のすぐ後ろに配置します。 FirewallAdd NOT Installed 4021 このカスタム アクションは、新規インストール時にのみ実行されます。シーケンス番号によって、InstallFiles の後およびロールバックの後にこのアクションが配置されます。 FirewallRollBackAdd NOT Installed 4020 このカスタム アクションは、新規インストールがキャンセルされたときにのみ実行されます。シーケンス番号によって、InstallFiles の後および Add カスタム アクションの前にこのアクションが配置されます。 FirewallRemove Installed 3461 このカスタム アクションは、アンインストール時にのみ実行されます。シーケンス番号によって、RemoveFiles の直後およびロールバックの後にこのアクションが配置されます。 FirewallRollBackRemove NOT Installed 3460 このカスタム アクションは、アンインストールがキャンセルされたときにのみ実行されます。シーケンス番号によって、RemoveFiles の直前および Remove カスタム アクションの後にこのアクションが配置されます。 Property テーブルに以下を追加します。
プロパティ 値 FriendlyNameForFirewall 例外の一覧に表示される名前である必要があります。たとえば、"Example Game" です。 RelativePathToExeForFirewall インストールしたゲームの実行可能ファイルである必要があります。たとえば、"ExampleGame.exe" です。
Windows インストーラー の詳細については、「Windows Installer」を参照してください。
推奨事項
ファイアウォールは今日広く普及しています。ここでは、作成した Windows ゲームで顧客が適切にファイアウォールを使用できるように推奨事項を示します。
- ユーザーにゲームでプレイするためにファイウォールを無効にするよう指示しないでください。ファイアウォールを無効にすると、ユーザーがゲームでプレイしていないときでもコンピューター全体が脆弱になります。
- ユーザーのために、ファイウォールの構成をシームレスにします。インストール時にアプリケーションを例外の一覧に追加し、インストール時に例外の一覧からアプリケーションを削除します。
- ファイアウォールのステートによってマルチプレイヤーをブロックする場合は、ユーザーにフィードバックします。たとえば、アプリケーションが許可されないか、またはシステムが "例外なし" モードにあるためにネットワーク機能が動作しない場合は、ネットワーク機能を無効にします。