解説インサイド .NET Framework第9回 コード・アクセス・セキュリティ(その1) インフォテリア株式会社 |
エビデンス
それでは、コード・アクセス・セキュリティの詳細の解説に入ることにしよう。CLRは、アセンブリの厳密名の検証(前回参照)などの手順を終えると、次にそのアセンブリに関するエビデンス(証拠)の収集を開始する。7種類のエビデンスがCLRに組み込まれているので、CLRはデフォルトでは7種類の情報を集めることになる。これらのエビデンスは、System.Security.Policy名前空間にあるクラスとして定義されている。
7種類のうち4つは、アセンブリの出所に関する情報だ。
Url
文字どおりアセンブリがダウンロードされてきたURLだ。通常は構成ファイルのcodeBase属性(解説済み)に書かれているものがそのままURLのエビデンスとなる。
Site
アセンブリがダウンロードされたサイトを表す。例えば、http://www.atmarkit.co.jp/fdotnet/assembly.dllというURLから来たアセンブリのSiteエビデンスは、“www.atmarkit.co.jp”となる。
Zone
アセンブリがダウンロードされたURLが、インターネット・エクスプローラのセキュリティ構成(下の画面)においてどのゾーンに所属しているかを表す。
インターネット・エクスプローラのセキュリティ構成 |
通常、http://localhostの場合はイントラネット・ゾーンとなるし、http://www.atmarkit.co.jpはインターネット・ゾーンとなるはずだ。それ以外に、MyComputerゾーン、Trustedゾーン(信頼済みサイト)、Untrustedゾーン(制限つきサイト)、NoZone(ゾーンがない)がある。
ApplicationDirectory
アセンブリをロードしたアプリケーションのベース・ディレクトリを表す。これはアセンブリが提供するわけではなく、CLRをロードしたホスト・アプリケーションが提供するエビデンスで、実際にはほとんどの場合で提供されない。
また、アセンブリの作成者(開発者、配布者)の情報を表すエビデンスが1つある。
Publisher
アセンブリに適用されているX.509証明書を表す。アセンブリに証明書を添付する方法は後述する。
さらに、アセンブリそのものを表すエビデンスが2つある。
StrongName
厳密名(の公開キー情報)を表す。
Hash
アセンブリのプライマリ・モジュールのハッシュ値。デフォルトではSHA-1とMD5の2つのアルゴリズムがサポートされている。
CLRはアセンブリをロードするとこれらのエビデンスを収集して、コードの身元を特定する。
ポリシー
CLRはエビデンスを収集すると、それを入力としてポリシーを呼び出す。ポリシーは、入力としてエビデンスを受け取り、出力としてパーミッションを返す。例えばwww.atmarkit.co.jpというSiteエビデンスを持っているアセンブリに対して、C:\Tempというフォルダにアクセスする許可(パーミッション)を与えるという設定をポリシーに含むことができる。このポリシーを作成するのは、もちろん管理者だ。ただし、管理者といってもいろいろなレベルがある。CASのポリシーは4つのレベルの階層構造になっている。
エンタープライズ・ポリシー
Active Directoryドメインに参加しているマシンにのみ作用するポリシー。このポリシーを管理するのはドメインの管理者になるだろう。
マシン・ポリシー
それぞれのマシンに作用するポリシー。このポリシーを管理するのは、それぞれのマシンの管理者になる。
ユーザー・ポリシー
1人1人のユーザーごとのポリシー。ユーザーに作用する。このポリシーはユーザー・プロファイルに格納される。
AppDomainポリシー
AppDomainに適用されるポリシー。AppDomainについては本連載で後々扱う予定。
エンタープライズ・ポリシーとマシン・ポリシー、ユーザー・ポリシーは、それぞれ次のファイルとして格納されている。
エンタープライズ・ポリシー
C:\WINDOWS
\Microsoft.NET
\Framework
\version
\CONFIG
\enterprisesec.config
マシン・ポリシー
C:\WINDOWS
\Microsoft.NET
\Framework
\version
\CONFIG
\security.config
ユーザー・ポリシー
C:\Documents and Settings
\%USERNAME%
\Application Data
\Microsoft
\CLR Security Config
\version
\security.config
これらの中身はXML 1.0のテキストになっている。AppDomainポリシーはAppDomainにコードで設定するため、デフォルトで保存されているファイルはない。これらのポリシー・ファイルは、メモ帳などのエディタでももちろん編集できるが、通常は本連載の第7回で解説した「.NET Framework Configuration管理ツール」で編集したほうが分かりやすいだろう。このツールを使った構成方法は後述する。
CLRはエビデンスを収集すると、そのエビデンスに適用されるポリシーを割り出す。ポリシーがあればロードされ、中に書いてあるパーミッションがアセンブリに割り当てられる。ポリシーは4つのレベルにそれぞれ別々に作られ、実際に割り当てられるのはその論理積となる。つまり、エンタープライズ・レベルで厳しいポリシーが設定されていれば、ユーザー・レベルでいかにゆるいポリシーを設定しても、最終的なポリシーは厳しいものになるということだ。
パーミッション
ポリシーを処理した結果として、CLRはパーミッションを受け取る。パーミッションは、System.Security.CodeAccessPermissionクラスから派生したクラスとして定義される。例えば、
- System.Security.Permissions.FileIOPermission
- System.Net.DnsPermission
などが定義されている。前者はファイル入出力に関するアクセス許可を、後者はSystem.Net.Dnsクラスを使って名前解決を行うためのアクセス許可を表す。このように、実行するのに「特権」が必要な機能に対応するアクセス許可そのものがオブジェクトとして利用できるようになっている。パーミッションはコードで作成して利用することも可能だが、通常はポリシーの作成時にGUIで割り当てることが多いだろう。結果は上記のとおりXML 1.0のファイルとして出力される。パーミッションの使い方も後述する。
CLRはポリシーを処理してパーミッションを受け取ると、それを今ロード中のアセンブリに割り当てる。この結果、ロードされたアセンブリがどんな処理が実行できるのか、どんな処理は実行できないのかが決まる。例えば「実行」というアクセス許可が与えられなかった場合、その時点でアセンブリのロードは終了し、アセンブリのコードは一切実行されないことになる。
INDEX | ||
解説 インサイド .NET Framework | ||
第9回 コード・アクセス・セキュリティ(その1) | ||
1.コード・アクセス・セキュリティの動機と動作 | ||
2.エビデンス、ポリシー、パーミッション | ||
3.コード・グループとパーミッション・セット | ||
「解説:インサイド .NET Framework 」 |
- 第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用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|