アクセス許可のデザイン

アクセス許可は、保護されているリソースにアクセスしたり、保護されている操作を実行したりできることを示します。 独自のアクセス許可クラスを実装する場合は、デザインに関していくつか高度な決定を行う必要があります。 まず、そのカスタム アクセス許可で保護するリソースを確定する必要があります。

次に、アクセス許可の重複について問題がないかどうかを確認します。 同じリソースを複数のアクセス許可で保護することは避ける必要がありますが、場合によっては回避できないこともあります。 たとえば、アンマネージ コードへのアクセス許可を与えられたコードは、アンマネージ API を通じてほとんどすべての操作を実行できるため、アンマネージ コードへのアクセス許可には、その他のアクセス許可も含まれてしまいます。 しかし、アンマネージ コードへのアクセス許可を与えられていない場合は、他の特定リソースにアクセスするためのアクセス許可を与える必要があります。 このため、アンマネージ コードへのアクセス許可は、他のアクセス許可とは分離しておいた方が便利です。

アクセス許可の範囲の重複が管理しやすいものかどうかは、どのように判断すればいいでしょうか。 これには絶対的な答えはありませんが、1 つの判断基準として、あるアクセス許可が他のアクセス許可よりも詳細に制御されたアクセス権を表しているかどうかが挙げられます。他のアクセス許可よりも詳細に制御されたアクセス許可は、通常は、他のアクセス許可よりも簡単に付与できます。 この場合は、アクセス権をさまざまな状況で簡単に与えることができ、管理者の作業は簡略化されます。

アクセス許可によって保護するリソースを決定し、アクセス許可の重複に関する問題を解決したら、次に、アクセス権をどのレベルまで詳細に制御する必要があるかを決定する必要があります。 この問題に対する答えによって、アクセス許可の状態を表す変数のデザイン方法が影響を受け、保護されているリソースへのアクセス権を管理者が設定できるかどうかが決定されます。 また、パフォーマンスや使いやすさなどの要因にも影響を与えます。

これらのデザイン上の考慮事項のいくつかを示すために、いくつかのデザインについて検討してみます。これらのデザインは、.NET Framework が提供する FileIOPermission クラスのデザインとして適用できます。 どのデザインを選択するかによって、アクセス許可の状態を表す変数も異なります。

  • 単一ビットは、その値に応じて、"すべてのファイルを使用する" または "ファイルを使用しない" を意味します。

  • 2 ビットは、その値に応じて、"すべてのファイルを読み取る" および "すべてのファイルに書き込む"、またはその否定を意味します。

  • 26 ビットは、"指定したドライブ上のすべてのファイルを使用する" を意味します。

  • 文字列の配列は、アクセスが与えられているすべてのファイルのリストを示します。

明らかに、ここには考慮する必要があるトレードオフがいくつかあります。 たとえば、単一ビットのアクセス許可は、非常にシンプルで処理速度も速く、わかりやすいですが、"すべて" または "何もなし" のいずれかの選択肢しかないため、管理者にとっては望ましくない場合があります。 単一ビット以外を選択した場合は、アクセス許可の状態をより複雑に指定できますが、パフォーマンスがある程度低下する可能性があります。 これらのトレードオフを検討し、同じリソースを保護するために複数のアクセス許可を作成してはいけないことを考慮する必要があります。 一般に、アクセス許可クラスは、パフォーマンスに大幅な影響を与えることなく、アクセス許可の状態を必要に応じた複雑度で指定できるようにデザインする必要があります。

他のデザインも考えられますが、ほとんどのアクセス許可は、次の標準的なパターンか、それらの組み合わせに準じたデザインになります。

  • Boolean 型のアクセス許可。 これは最も単純な種類のアクセス許可オブジェクトで、1 つ以上のビットを保持し、各ビットが "X を行うアクセス許可" に対応します。 つまり、アクセス許可を与えるか、与えないかのいずれかになります。 この種類のアクセス許可の例として、SecurityPermission クラスがあります。このクラスの状態には、アンマネージ コードを呼び出すためのアクセス許可など、さまざまな操作を実行する権限を表す Boolean 型変数が格納されており、各変数値がアクセス許可を与えるか、与えないかを示します。

  • 複数レベルのアクセス許可。 これは、さらに詳細に制御した形のアクセス許可であり、各種のアクセス権を 0 (アクセス禁止) から、いくつかのレベルを経て、より大きな任意の数 (無制限のアクセス権) までの数値で表す変数を保持します。 たとえば、UIPermission クラスを使用すると、ウィンドウを使用するためのアクセス許可を、UI アクセス許可をまったく与えないレベルから UI アクセス許可を無制限に与えるレベルまで、間にいくつかのレベルを挟んで各種のレベルで表すことができます。

  • オブジェクト リストによるアクセス許可。 この種類のアクセス許可では、許可する操作と許可しない操作について、詳細に指定できます。 FileIOPermission クラスは、この種類のアクセス許可の例として最適であり、このクラスの状態は、特定の種類のアクセスが許可されているファイルのリストによって表されます。 リストを持つアクセス許可は、多数の名前付きオブジェクトを格納しているリソースを保護する場合に最も役立ちます。

一般に、セキュリティ システムでアクセス許可クラスが必要になると、そのアクセス許可が依存するすべてのアセンブリを読み込む必要が生じるため、カスタム アクセス許可クラスでは外部への依存関係をできるだけ少なくしておくことが賢明です。 可能な場合には、カスタム アクセス許可クラスおよびそれに関連付けられた属性クラスは独立したアセンブリに格納し、他のアセンブリを不要に読み込まなくても済むようにしておきます。

参照

概念

独自のコード アクセス許可の作成

コード アクセス セキュリティ