解説

インサイド .NET Framework [改訂版]

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

吉松 史彰
2003/08/20
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 [改訂版]
  第7回 コード・アクセス・セキュリティ(その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 記事ランキング

本日 月間