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自体が動かなくなるので注意です。権限が無くて例外が発生するのを一度くらい見ておくのも良いかも。(^^;

セキュリティポリシーの入り口まで来ました。次はコードグループについてですが、また次回・・・に続くかな?