AppDomainセキュリティポリシーレベル
AppDomainセキュリティポリシーレベルは、既定では有効になりません。ここまでは、Enterprise、Machine、Userの各ポリシーレベルをMMCスナップインで設定する方法を見てきました。AppDomainポリシーレベルを使用するには、実行時にコードから設定します。これが実装されるのは、アセンブリをアプリケーションドメインに動的に読み込む場合に限られます(これをサンドボックス化と呼ぶこともあります)。AppDomainセキュリティポリシーを実効的に作用させるには、アセンブリをAppDomainに読み込む前に、AppDomainポリシーレベルをプログラムで定義しておく必要があります。次の例を見てみましょう。
using System; using System.Net; using System.Diagnostics; using System.Threading; using System.Security; using System.Security.Policy; using System.Security.Permissions; namespace ConfigPolicy { /// <summary> /// Summary description for Class1. /// </summary> class SetAppDomainPolicy { /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main(string[] args) { // Create a new AppDomain PolicyLevel. PolicyLevel domainPolicy = PolicyLevel.CreateAppDomainLevel(); // Create a 'Membership Condition' // to be assigned to a new code group AllMembershipCondition allCodeMC = new AllMembershipCondition(); // Create a new permission set with the same permissions // as the "LocalIntranet" permission set. PermissionSet CustomPS = new Per issiionSet( domainPolicy.GetNamedPermissionSet("LocalIntranet")); // Add the permission needed to read from the registry. CustomPS.AddPermission(new RegistryPermission( PermissionState.Unrestricted)); PolicyStatement polState = new PolicyStatement(CustomPS); // Create a new code group which will serve as the root code // group for the AppDomain policy level CodeGroup allCodeCG = new UnionCodeGroup(allCodeMC,polState); domainPolicy.RootCodeGroup = allCodeCG; // Create a new application domain. AppDomain domain = System.AppDomain.CreateDomain("CustomDomain"); domain.SetAppDomainPolicy(domainPolicy); // Load and execute the assembly. try { string FQ_UNC_Path = @"\\MyServer\MyShare\ConsoleReadRegistry.exe"; domain.ExecuteAssembly(FQ_UNC_Path); } catch(PolicyException e) { Console.WriteLine("PolicyException: {0}", e.Message); } catch(Exception e) { Console.WriteLine( "Unexpected Exception: {0}", e.Message); } AppDomain.Unload(domain); } } }
このシナリオでは、カスタムアクセス許可セットを、既定のLocalIntranetアクセス許可セットと同じアクセス許可で作成します。LocalIntranetアクセス許可セットにはアセンブリの実行に必要なアクセス許可が含まれていますが、このアセンブリはレジストリを読み込もうとするので、レジストリの読み込みを許すアクセス許可をアクセス許可セットに追加する必要があります。
CustomPS.AddPermission(new RegistryPermission(
PermissionState.Unrestricted));
「All Code」メンバシップ条件を作成します。
AllMembershipCondition allCodeMC = new AllMembershipCondition();
新しく作成されたカスタムアクセス許可セットオブジェクトとメンバシップ条件オブジェクトを用いて、カスタムコードグループを作成します。これがAppDomainポリシーレベルのルートコードグループとなります。
CodeGroup allCodeCG = new UnionCodeGroup(allCodeMC,polState);
domainPolicy.RootCodeGroup = allCodeCG;
AppDomainセキュリティポリシーをプログラムで設定するので、4つの各セキュリティレベルで付与されるアクセス許可の積集合は、CLRによって決定されます。このようにして、動的に読み込まれるアセンブリの実効的なアクセス許可が決まります。
おわりに
.NET Frameworkは、Enterprise、Machine、User、AppDomainの4つのセキュリティポリシーレベルをサポートしています。最初の3レベルの設定情報はXMLベースの設定ファイルに格納されます。これらの設定ファイルは、「caspol.exe」ツールか「mscorcfg.msc」MMCスナップインを用いて編集することができます。AppDomainポリシーレベルは、実行時にSystem.AppDomain.SetAppDomainPolicyメソッドを呼び出してプログラムから設定する必要があります。既定のセキュリティポリシー設定で、悪意のあるコードに対抗する妥当な水準のセキュリティが実現されます。「mscorcfg.msc」のようなセキュリティポリシー管理ツールを使えば、.NETアセンブリに付与されるアクセス許可をさらにきめ細かくコントロールすることができます。
