公開日: 2004年9月7日 | 最終更新日:
2004年9月7日
トピック
目的
このモジュールの目的は次のとおりです。
| • | .NET アセンブリのためのコード アクセス セキュリティ ポリシーを構成する。 |
| • | コード アクセス セキュリティを使用して、アセンブリが実行できるファイル I/O
を制限する。 |
適用対象
このモジュールは、次の製品およびテクノロジに適用されます。
| • | Microsoft® Windows® 2000 Server、Windows 2000 Professional、Windows
Server™ 2003、および Windows XP Professional |
| • | Microsoft .NET Framework Version 1.1 |
モジュールの使用方法
モジュールの効果的な使用方法
| • | Visual C# .NET および Visual Studio .NET
を使用したプログラミング経験が必要です。 |
要約
管理者は、.NET Framework コード (アセンブリ) の動作を制約することにより、コード アクセス セキュリティ
ポリシーを構成できます。このモジュールでは、コード アクセス セキュリティ ポリシーを構成して、アセンブリが実行できるファイル I/O
を制約し、指定したディレクトリのみにファイル I/O を限定する方法について説明します。
必要な知識
このモジュールでは、.NET Framework 1.1 構成ツールを使用して新しいアクセス許可セットと新しいコード
グループを作成します。アクセス許可セットでは、コードに実行を許可する処理と、許可しない処理の種類を定義します。コード
グループでは、アクセス許可セットを特定のコード (指定したアセンブリやアセンブリ セット) に関連付けます。
ファイル I/O を制約できるだけでなく、コードにその他の制約も課すためにコード アクセス セキュリティ
ポリシーを使用することができます。たとえば、データベース、ディレクトリ サービス、イベント ログ、レジストリ、DNS (ドメイン ネーム システム)
サーバー、アンマネージ コード、環境変数といった、コード アクセス
セキュリティで保護される他の種類のリソースへのコードからのアクセスも制限することができます。
注: 上に挙げたリソースの種類はすべてを網羅したものではありませんが、Web
アプリケーションがアクセスする一般的なリソースのほとんどを挙げてあります。
コード アクセス セキュリティ ポリシーを使用してアセンブリを制約する作業に入る前に、以下の点を知っておいてください。
| • | Web アプリケーションをその仮想ディレクトリ階層構造内のファイルにしかアクセスできないように制約するには、Web.config
に次の行を記述して、アプリケーションが中程度の信頼で実行されるように構成します。 <system.web>
<trust level="Medium" />
</system.web>
これにより、ASP.NET のコード アクセス セキュリティ ポリシーが使用されて、Web アプリケーションの実行できるファイル
I/O が制約され、さらに Web アプリケーションにその他の制約も課されます。たとえば、中程度の信頼のアプリケーションは、イベント
ログ、レジストリ、OLE DB データ ソースなどに直接アクセスすることはできません。 |
| • | ASP.NET のコード アクセス セキュリティ ポリシーは、エンタープライズ レベル、コンピュータ レベル、およびユーザー
レベルそれぞれのコード アクセス セキュリティ ポリシーから個別に構成されます。.NET Framework Version 1.1
の構成ツールでサポートされるのは、エンタープライズ レベル、コンピュータ レベル、およびユーザー レベルのポリシーだけです。 ASP.NET ポリシーは、テキスト エディタまたは XML
エディタを使用してメンテナンスしなければなりません。中程度の信頼を使用して Web
アプリケーションを実行する方法の詳細については、モジュール 9「ASP.NET でコード アクセス
セキュリティを使用する」を参照してください。 |
| • | アセンブリをビルドする場合は、コード アクセス
セキュリティを使用してプログラミングにより制約を課すことができます。これを行う方法の詳細については、モジュール 8「コード アクセス
セキュリティの実践」を参照してください。 |
| • | 正規化問題によってセキュリティ リスクが生じるため、ユーザーからファイル名やパスを受け取るような Web
アプリケーションの作成は、基本的には避けるべきです。ときには入力としてファイル名を受け取る必要が生じる場合があります。この
[HOWTO] では、アセンブリを制約して、アセンブリがファイル
システムの任意の部分にアクセスすることができないようにする方法を示します。ファイル I/O 実行の詳細については、「Web
アプリケーション セキュリティ強化」のモジュール 7「セキュリティ保護されたアセンブリを構築する」の「ファイル
I/O」、およびモジュール 8「コード アクセス セキュリティの実践」の「Web アプリケーション
セキュリティ強化」を参照してください。 |
| • | コード アクセス セキュリティの基本事項の詳細については、「Web アプリケーション セキュリティ強化」のモジュール 8「コード
アクセス セキュリティの実践」を参照してください。 |
ファイル I/O を実行するアセンブリを作成する
この手順では、渡されたファイル名を使用してファイル I/O を実行するアセンブリを作成します。
| • | ファイル I/O を実行する新しいアセンブリを作成するには | 1. | Microsoft Visual C#® 開発ツールで、FileIO という名前のクラス ライブラリ
プロジェクトを新規作成し、class1.cs を FileIO.cs に名前変更します。 | | 2. | アセンブリに厳密な名前を追加します。 厳密な名前を追加すると、アセンブリにデジタル署名することにより、その改変を防ぐことができます。厳密な名前の公開キー
コンポーネントは、コード アクセス セキュリティ
ポリシーのための、暗号化として厳密な証拠も提供します。管理者は、アセンブリを一意に識別する厳密な名前を使用することにより、ポリシーを適用できます。 | | 3. | アセンブリのバージョンを固定します。Assemblyinfo.cs を開き、AssemblyVersion
属性を次のように設定します。 [assembly: AssemblyVersion("1.0.0.1")]
| | 4. | FileIO.cs の先頭に以下の using ステートメントを追加します。 using System.IO;
using System.Text;
| | 5. | Class1 を FileWrapper に名前変更し、継承できないようにクラスをシールします。 public sealed class FileWrapper
| | 6. | 既定のコンストラクタの名前をクラス名と一致するように名前変更し、private
に変更します。これにより、FileWrapper
クラスのインスタンスの作成を防ぐことができます。このクラスは、静的なメソッドのみを提供します。 | | 7. | 以下のパブリック メソッドを追加します。このメソッドは、指定されたファイルの内容を読み取ります。 public static string ReadFile(string filename)
{
byte[] fileBytes = null;
long fileSize = -1;
Stream fileStream = null;
try
{
if(null == filename)
{
throw new ArgumentException("ファイル名が指定されていません。");
}
// 渡されたファイル名を正規化し、検証します。
// GetFullPath
// - 無効な文字 (Path.InvalidPathChars によって定義された文字) がないかどうかをチェックします。
// - Win32 のファイル以外のデバイス (物理デバイス、パラレルポート、
// シリアル ポート、パイプ、メール スロットなど) のデバイス名
// ではないかどうかをチェックします。
// - ファイル パスを標準化します。
filename = Path.GetFullPath(filename);
fileStream = File.OpenRead(filename);
if(!fileStream.CanRead)
{
throw new Exception("ファイルを読み取れません。");
}
fileSize = fileStream.Length;
fileBytes = new byte[fileSize];
fileStream.Read(fileBytes, 0, Convert.ToInt32(fileSize));
return Encoding.ASCII.GetString(fileBytes);
}
catch (Exception ex)
{
throw ex;
}
finally
{
if (null != fileStream)
fileStream.Close();
}
}
| |
Web アプリケーションを作成する
この手順では、ファイル I/O アセンブリを呼び出す Web アプリケーション アセンブリを作成します。
| • | Web アプリケーションを作成するには | 1. | C# で、FileIOWeb という名前の新しい ASP.NET Web アプリケーション
プロジェクトを現在のソリューションに追加します。 | | 2. | FileIO プロジェクトを参照する新しいプロジェクトにプロジェクト参照を追加します。 | | 3. | WebForm1.aspx にテキスト
ボックスを追加して、ユーザーがパスとファイル名を入力できるようにします。追加したテキスト ボックスの Text プロパティを
"c:\temp\somefile.txt" に設定し、ID を txtFileName に設定します。 | | 4. | WebForm1.aspx にボタンを追加し、Text プロパティを "ファイルの読み取り" に、ID を
btnReadFile に設定します。 | | 5. | [ファイルの読み取り] ボタンをダブルクリックして、イベント ハンドラに次のコードを追加します。 string s = FileIO.FileWrapper.ReadFile( txtFileName.Text );
Response.Write(s);
| | 6. | ソリューションをビルドします。 | |
コード アクセス セキュリティ制約のないファイル I/O をテストする
ローカル コンピュータにある Web アプリケーションとアセンブリには、既定では、コード アクセス セキュリティ
ポリシーによって完全な信頼が与えられます。Machine.config ファイルに記述されている既定の <trust>
構成は次のようになっており、すべての Web アプリケーションに完全な信頼レベルを割り当てます。
<trust level="Full" originUrl="" />
完全な信頼を与えられた Web アプリケーションは、コード アクセス セキュリティ
ポリシーによっていかなる制約も課されません。リソースへのアクセスが成功するか失敗するかは、オペレーティング
システムのセキュリティのみによって決まります。
| • | コード アクセス セキュリティ制約の無いファイル I/O をテストするには | 1. | メモ帳を使って Somefile.txt という名前のテキスト
ファイルを作成し、簡単なテキスト文字列を入力してから、そのファイルを C:\temp ディレクトリに保存します。ルート
ディレクトリ C:\ にも、そのファイルのコピーを保存します。 | | 2. | Web アプリケーションを実行し、[ファイルの読み取り] をクリックします。 テキスト
ファイルの内容が表示されます。 | | 3. | テキスト ボックスに「c:\somefile.txt」と入力し、[ファイルの読み取り]
をクリックします。 テキスト
ファイルの内容が表示されます。 | |
ファイル I/O を制約するためにコード アクセス セキュリティ ポリシーを構成する
この手順では、FileIO アセンブリのためのコード アクセス セキュリティ ポリシーを構成し、それに制限された
FileIOPermission を与えて、C:\Temp 以下のファイルにしかアクセスできないようにします。まず、制限された
FileIOPermission を含む新しいアクセス許可セットを作成します。次に、新しいコード
グループを作成し、厳密な名前による証拠を使用して、新しいアクセス許可セットを FileIO アセンブリに関連付けます。
| • | 新しいアクセス許可セットを作成するには | 1. | [管理ツール] フォルダから .NET Framework Version 1.1
構成ツールを起動します。 | | 2. | [ランタイム セキュリティ ポリシー] ノードを展開します。 [エンタープライズ
(Enterprise)]、[コンピュータ (Machine)]、[ユーザー (User)] の 3 レベルのコード
アクセス セキュリティ ポリシーが表示されます。これからコード アクセス セキュリティ ポリシーを構成する 4
つ目のレベルは、アプリケーション ドメイン レベルです。ASP.NET ではアプリケーション ドメイン
レベルのポリシーが実装されていますが、これは .NET Framework Version 1.1
構成ツールではメンテナンスできません。ASP.NET ポリシーを編集するには、テキスト
エディタを使用しなければなりません。 ASP.NET ポリシーとその使用方法の詳細については、モジュール 9「ASP.NET でコード アクセス
セキュリティを使用する」を参照してください。 | | 3. | [コンピュータ (Machine)] ノードを展開します。 [コード グループ] フォルダと
[アクセス許可セット] フォルダが表示されます。各ポリシー ファイルは、階層構造状のコード グループ
コレクションを持ちます。コード グループは、アクセス許可をアセンブリに割り当てるために使用されます。コード グループは、次の
2 つの要素で構成されます。 | • | メンバシップ条件 — 証拠 (たとえばアセンブリの厳密な名前) に基づいた条件です。 | | • | アクセス許可セット —
アクセス許可セットに含まれるアクセス許可が、メンバシップ条件と一致する証拠を持つアセンブリに与えられます。 | "アクセス許可セット" とは、個々のコード アクセス セキュリティ
アクセス許可の集まりを含むグルーピングです。個々のアクセス許可は、コードが特定の種類のリソースにアクセスする権利、または特定の種類の特権操作を実行する権利を表します。 | | 4. | [アクセス許可セット] を右クリックし、[新規作成] をクリックします。 | | 5. | [名前] テキスト ボックスに「RestrictedFileIO」と入力し、[次へ]
をクリックします。 | | 6. | [使用できるアクセス許可] ボックスの一覧で [ファイル IO] を選択し、[追加]
をクリックします。 | | 7. | [ファイル パス] 列に「c:\Temp」と入力し、[読み取り] 列と [パス 探索] 列のチェック
ボックスをオンにします。 [パス 探索] アクセス許可は、FileIO
アセンブリが渡されたファイル名を検証して、その有効性を検証するために使用する Path.GetFullPath
関数に必要です。 [読み取り] アクセス許可は、FileIO アセンブリがテキスト ファイルを開くために使用する
File.OpenRead メソッドに必要です。 | | 8. | [OK] をクリックします。 | | 9. | [使用できるアクセス許可] ボックスの一覧で [セキュリティ] を選択し、[追加]
をクリックします。 FileIO アセンブリには、FileIOPermission
に加えて、実行するためのアクセス許可も必要です。実行するためのアクセス許可は、Flags プロパティを
SecurityPermissionFlag.Execution に設定した SecurityPermission
により表されます。 | | 10. | [アセンブリを有効にする] チェックボックスをオンにし、[OK] をクリックします。 | | 11. | [完了] をクリックして、アクセス許可セットの作成を完了させます。 これで、RestrictedFileIO
という名前の新しいアクセス許可セットが作成されました。このアクセス許可セットには、C:\Temp
ディレクトリでの読み込みとパス 探索を許可する制限された FileIOPermission
と、アセンブリの実行を許可する制限された SecurityPermission
が含まれています。 | |
| • | 新しいコード グループを作成するには | 1. | [コード グループ] を展開し、[All_Code] を展開します。 | | 2. | [All_Code] を右クリックし、[新規作成] をクリックします。 | | 3. | コード グループ名として「FileIOAssembly」と入力し、[次へ] をクリックします。 | | 4. | [このコード グループの条件の種類を選択します] ボックスの一覧から [厳密な名前] を選択します。 このコード
グループを、RestrictedFileIO アクセス許可セットで定義した一連のアクセス許可を FileIO
アセンブリに適用するために使用します。厳密な名前は、アセンブリを一意に識別するために、暗号化のうえで厳密な証拠を提供します。 | | 5. | FileIO アセンブリの公開キーを指定するために
(アセンブリは、厳密な名前を持っていれば、公開キーを持っています)、[インポート] をクリックし、FileIO.dll
の置かれているプロジェクト出力フォルダに移動して、FileIO.dll を選択します。[開く]
をクリックして、アセンブリから公開キーを抽出します。 | | 6. | [次へ] ボタンをクリックし、[既存のアクセス許可セットを使用] リストの一覧から
[RestrictedFileIO] を選択します。 | | 7. | [次へ] をクリックし、[完了] をクリックして、コード
グループの作成を完了させます。 これで、RestrictedFileIO
アクセス許可セットによって定義されたアクセス許可を FileIO アセンブリに適用する新しいコード
グループが作成されました。 | | 8. | [FileIOAssembly] コード グループを選択し、右側のウインドウ枠内で [コード グループ
プロパティの編集] をクリックします。 | | 9. | [このポリシーレベルはこのコード グループに関連するアクセス許可セットからのアクセス許可のみを持つ] チェック
ボックスと [このレベル以下のポリシーレベルは評価しない] チェック ボックスをオンにします。 コード
グループのこれらの属性をオンにすることで、現在のコンピュータ レベルでも、ASP.NET アプリケーション ドメイン
レベルからでも、他のコード グループが FileIO
アセンブリに与えられたアクセス許可セットに影響を与えることは一切なくなります。これにより、先に作成した
RestrictedFileIO
アクセス許可セットで定義されているアクセス許可のみを確実にアセンブリに与えることができます。 注: このアセンブリはローカル コンピュータにインストールされており、My_Computer_Zone
の設定値に該当するため、これらのチェック ボックスをオンにしておかないと、既定のコンピュータ
ポリシーによってアセンブリに完全な信頼が与えられてしまいます。 | | 10. | [OK] をクリックして、プロパティ ダイアログ
ボックスを閉じます。 | |
コード アクセス セキュリティ制約を持つファイル I/O をテストする
この手順では、FileIO アセンブリをグローバル アセンブリ キャッシュ (GAC) 内にインストールします。次に、Web
アプリケーションを実行して、C:\Temp 内のファイルと、C:\Temp 外のファイルにアクセスを試みます。前の手順で構成したコード アクセス
セキュリティ ポリシーがコードに制約を課すため、コードは C:\Temp の下にあるファイルにしかアクセスできません。
ASP.NET は厳密な名前のアセンブリをドメイン中立のアセンブリとして読み込むので、アセンブリは GAC
内にインストールされていなければなりません。ASP.NET の Web アプリケーションによって呼び出される厳密な名前のアセンブリはすべて、GAC
内にインストールされている必要があります。詳細については、モジュール
7「セキュリティ保護されたアセンブリを構築する」の「厳密な名前」を参照してください。
注: 通常は、既定のコンピュータ ポリシーと ASP.NET ポリシーは、GAC
内にインストールされているアセンブリに完全な信頼を与えます。前の手順で作成したコード グループに割り当てた [このポリシーレベルはこのコード
グループに関連するアクセス許可セットからのアクセス許可のみを持つ] と [このレベル以下のポリシーレベルは評価しない]
の設定は、アセンブリに、先に作成した RestrictedFileIO
アクセス許可によって定義されているアクセス許可のみを与えて、完全な信頼は与えないようにします。
| • | コード アクセス セキュリティ制約を持つファイル I/O をテストするには | 1. | Gacutil.exe ユーティリティを使用して、GAC 内に FileIO
アセンブリをインストールします。 ビルドの後の手順として Gacutil.exe を呼び出すことにより、アセンブリが
Microsoft Visual Studio® .NET 内で正常にビルドされた場合には、確実に GAC
内に置かれるようにすることができます。 | 1. | Visual Studio .NET で、FileIO プロジェクトのプロパティ ダイアログ
ボックスを表示します。 | | 2. | [共通プロパティ] の [ビルド イベント] を選択します。 | | 3. | [ビルド後のイベント コマンド ライン] フィールドに「C:\Program
Files\Microsoft Visual Studio .NET
2003\SDK\v1.1\Bin\gacutil" -i
$(TargetPath)」と入力します。 | | 4. | [OK] をクリックして、プロジェクトのプロパティ ダイアログ
ボックスを閉じます。 | | | 2. | ソリューションを再構築します。 | | 3. | コマンド ラインから Iisreset.exe を実行して、強制的に ASP.NET
プロセスを再起動します。 これにより、FileIO
アセンブリに与えられるアクセス許可を強制的に再計算させることができます。ASP.NET アプリケーション ドメインが最後に
Web アプリケーションを実行した後ずっとアクティブなままだった場合は、アセンブリがまだ ASP.NET
のキャッシュ内に残っている可能性があります。 | | 4. | Web アプリケーションを実行して、[ファイルの読み取り] をクリックします。 テキスト
ファイルの内容が正常に表示されます。作成したポリシーにより、FileIO アセンブリは C:\Temp
ディレクトリ以下の場所からファイルを読み取ることができます。 | | 5. | テキスト ボックスに "C:\somefile.txt" と入力し、[ファイルの読み取り]
をクリックします。 前の手順で構成したコード アクセス セキュリティ ポリシーは C:\Temp
ディレクトリ外でのファイル I/O を許可しないため、"SecurityException" が発生します。 例外の詳細では、次に示すように、FileIOPermission への要求が失敗したことが示されます。 System.Security.SecurityException:Request for the permission of type
System.Security.Permissions.FileIOPermission, mscorlib, Version=1.0.5000.0,
Culture=neutral, PublicKeyToken=b77a5c561934e089 failed.
| |