Code Access Securityその2
CASを理解するには、まず、セキュリティポリシーの仕組みを理解するのが近道です。ポリシーの設定は.NET Framework 2.0 Configurationツールから行います。(コントロールパネル>パフォーマンスとメンテナンス>管理ツール>Microsoft .NET Framework 2.0 Configurationを実行)
こんな画面が表示されたと思います。この画面を見ながら話を進めます。
セキュリティポリシーは次の4つのレベルで指定します。
- User
- Machine
- Enerprise
- AppDomain
このうち、ツールで設定するのはAppDomain以外の3つです。取りあえず、ここではAppDomainのことは忘れましょう。デフォルトの設定ではUser、EnterpriseにFullTrust(何でも出来る)が設定され、Machineの権限は先日の日記の通り、実行場所によって変わります。ローカルディスクからの場合は、FullTrustでしたね。では、この3つから最終的なポリシーはどのように決まるのでしょうか? 実は、この3つの論理積がポリシーとなります。例えば、
- User:権限A,Bを持つ
- Machine:権限:B,Cを持つ
- Enterprise:権限:A,B,Cを持つ
この場合、3者で共通である権限Bのみ持つことになります。
では、ちょっと実験してみましょう。
using System;
using System.IO;
using System.Collections;
using System.Reflection;
using System.Runtime.Remoting;
using System.Security;
using System.Security.Cryptography.X509Certificates;
using System.Security.Permissions;
using System.Security.Policy;
static class Program {
public static void Main (string args) {
string path = AppDomain.CurrentDomain.BaseDirectory;
Url u = new Url (path);
Zone z = Zone.CreateFromUrl (path);
object e = {u, z};
Evidence evidence = new Evidence (e, null);
PermissionSet ps = SecurityManager.ResolvePolicy (evidence);
if (ps.IsUnrestricted ()) {
Console.WriteLine ("FullTrust");
}
else {
foreach (object o in ps) {
Console.WriteLine (o.GetType ());
}
}
}
}
これをコンパイルして実行してみましょう。
$ app.exe FullTrust
すると、このようにFullTrustになりました。User、Machine、EnterpriseはFullTrustであることが分かりますね。ではUserの権限をEverythingに下げてみましょう。
プロパティを選んで、
Permission SetタブでEverythingを選択します。
では、この状態でapp.exeを実行してみてください。今度は違う結果になったはずです。
$ app.exe System.Security.Permissions.EnvironmentPermission System.Security.Permissions.FileDialogPermission System.Security.Permissions.FileIOPermission System.Security.Permissions.IsolatedStorageFilePermission System.Security.Permissions.ReflectionPermission System.Security.Permissions.RegistryPermission System.Security.Permissions.SecurityPermission System.Security.Permissions.UIPermission System.Security.Permissions.UrlIdentityPermission System.Security.Permissions.ZoneIdentityPermission System.Security.Permissions.KeyContainerPermission System.Net.DnsPermission System.Drawing.Printing.PrintingPermission System.Net.SocketPermission System.Net.WebPermission System.Diagnostics.EventLogPermission System.Security.Permissions.StorePermission System.Diagnostics.PerformanceCounterPermission System.Data.OleDb.OleDbPermission System.Data.SqlClient.SqlClientPermission System.Security.Permissions.DataProtectionPermission
Everythingの内容が表示されました。MachineやEnterpriseはFullTrustのままですがUsersがEverythingなので、その論理積を取ってEverythingになったわけです。ちなみに、これ以上権限を下げるとapp.exe自体が動かなくなるので注意です。権限が無くて例外が発生するのを一度くらい見ておくのも良いかも。(^^;
セキュリティポリシーの入り口まで来ました。次はコードグループについてですが、また次回・・・に続くかな?