解説

インサイド .NET Framework

第10回 コード・アクセス・セキュリティ(その2)

インフォテリア株式会社
吉松 史彰
2002/10/18

Page1 Page2 Page3 Page4

厳密名の設定によるエビデンスの変化

 次に、FileReaderアセンブリに厳密名を設定してみる。これによって、収集されるエビデンスに変化が現れるはずだ。ソース・コードに次の属性を設定して、再度コンパイルする。

[assembly: System.Reflection.AssemblyKeyName("CspContainer")]
[assembly: System.Reflection.AssemblyVersion("1.0.0.0")]
[assembly: System.Reflection.AssemblyCulture("")]
前回のFileReader.cs追加する属性
エビデンスの変化を見るために厳密名を設定する。

 アセンブリに厳密名が付けられたので、MainClass.exeの方も新しいアセンブリを参照するように再コンパイルする。詳細は省略するが、これによってホスト・エビデンスが4つになる。System.Security.Policy.StrongNameという新しいエビデンスが追加されるのだ。StrongNameクラスには、Name、Version、PublicKeyというプロパティがある。これを表示するように、先ほどのwhileループに次のコードを追加すれば、

case "System.Security.Policy.StrongName":
  System.Security.Policy.StrongName sn
    = (System.Security.Policy.StrongName)e2.Current;
  Console.WriteLine(
    "StrongName:name={0}, version={1}, publicKey={2}",
    sn.Name, sn.Version, sn.PublicKey);
  break;
MainClass.csに追加するStrongNameエビデンスに対応したcase文
これによりStrongNameエビデンスに含まれている値が表示される。

 次のような結果が返される。

StrongName:name=FileReader, version=1.0.0.0, publicKey=0024…(略)
追加したcase文により表示されるStrongNameエビデンスの値

アセンブリのロード方法の変更によるエビデンスの変化

 ここで前回と同じように、C:\TEMPフォルダを共有し、UNC名を使ってアクセス……としたいところだが、実際にやってみると、結果は次のようになる。

C:\TEMP>net share SHARED=C:\Temp
SHARED が共有されました。

C:\TEMP>\\crystalriver\shared\MainClass.exe C:\Boot.ini

ハンドルされていない例外 : System.Security.SecurityException: セキュリティ エラーです。
   at MainClass.MainClass.Main(String[] args)
修正したサンプル・プログラムMainClass.exeをUNC名により実行した結果

 Evidenceオブジェクトの情報はセキュリティに直結しているので、FullTrustのパーミッション・セットを持っていないと、Evidenceオブジェクトを操作するコードは実行できないのだ。UNC名でMainClass.exeを実行してしまうと、前回解説したとおり限定されたパーミッション・セットしか与えられない。そこで、構成ファイルを利用してFileReaderアセンブリだけを共有フォルダからロードするようにする。MainClass.exeはC:\TEMPフォルダから実行すれば、FullTrustパーミッション・セットがもらえる。具体的には、次のような構成ファイルを用意して、MainClass.exe.configという名前でC:\TEMPフォルダに保存すればよい(publicKeyTokenの値やマシンの名前は環境によって異なるので注意)。

<?xml version="1.0"?>
<configuration>
  <runtime>
    <asm:assemblyBinding 
        xmlns:asm="urn:schemas-microsoft-com:asm.v1">
      <asm:dependentAssembly>
        <asm:assemblyIdentity name="FileReader"
          culture="neutral" publicKeyToken="3a24533f049c49c0" />
        <asm:codeBase version="1.0.0.0"
          href="file://crystalriver/shared/filereader.dll"/>
      </asm:dependentAssembly>
    </asm:assemblyBinding>
  </runtime>
