2005年11月18日

Unrestricted=falseって何?

   このエントリーをはてなブックマークに追加 Clip to Evernote
11月15日に書いた C#(というか.NET)における宣言セキュリティの続き。

[FileIOPermissionAttribute(SecurityAction.Deny, Unrestricted=true)]
private void Test() {
// ここでファイルを読み込む
}

とすると、Denyを指定しているので、ファイルアクセスを許可していないことになる。
当然、Test()を呼び出すと、例外が発生する。
では、以下のように Unrestricted=false とするとどうなるのだろう。

[FileIOPermissionAttribute(SecurityAction.Deny, Unrestricted=false)]

これだと、例外は発生しない。この場合は、具体的にどの操作を拒否するのかを指定しなくてはならない。簡単に言えば、読み込みを拒否するのか、書き込みを拒否するのか、ということを指定するわけだ。
たとえば、こんな感じ。

[FileIOPermissionAttribute(SecurityAction.Deny, 
Unrestricted=false, Read=@"D:\Temp")]


この場合は、D:\Tempフォルダ配下へのRead操作が拒否されることになる。

[FileIOPermissionAttribute(SecurityAction.Deny, 
Unrestricted=false, Write=@"D:\Temp")]

とすれば、読み込みはOKだが、書き込み操作が拒否されるわけだ。
こんな風に、こまかなアクセス制御が可能になる。

うーん、でもここまで神経を使わなくてはいけないんだろうか。
「SecurityAction Unrestricted」でgoogleで検索してもヒットする日本語のページはほんのわずかであり、きっと、ほとんど使われていないんだろな。

それと、MSDNでのUnrestricted の説明は、以下のようになっている。

属性によって保護されているリソースに対して完全な (無制限の) アクセス許可が宣言されているかどうかを示す値を取得または設定します。

僕は、この日本語をまったく理解できない。
これは、僕の日本語読解力の無さのせいなのか。それとも....
  

Posted by gushwell at 21:32Comments(0)TrackBack(1)

2005年11月15日

SecurityAction

   このエントリーをはてなブックマークに追加 Clip to Evernote
System.Security.Permissions.SecurityAction について

.NETのコードアクセスセキュリティでは、属性による許可制御として以下のような記述ができる。

[FileIOPermissionAttribute(SecurityAction.Assert, Unrestricted=true)]
private void Test() {
...
}

でも、この Assert とか、Demand とかが、具体的に何を意味するのかがマニュアルを読んでもピンとこない。
で、僕なりに分かりやすい言葉でまとめなおしてみた。

SecurityAction.Demand (アクセス許可を要求)
 このメソッドは、XXXXXXX処理を行いますので、許可してください

SecurityAction.Assert (アクセス許可を要求)
 このメソッドは、XXXXXXX処理を行いますので、許可してください。
 ただし、呼び出し元のチェックは行わないで良いですよ

SecurityAction.PermitOnly (アクセス許可を要求)
 このメソッドは、XXXXXXX処理のみを許可してください。
 それ以外の許可は与えないでくださいね。

SecurityAction.Deny (アクセス許可を拒否)
 このXXXXXXX処理は行ないません。
 もし、XXXXXXX処理が行われたら例外を発生させてください

というお願いをシステムにするわけだ。
システム側は、そのコードに付与されているアクセス許可を見て、動作不可ならば、例外を発生させる仕組みになっている。

ちなみに、XXXXXXX処理 には、FIleIO, EventLog,Print,SqlClient,UI...といったものが存在する。


じゃあ、Unrestricted=true ってなんだろう。
false にするとどうなるのかな。
  
Posted by gushwell at 22:07Comments(0)TrackBack(0)

2005年08月09日

アセンブリロード時に許可チェック

   このエントリーをはてなブックマークに追加 Clip to Evernote
以下のような属性を付加することで、アセンブリのロード時に許可チェックが行える。

[assembly: UIPermission(SecurityAction.RequestMinimum, Unrestricted=true)]

SecurityActionは、以下の3種類の値を持つ。

RequestMinimum
 アセンブリに最低限必要なアクセス許可
RequestOptional
 アセンブリに指定されている以外の許可を与えない。
 ただし、同時に他の許可属性もある場合には、その許可も与える。
RequestRefuse
 アセンブリにアクセス許可が与えられていた場合は、無効にする。
 ポリシーでは、許可が与えられているが、その許可を取り消す。

つまり、上の例では、UIPermissionが与えられていないと、アセンブリロード時にエラーとなり、実行することができない。

では、もう一つ例を示す。

[assembly: SqlClientPermission(SecurityAction.RequestMinimum, Unrestricted=true)]
[assembly: PrintingPermission(SecurityAction.RequestRefuse, Unrestricted=true)]

この場合、FullTrustのアクセス許可がポリシーで与えられていると、SqlClientPermission を始め、PrintingPermission以外の全てのアクセスが許可されることになる。
つまり、許可されないのは、 PrintingPermissionのみだ。

こういった例から分かるように、属性を付けることで、実際の該当する処理を実行したときに、例外が発生するのではなく、アセンブリロード時にエラーにし、起動できなくしたり、あるいは、ポリシーで与えたよりも、厳しい許可アクセス制限を付けたいときに利用できる。
  
