J.D. Meier, Alex Mackman, Blaine Wastell, Prashant Bansode, Kishore
Gopalan
Microsoft Corporation
August 2005
日本語版最終更新日 2006 年 1 月 19 日
適用対象
概要
このガイドでは、中程度の信頼で ASP.NET Web アプリケーションの実行を可能にする方法について説明します。同一サーバー上で複数のアプリケーションをホストする場合、コード アクセス セキュリティと中程度の信頼レベルを使用することでアプリケーション分離を実現することができます。信頼レベルをマシンレベルの Web.config ファイルに設定/ロックすることで、サーバー上で動作するすべての Web アプリケーションに対してセキュリティ ポリシーを定義することができます。ASP.NET Version 2.0 を使用した中程度の信頼の実行では、Microsoft SQL Server データベースにアクセスすることができるため、ASP.NET Version 1.1 を使用した場合に比べて簡単です。中程度の信頼は、アプリケーション同士の分離や共有サーバー リソースからの分離を実現できるよう、制限的な環境を提供しています。中程度の信頼アプリケーションはレジストリへのアクセス権、イベント ログへのアクセス権を持たず、またリフレクションを使用することもできません。Web アクセスは、<trust /> 要素で定義したネットワーク アドレスに制限され、ファイル システム アクセスはアプリケーションの仮想ディレクトリ階層に制限されます。中程度の信頼ポリシーが厳しすぎる場合は、カスタム ポリシー ファイルを作成/使用することができます。
目次
このガイドの目的
はじめに
2.0 における変更点
中程度の信頼について
ステップ概要
ステップ 1. 中程度の信頼を設定する
ステップ 2. 信頼レベルをロックする
ステップ 3. 中程度の信頼をベースにした任意のカスタム ポリシーを作成する
OleDbPermission、EventLogPermission と FileIOPermission
中程度の信頼を使用するための開発
関連資料
このガイドの目的
- 中程度の信頼を使用する Web アプリケーションを開発する方法を学習する
- 部分的に信頼された Web アプリケーションに関する ASP.NET Version 2.0 における変更点を学習する
- 中程度の信用レベルを使用した場合の制限事項を学習する
- Web アプリケーションで中程度の信頼レベルを設定する
- 信頼レベルを修正してカスタム信頼レベルを作成する
はじめに
ASP.NET 2.0 Web アプリケーションおよび Web サービスは、デフォルトの場合、完全な信頼で動作します。そのため、アプリケーションは、特権的な操作を実行したり、オペレーティング システム セキュリティや Windows アクセス コントロール リスト (ACL) を前提とした場合にしかアクセスできないリソースにもアクセスすることができます。
ASP.NET アプリケーションをロック ダウンし、ホスト環境において更なるレベルのアプリケーション分離を実現するためには、コード アクセス セキュリティを使用することでアプリケーションがアクセス可能なリソースや、実行可能な特権的操作を制限することができます。それには、<trust> 要素を以下のように設定します。
<trust level="Full|High|Medium|Low|Minimal" />
<trust> 要素は多数のデフォルト信頼レベルをサポートしています。信頼のレベルごとに、(コード アクセス セキュリティ権限を緩和しながら) アプリケーションの実行環境としてより制限の厳しい環境が提供されます。
様々な企業のたくさんのアプリケーションをホストする必要があるインターネット サービス プロバイダ (ISP) は、中程度の信頼を使用することで、どんな手段をもってしてもアプリケーションが別のアプリケーションのデータを読み取ったり、互いを干渉することがないようにしています。また、中程度の信頼はアプリケーションがアクセス可能な共有システム リソースにも制限を与えます。
2.0 における変更点
ASP.NET Version 1.1 と ASP.NET Version 2.0 で大きく違う点は以下の通りです。
- Version 2.0 より、.NET Framework Data Provider for SQL Server は完全な信頼を要求しなくなったため、中程度の信頼レベルでも SQL Server へのアクセスが可能です。
- Version 2.0 では、完全、高度、中程度の信頼において SmtpPermission が使用できます。これにより、アプリケーションからのメール送信が可能になります。
- Version 2.0 より、OLE DB のマネージ データ プロバイダは完全な信頼を要求しなくなっています。ただしデフォルトのままでは、中程度の信頼アプリケーションに OleDbPermission は付与されていません。部分的な信頼から OLE DB データ ソースにアクセスする場合は、アプリケーションに OleDbPermission を付与するカスタム信頼ポリシー ファイルを作成しなければいけません。詳細については、本ガイドで後述します。
- Version 1.1 では、イベント ログにアクセスする場合、コードに完全な信頼を付与する必要がありましたが、ASP.NET Version 2.0 ではその必要はありません。ただし、EventLogPermission を付与するにはカスタム信頼ポリシー ファイルを作成しなければいけません。詳細については、本ガイドで後述します。
- ASP.NET Version 2.0 より、SQL Server マネージ データ プロバイダは完全な信頼を要求しなくなりました。また中程度の信頼アプリケーションには SqlClientPermission が付与されているため、中程度の信頼アプリケーションは SQL Server データベースにアクセスできます。また中程度の信頼アプリケーションは、SQL Server からの通知の受信を可能にする SqlNotificationPermission (ASP.NET Version 2.0 より導入) を使用できます。
中程度の信頼について
中程度の信頼 Web アプリケーションに適用される主な制限は以下の通りです。
-
OleDbPermission を使用できない。つまり、ADO.NET のマネージ OLE DB データ プロバイダを使用してデータベースにアクセスできません。ただし、マネージ SQL Server プロバイダを使用すれば SQL Server データベースにアクセスできます。
-
EventLogPermission を使用できない。つまり、Windows イベント ログにアクセスできません。
-
ReflectionPermission を使用できない。つまり、リフレクションを使用できません。
-
RegistryPermission を使用できない。つまり、レジストリにアクセスできません。
-
WebPermission が制限される。つまり、アプリケーションは、<trust> 要素で定義したアドレスまたはアドレス範囲でしか通信できません。
-
FileIOPermission が制限される。つまり、アプリケーションの仮想ディレクトリ階層にあるファイルにしかアクセスできません。アプリケーションには、アプリケーションの仮想ディレクトリ階層に対する、読み取り、書き込み、追加、および PathDiscovery 権限が付与されています。
また、アンマネージ コードの呼び出しや Enterprise Services の使用もできません。
ステップ概要
ASP.NET アプリケーションで中程度の信頼を使用するには:
-
ステップ 1. 中程度の信頼を設定する。
-
ステップ 2. 信頼レベルをロックする。
-
ステップ 3. 中程度の信頼をベースにした任意のカスタム ポリシーを作成する。
ステップ 1. 中程度の信頼を設定する
アプリケーションを中程度の信頼で動作するよう設定するには、アプリケーションの仮想ルート ディレクトリにある各アプリケーションの Web.config ファイルかマシンレベルの Web.config ファイルに次の要素を追加します。
<trust level="Medium" originUrl="" />
注意 WebPermission などの一部の権限では、originUrl 属性を使用すれば、あらかじめ定義したアドレス一式へのコネクティビティを制限することができます。
サーバー上で動作するすべての Web アプリケーションを中程度の信頼で動作するよう設定するには、マシンレベルの Web.config ファイルに次の要素を追加します。マシンレベルの Web.config ファイルは 「%windir%\Microsoft.NET\Framework\{version}\CONFIG」 にあります。
Web アプリケーションは、マシンレベルの Web.config ファイルから抜粋した次のデフォルト コンフィグレーションが示すように、デフォルトの状態では完全な信頼で動作するよう設定されています。
<location allowOverride="true">
<system.web>
<securityPolicy>
<trustLevel name="Full" policyFile="internal" />
<trustLevel name="High" policyFile="web_hightrust.config" />
<trustLevel name="Medium"
policyFile="web_mediumtrust.config" />
<trustLevel name="Low" policyFile="web_lowtrust.config" />
<trustLevel name="Minimal"
policyFile="web_minimaltrust.config" />
</securityPolicy>
<trust level="Full" originUrl="" />
</system.web>
</location>
中程度の信頼アプリケーションで利用可能な権限一式を確認したい場合は、Web_mediumtrust.config ファイルを参照してください。
ステップ 2. 信頼レベルをロックする
アプリケーション サービス プロバイダをはじめ、1 つのサーバー上で複数の Web アプリケーションを実行しなければならない者は、中程度の信頼 ポリシー設定をマシンレベルの Web.config ファイルに適用し、Web アプリケーション全体に対して信用レベルをロックしなければいけません。
それには、マシンレベルの Web.config ファイルで、次のコード サンプルが示すように、allowOverride 属性に false を設定します。
<location allowOverride="false">
<system.web>
<securityPolicy>
<trustLevel name="Full" policyFile="internal" />
<trustLevel name="High" policyFile="web_hightrust.config" />
<trustLevel name="Medium"
policyFile="web_mediumtrust.config" />
<trustLevel name="Low"
policyFile="web_lowtrust.config" />
<trustLevel name="Minimal"
policyFile="web_minimaltrust.config" />
</securityPolicy>
<trust level="Medium" originUrl="" />
</system.web>
</location>
allowOverride="false" を設定することで、アプリケーションの Web.config ファイルに設定された中程度の信頼ポリシー設定を個人の開発者がオーバーライドできなくします。
ステップ 3. 中程度の信頼をベースにした任意のカスタム ポリシーを作成する
中程度の信頼が厳しすぎる場合は、中程度の信頼ポリシーをベースにしたカスタム ポリシー ファイルを作成できます。たとえば、アプリケーションで次のようなことを実行したい場合にカスタム ポリシーを作成するといいでしょう: Oracle データベースへの接続、Windows イベント ログへのイベントの書き込み、あるいはアプリケーションの仮想ディレクトリ階層の外にある特定ディレクトリからのファイルの読み取り等。
中程度の信頼をベースにしたカスタム ポリシーを作成するには
- 「%windir%\Microsoft.NET\Framework\{Version}\CONFIG」 ディレクトリにある中程度の信頼ポリシー ファイル web_MediumTrust.config をコピーして、同じディレクトリ内に新しいポリシー ファイルを作成します。
新しいポリシー ファイルに、中程度の信頼のバリエーションであることが分かるような名前を付けます。たとえば、customWeb_MediumTrust.config のような名前をつけるとよいでしょう。
- 付与したい権限を追加します。下の例では、アプリケーションの仮想ディレクトリ階層の外にある、ある特定のディレクトリに対して読み取りアクセスを許可するよう、FileIOPermission を修正しています。
<PermissionSet
class="NamedPermissionSet"
version="1"
Name="ASP.Net">
...
<IPermission
class="FileIOPermission"
version="1"
Read="C:\SomeDir;$AppDir$"
Write="$AppDir$"
Append="$AppDir$"
PathDiscovery="$AppDir$"
/>
...
</PermissionSet>
- マシンレベルの Web.config ファイルに新しいカスタム ポリシー レベルを作成します。ポリシー ファイルは、ステップ 1 で作成したポリシー ファイルの名前です。
<securityPolicy>
<trustLevel name="CustomMedium"
policyFile="customWeb_mediumtrust.config" />
...
</securityPolicy>
- 信頼レベルを "CustomMedium" に設定することで、アプリケーションが新しいカスタム ポリシー レベルで動作するよう設定します。セキュリティ ポリシーは、次の例のようになります。
<system.web>
<securityPolicy>
<trustLevel name="CustomMedium"
policyFile="customWeb_mediumtrust.config" />
<trustLevel name="Full" policyFile="internal" />
<trustLevel name="High"
policyFile="web_hightrust.config" />
<trustLevel name="Medium"
policyFile="web_mediumtrust.config" />
<trustLevel name="Low" policyFile="web_lowtrust.config" />
<trustLevel name="Minimal"
policyFile="web_minimaltrust.config" />
</securityPolicy>
<trust level="CustomMedium" originUrl="" />
</system.web>
OleDbPermission、EventLogPermission および FileIOPermission
一般的によく追加される権限には次のようなものがあります。
-
OleDbPermission
-
EventLogPermision
-
FileIOPermission
OleDbPermission
複数のデータベース サーバー タイプをサポートする場合は、Web アプリケーションに対して、SqlClientPermission (SqlClientPermission はすでに中程度の信頼ポリシーに付与されています) のほかに OleDbPermission を付与する必要があります。
中程度の信頼ポリシーを拡張して OleDbPermission を付与するには
- 前述の "中程度の信頼をベースにしたカスタム ポリシーを作成するには" の手順に従い、カスタム ポリシー ファイルを作成し、アプリケーションでカスタム信頼レベルを使用するための設定を行います。
- 次の権限クラスを <SecurityClasses> セクションに追加します。
<SecurityClass Name="OleDbPermission"
Description="System.Data.OleDb.OleDbPermission, System.Data, Version=2.0.0.0,
Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
- 以下の例のように、制限のない権限 OleDbPermission を "ASP.Net" という名前の権限セットに追加します。
<PermissionSet
class="NamedPermissionSet"
version="1"
Name="ASP.Net">
...
<IPermission class="OleDbPermission"
version="1"
Unrestricted="true"/>
...
</PermissionSet>
接続文字列をロック ダウンする
制限のない権限 OleDbPermission をポリシー ファイルに追加するということは、アプリケーションがサーバー上でどんな OLE DB プロバイダでも使用できるようになるということを意味します。ホスト環境の場合、特定のデータベースにのみアクセスを許可したい場合があります。そのような場合、管理者は OleDbPermission 構文のさらに高度な書式を用いることで、OleDbPermission で使用する接続文字列をロック ダウンすることができます。以下の例では、アクセスを特定の OLE DB データ ソースに制限する方法を示しています。
<IPermission class="OleDbPermission"
version="1">
<add ConnectionString=
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\data\w4w.mdb"
KeyRestrictions=""
KeyRestrictionBehavior="AllowOnly"/>
</IPermission>
<add> 要素は次の属性をサポートしています。
-
ConnectionString: この属性は許可された接続の接続文字列を指定します。
-
KeyRestrictions: この属性は、追加の接続文字列パラメータを指定します。この属性に指定された値が接続文字列に追加されるか否かは、KeyRestrictionBehavior の値に依存します。接続文字列パラメータの指定には "parameterName=" という構文を用います。セミコロン (;) で区切ることで、複数のパラメータを指定することができます。
-
KeyRestrictionBehavior: 値として、AllowOnly または PreventUsage のいずれかを設定できます。
-
AllowOnly を使用すると、KeyRestrictions 属性に指定された追加の接続文字列パラメータのみを ConnectionString に指定した接続文字列に追加することができます。
-
PreventUsage を使用すると、KeyRestrictions 属性に指定された接続文字列パラメータは ConnectionString に指定した接続文字列に追加されません。ただし、別の文字列パラメータを追加することができます。
KeyRestrictions に値の指定がなく、KeyRestrictionBehavior 属性に AllowOnly が設定されていると、追加の接続文字列パラメータを使用することができません。
KeyRestrictions に値の指定がなく、KeyRestrictionBehavior プロパティに PreventUsage が設定されていると、追加の接続文字列パラメータを使用することができます。
EventLogPermission
中程度の信頼ポリシーでは、Windows イベント ログへのアクセスを許可しません。
Windows イベント ログへのアクセスを可能にするには
- 前述の "中程度の信頼をベースにしたカスタム ポリシーを作成するには" の手順に従い、カスタム ポリシー ファイルを作成し、アプリケーションでカスタム信頼レベルを使用するための設定を行います。
- 次の権限クラスをカスタム ポリシー ファイルの <SecurityClasses> セクションに追加します。
<SecurityClasses>
...
<SecurityClass Name="EventLogPermission"
Description="System.Diagnostics.EventLogPermission, System, Version=2.0.0.0,
Culture=neutral, PublicKeyToken=b77a5c561934e089" />
...
</SecurityClasses>
- 次の EventLogPermission を "ASP.Net" という名前の権限セットに追加します。
<PermissionSet
class="NamedPermissionSet"
version="1"
Name="ASP.Net">
...
<IPermission
class="EventLogPermission"
version="1">
<Machine name="."
access="Write"/>
</IPermission>
...
</PermissionSet>
注意 書き込み時は、access="administer" を設定し、部分的に信頼されたアプリケーションからのイベント ログへの書き込みを可能にしておかなければいけません。
イベント ソースを作成する
イベント ソースを作成する必要があるときは、アプリケーションの ID に以下のレジストリ キーに対する適切な権限が付与されていることを確認しなければいけません。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog
Web アプリケーション プロセス ID (Microsoft Windows Server 2003 オペレーティング システムの場合はデフォルトで Network Service) は、上記のレジストリ キーに対して最低でも次の権限を持っていなければいけません。
- キーの値を照会する権限
- キーの値を設定する権限
- サブキーを作成する権限
- サブキーを列挙する権限
- 通知
- 読み取り
これらの設定は、HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog キーとそのサブキーに対して行わなければいけません。あるいは、インストール時に管理者権限が利用できれば、イベント ソースを作成することができます。
注意 Windows イベント ログへのアクセスを有効にすることにより、別アプリケーションによる同一ログへのアクセスやイベントの干渉といったリスクを負うことになり、攻撃者の追跡等の負担が加わります。
FileIOPermission
アプリケーションにアプリケーションの仮想ディレクトリ階層の外側にあるファイルへのアクセスを許可する必要がある場合は、中程度の信頼ファイルをベースにしたカスタム ポリシーを作成し、その上で FileIOPermission を修正します。
たとえば、次の定義により、アプリケーションは 「C:\SomeDir」 ディレクトリ内のファイルを読み取ることができるようになります。
<IPermission
class="FileIOPermission"
version="1"
Read="C:\SomeDir;$AppDir$"
Write="$AppDir$"
Append="$AppDir$"
PathDiscovery="$AppDir$"
/>
アプリケーションの仮想ディレクトリ階層の外側にあるファイルへのアクセスを許すことにより、アプリケーション分離を実現するコード アクセス セキュリティの機能が弱まります。単一のサーバー上に複数のアプリケーションを実行する場合は、ACL を用いたファイルなど、リソースを保護する必要があります。また、アプリケーションごとに独立した ID を使用する必要があります。
中程度の信頼を使用するための開発
中程度の信頼を使用するアプリケーションを開発するためには、以下の点を考慮してください。
-
アプリケーションがアクセスする必要のあるリソースや、実行する必要のある特権的な操作についてはタイプを認識する。
アプリケーションが必要としているコード アクセス セキュリティ権限はないかを把握しておく必要があります。権限要件の詳細については、How To: ASP.NET 2.0 でコード アクセス セキュリティを使用する方法 の "リソース アクセス許可の概要" および "特権付き操作の許可の概要" セクションを参照してください。
-
中程度の信頼で利用可能な権限を理解する。
利用可能な権限を確認する一番よい方法は、「%windir%\Microsoft.NET\Framework\{Version}\CONFIG」 フォルダにある web_MediumTrust.config ファイルをオープンし、中身を検証することです。
-
開発環境とアプリケーションの Web.config ファイルを中程度の信頼を使用するよう設定する。
この設定は、リクエストが失敗する権限や、解決しておく必要のある問題がすぐに分かるよう、開発の最初に行うようにしてください。
-
既存のアプリケーションについては、Permcalc ツールの使用を検討する。
中程度の信頼で動作させたい既存のアプリケーションの場合は、Permcalc ツールの使用を検討してください。このツールを使用することで、アプリケーションが必要とする権限を正確に判断することができます。また、広範囲なテスティングを必ず実行し、アプリケーションから実行するすべてのコード パスが実行されることも検証しなければいけません。これらの確認作業を怠ると、実行時に予期せぬセキュリティ例外が発生することがあります。
一番よいアプローチは、アプリケーションの設計および開発作業を開始する前に信頼レベルを決定し、その信頼レベルに合わせて開発を進めていくことです。既存のアプリケーションを中程度の信頼アプリケーションに切り替える場合のセキュリティ例外のよくある原因としては次のようなものがあります。
- アンマネージ コードを呼び出している。
- レジストリにアクセスしている。
- イベント ログへの書き込みを行っている。
- SQL Server 以外のデータベースに接続している。
- リモート サーバー上の Web リソースにアクセスしている。
- アプリケーションの仮想ディレクトリ階層の外側にあるファイルにアクセスしている。
関連資料
ご意見、ご提案
このガイドに関するご意見、ご提案等がございましたら、Wiki またはメールでお寄せください。
特に、以下に関するご意見、ご提案をお待ちしております。
- 推奨事項に関する技術的な問題
- 実用性および利便性に関する問題
テクニカル サポート
本ガイドに記載されているマイクロソフトの製品およびテクノロジに関するテクニカル サポートは、Microsoft Support Services で対応いたします。製品サポートの詳細につきましては、Microsoft Support のサイト http://support.microsoft.com/ を参照してください。
コミュニティおよびニュースグループ
次のフォーラムおよびニュースグループより、コミュニティ サポートが提供されています。
上手なご利用方法としては、実際にお使いのテクノロジあるいは実際の問題に対応したニュースグループを参照していただくとよいでしょう。たとえば、ASP.NET のセキュリティ機能に関する問題が発生している場合は、ASP.NET Security フォーラムのご利用をお奨めします。
テスト、編集、リリースチーム
-
テストチーム: Larry Brader, Microsoft Corporation; Nadupalli
Venkata Surya Sateesh, Sivanthapatham Shanmugasundaram, Infosys
Technologies Ltd.
-
編集チーム: Nelly Delgado, Microsoft Corporation; Sharon
Smith, Linda Werner & Associates, Inc.; Tina Burden McGrayne,
TinaTech Inc.
-
リリース管理:Sanjeev Garg, Microsoft Corporation