AccessCheck のしくみ
スレッドがセキュリティ保護可能なオブジェクトにアクセスしようとすると、システムはアクセスを許可または拒否します。 オブジェクトに随意アクセス制御リスト (DACL) がない場合、システムはアクセスを許可します。それ以外の場合、システムは、スレッドに適用されるオブジェクトの DACL でAccess Controlエントリ (ACE) を検索します。 オブジェクトの DACL の各 ACE は、 トラスティに対して許可または拒否されるアクセス権を指定します。これは、ユーザー アカウント、グループ アカウント、 ログオン セッションのいずれかです。
DACL
システムは、各 ACE のトラスティを、スレッドの アクセス トークンで識別されたトラスティと比較します。 アクセス トークンには、ユーザーとユーザーが属するグループ アカウントを識別する セキュリティ識別子 (SID) が含まれています。 トークンには、現在のログオン セッションを識別するログオン SID も含まれています。 アクセスチェック中、システムは、有効になっていないグループ SID を無視します。 有効、無効、および拒否のみの SID の詳細については、「 アクセス トークンの SID 属性」を参照してください。
通常、システムはアクセスを要求しているスレッドの プライマリ アクセス トークン を使用します。 ただし、スレッドが別のユーザーを偽装している場合、システムはスレッドの 偽装トークンを使用します。
システムは、次のいずれかのイベントが発生するまで、各 ACE を順番に調べます。
- アクセス拒否 ACE は、スレッドのアクセス トークンに記載されているトラスティのいずれかに対して、要求された アクセス権 を明示的に拒否します。
- スレッドのアクセス トークンに一覧表示されているトラスティに対して 1 つ以上のアクセス許可 ACE が、要求されたすべてのアクセス権を明示的に付与します。
- すべての ACE がチェックされ、明示的に許可されていない要求されたアクセス権がまだ少なくとも 1 つあります。その場合、アクセスは暗黙的に拒否されます。
次の図は、オブジェクトの DACL が別のスレッドへのアクセスを拒否しながら、あるスレッドへのアクセスを許可する方法を示しています。
スレッド A の場合、システムは ACE 1 を読み取り、アクセス拒否 ACE がスレッドのアクセス トークンのユーザーに適用されるため、アクセスを直ちに拒否します。 この場合、システムは ACE 2 と 3 をチェックしません。 スレッド B の場合、ACE 1 は適用されないため、システムは書き込みアクセスを許可する ACE 2 に進み、読み取りと実行アクセスを許可する ACE 3 に進みます。
要求されたアクセスが明示的に許可または拒否されると、システムは ACE のチェックを停止するため、DACL 内の ACE の順序が重要です。 この例で ACE の順序が異なる場合は、システムがスレッド A へのアクセスを許可している可能性があることに注意してください。システム オブジェクトの場合、オペレーティング システムは DACL の ACE の優先順序を定義します。