Posted by gushwell at 22:49Comments(0)TrackBack(0)

2005年08月08日

エビデンスの情報を取得する

   このエントリーをはてなブックマークに追加 Clip to Evernote
FileReader reader = new FileReader(@"d:\temp\sample.txt");
System.Security.Policy.Evidence evidence = reader.GetType().Assembly.Evidence;

System.Collections.IEnumerator e2 = evidence.GetHostEnumerator();
while(e2.MoveNext()) {
Type type = e2.Current.GetType();
listBox1.Items.Add(e2.Current.GetType());
if ( type == typeof(System.Security.Policy.Zone) ) {
Zone zone = e2.Current as Zone;
listBox1.Items.Add(zone.ToString());
} else if ( type == typeof(System.Security.Policy.Url) ) {
Url url = e2.Current as Url;
listBox1.Items.Add(url.ToString());
} else if ( type == typeof(System.Security.Policy.Hash) ) {
Hash hash = e2.Current as Hash;
listBox1.Items.Add(hash.ToString());
} else if ( type == typeof(System.Security.Policy.StrongName) ) {
StrongName sn = e2.Current as StrongName;
listBox1.Items.Add(sn.Name + " - " +
sn.Version + " - " +
sn.PublicKey);
}
}


Zone, Url, Hash については、ToString()を呼び出しているだけなので、こんな場合分けは不要です。まあ、あくまでもサンプルコードということで...  
Posted by gushwell at 22:16Comments(0)TrackBack(0)

2005年08月05日

コードグループ

   このエントリーをはてなブックマークに追加 Clip to Evernote
コードグループは、「エビデンス」と「アクセス許可セット」との対応が設定されたものです。
具体的には、アセンブリの出所がインターネットゾーンにならば(エビデンス)、「ファイルダイアログ、印刷、UI...」(許可セット)が許可される。
といった対応関係です。
結局、コードアクセスセキュリティのセキュリティポリシーは、このコードグループで構成されています。

デフォルトでは、7つのエビデンスのうち、ゾーンに関する以下のものだけが登録されています。
MyComputer_Zone
LocalIntranet_Zone
Intranet_Zone
Restricted_Zone
Trusted_Zone

うーん、言葉だけで説明するのは、なかなか難しいですね。

言葉だけではピンと来ないかもしれませんが、.NET Configuration ツールを起動してもらえれば、理解できるかと思います。
なお、コードグループでは、一つのコードグループに、複数のエビデンスを割り当てることはできません。これも、ツールを起動し、「コードグループ プロパティの編集」のダイアログを開いてもらうとすぐに分かります。

  
Posted by gushwell at 22:19Comments(0)TrackBack(0)

2005年08月04日

アクセス許可セット

   このエントリーをはてなブックマークに追加 Clip to Evernote
どういったエビデンス(アセンブリに関する識別情報)を持ったアセンブリに、どのような許可を与えるのかを指定する場合、管理しやすくするために、「アクセス許可セット」というものがある。これは、パーミッションを組み合わせたものに名前を付けたものだ。
デフォルトでは、以下のような許可セットが定義されている。
FullTrust
 無制限アクセスを許可
SkipVerification
 確認の省略を許可。
Execution
 実行を許可。
Nothing
 実行する権限を含めて、すべてのリソースを拒否。
LocalIntranet
 ローカル イントラネットのアプケーションに与えられた既定の権限。
Internet
 インターネット アプケーションに与えられた既定の権限。
Everything
 規定のすべての権限を許可

  
Posted by gushwell at 21:50Comments(0)TrackBack(0)

2005年08月01日

パーミッション

   このエントリーをはてなブックマークに追加 Clip to Evernote
パーミッションとは、ポリシーを処理した結果としてのアクセス許可のことを言う。

.NETでは、System.Security.CodeAccessPermissionクラスの派生クラスとして定義されている。


System.Security.Permissions.FileIOPermission
System.Net.DnsPermission
System.Security.Permissions.UIPermission
System.Data.SqlClient.SqlClientPermission

アセンブリがロードされる際に、エビデンスとポリシーにより、パーミッションが割り当てられ、そのアセンブリが、どんな処理ができるのか、どんな処理が実行できないかが決定される。
許可されていない処理を実行しようとすると、例外が発生する。
  
Posted by gushwell at 23:02Comments(0)TrackBack(0)

2005年07月29日

4つのポリシー

   このエントリーをはてなブックマークに追加 Clip to Evernote
コード・アクセス・セキュリティには、4つのポリシーがあり、階層構造になっている。これらのポリシーは、XMLファイルとして格納されていて、.NET Framework 構成管理ツールで編集できる。

1.エンタープライズ・ポリシー
  Active Directoryドメインに参加しているマシンに作用する。
2.マシンポリシー
  マシン毎に、設定するポリシー
3.ユーザポリシー
  ユーザ毎のポリシー
4.AppDomainポリシー
  AppDomainに適用されるポリシー
  デフォルトではXMLファイルは存在しない。
  通常の利用では、上の3つまでか。

適用されるポリシーは、上記ポリシーの論理積(and)となる。  
Posted by gushwell at 22:22Comments(0)TrackBack(0)