解説
インサイド .NET Framework
第10回 コード・アクセス・セキュリティ(その2)
インフォテリア株式会社
吉松 史彰
2002/10/18
|
|
厳密名の設定によるエビデンスの変化
次に、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からロードされたときには設定されないことも分かっただろう。
Insider.NET 記事ランキング
本日
月間