</configuration>
FileReaderアセンブリだけを共有フォルダからロードするようにするための構成ファイルの例
MainClass.exeのあるC:\TEMPフォルダに、MainClass.exe.configというファイル名で作成する(publicKeyTokenの値やマシンの名前(ここではcrystalriver)は環境によって異なる)。

 あらためてMainClass.exeをC:\TEMPフォルダから実行する。すると、MainClass.exeはMyComputerゾーンから実行されるが、FileReader.dllは構成ファイルの指示に従って、共有フォルダからロードされ、結果は次のようになる。

C:\TEMP>MainClass.exe C:\Boot.ini
Zone:Intranet
Url:file://CRYSTALRIVER/SHARED/filereader.dll
StrongName:name=FileReader, version=1.0.0.0, publicKey=0024…(略)
Hash:C0 23 A1 AA 2C 61 3B BC 83 AB 26 A9 FE EC 6D CB 82 5B 8D 26
0:4
構成ファイルを作成してMainClass.exeを実行した結果の例
FileReaderアセンブリはIntranetゾーンの「file://〜」で示されるURLからロードされたことが分かる。

 FileReaderアセンブリはIntranetゾーンのfile://CRYSTALRIVER/SHARED/filereader.dllというURLからダウンロードされたことが分かる。さらに、構成ファイルの次の行を変更してダウンロード元をhttpで始まるWebサーバに指定する。

<!--<asm:codeBase version="1.0.0.0"
  href="file://crystalriver/shared/filereader.dll"/>-->

<asm:codeBase version="1.0.0.0" href="http://localhost/filereader.dll"/>
構成ファイル(MainClass.exe.config)でアセンブリのダウンロード元をWebサーバに修正

 そしてFileReader.dllをWebサーバのフォルダ(例えばC:\Inetpub\wwwroot)にコピーし、MainClass.exeを実行すると、結果は次のように変わる。

C:\TEMP>MainClass.exe C:\Boot.ini
Zone:Intranet
Url:http://localhost/filereader.dll
StrongName:name=FileReader, version=1.0.0.0, publicKey=0024…(略)
Hash:C0 23 A1 AA 2C 61 3B BC 83 AB 26 A9 FE EC 6D CB 82 5B 8D 26
0:5
構成ファイルを修正してMainClass.exeを実行した結果の例
URLが「file://〜」から「http://〜」になり、ホスト・エビデンスの数が5つになっている。

 URLが変わるのは当然として、よく見るとホスト・エビデンスが1つ増えて5になっている。冒頭のコードで増えたエビデンスを確かめてみると、増えたのはSystem.Security.Policy.Siteというエビデンスであることが分かる。そこで、次のようなコードを追加してみる。

case "System.Security.Policy.Site":
  System.Security.Policy.Site site
    = (System.Security.Policy.Site)e2.Current;
  Console.WriteLine("Site:{0}", site.Name);
  break;
MainClass.csに追加するSiteエビデンスに対応したcase文
これによりSiteエビデンスに含まれている値が表示される。

 MainClass.exeを実行すると、結果は次のようになる。

C:\TEMP>MainClass.exe C:\Boot.ini
Zone:Intranet
Url:http://localhost/filereader.dll
Site:localhost
StrongName:name=FileReader, version=1.0.0.0, publicKey=0024…(略)
Hash:C0 23 A1 AA 2C 61 3B BC 83 AB 26 A9 FE EC 6D CB 82 5B 8D 26
0:5
追加したcase文により表示されるSiteエビデンスの値

 Site:localhostの情報が追加されたのが分かるだろう。

 このように、アセンブリがロードされる方法を変更することで、エビデンスの種類と中身の両方に変化が現れるのだ。また、Siteエビデンスは、アセンブリがfile://スキームによるURLからロードされたときには設定されないことも分かっただろう。


 INDEX
  解説 インサイド .NET Framework
  第10回 コード・アクセス・セキュリティ(その2)
    1.収集されたエビデンスの取得
  2.厳密名やロード方法により変化するエビデンス
    3.X.509証明書によるエビデンスの提供
    4.コラム:テスト用の証明書の利用方法
 
インデックス・ページヘ  「解説:インサイド .NET Framework 」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間