次の方法で共有


アクセス制御リスト

アクセス制御リスト (ACL) は、特定の (保護された) オブジェクトに関連付けられたセキュリティ動作を制御するためにオペレーティング システムによって作成されるアクセス制御エントリ (ACE) のリストです。 Windows には、次の 2 種類の ACL があります。

  • 随意 ACL は、保護されたオブジェクトのアクセス権を記述する 0 個以上の ACE のリストです。 随意と呼ばれるのは、所有者または適切な権限を持つ任意のユーザーの裁量でアクセス権が許可されるためです。

  • システム ACL は、保護されたオブジェクトの監査とアラームのポリシーを記述する 0 個以上の ACE のリストです。

"随意" という用語は、必須の制御と随意の制御の区別を指しています。 必須の制御を使用する環境では、オブジェクトの所有者がそのオブジェクトへのアクセス権を許可できないことがあります。 Windows などの随意の環境では、オブジェクトの所有者がそのようなアクセス権を付与できます。 通常、必須の制御は厳しいセキュリティ環境に関連付けられます。たとえば、コンパートメント化されたセキュリティを使用して、同じシステム上のユーザー間で機密情報が漏えいするのをシステムで防ぐ必要がある場合などです。

ACL を構築するドライバーでは、いくつかの重要な手順に従います。

  1. ACL にストレージを割り当てます。

  2. ACL を初期化します。

  3. ACL に 0 個 (以上) の ACE を追加します。

ACL の構築方法を示すコード例を次に示します。

    dacl = ExAllocatePool(PagedPool, PAGE_SIZE);
    if (!dacl) {
        return;
    }
    status = RtlCreateAcl(dacl, PAGE_SIZE, ACL_REVISION);
    if (!NT_SUCCESS(status)) {
        ExFreePool(dacl);
        return;
    }

前のコード フラグメントでは、空の ACL が作成されます。 このコード サンプルでは、ACL に必要なサイズがわからないため、大量のメモリが割り当てられます。

この時点では、ACE エントリがないため、ACL は空です。 空の ACL は、オブジェクトにアクセスしようとするすべてのユーザーに対してアクセスを拒否します。そのようなアクセスを許可するエントリがないためです。 次のコード フラグメントは、この ACL に ACE を追加しています。

    status = RtlAddAccessAllowedAce(dacl, ACL_REVISION,  FILE_ALL_ACCESS, SeExports->SeWorldSid);
    if (!NT_SUCCESS(status)) {
        ExFreePool(dacl);
        return;
    }

追加された ACE は、オブジェクトにアクセスするすべてのエンティティにアクセスを許可します。それが、ワールド アクセス SID (SeWorldSid) の目的です。 この SID は、通常、他の Windows システム ユーティリティでは "すべての" アクセスとして表されます。

ACL を構築するときは、アクセス拒否 ACE エントリを ACL の先頭に配置し、アクセス許可 ACE エントリを ACL の末尾に配置することが重要です。 この順序は重要です。 それ以外の場合、ACL の評価時にアクセス拒否 ACE の前にアクセス許可 ACE が見つかると、セキュリティ参照モニターはアクセスを許可します。 この動作は Microsoft Windows SDK で詳しく説明されていますが、セキュリティ参照モニターがアクセスを許可するか拒否するかを判断するために使う特定のメカニズムに関連しています。