SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

japan.internet.com翻訳記事

コードアクセスセキュリティの仕組みと設定方法

.NET Frameworkにおけるセキュリティ機構の解説

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アセンブリに付与されるアクセス許可をさらにきめ細かくコントロールすることができます。

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
japan.internet.com翻訳記事連載記事一覧

もっと読む

この記事の著者

japan.internet.com(ジャパンインターネットコム)

japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.comEarthWeb.com からの最新記事を日本語に翻訳して掲載するとともに、日本独自のネットビジネス関連記事やレポートを配信。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

David Myers(David Myers)

1987年、テキサス大学エルパソ校にてコンピュータサイエンスの学士号を取得。MCSD認定資格(.NET)を持つ。IT分野の経験は15年におよび、うち9年はMicrosoft中心のソリューションに関するソフトウェアコンサルタントとして活動。主な活動分野は.Net Framework、C#、XML、We...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/361 2006/08/22 15:44

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー