다음을 통해 공유


액세스 제어 목록

ACL(액세스 제어 목록)은 특정 종류의 지정된(보호된) 개체와 연결된 보안 동작을 제어하기 위해 운영 체제에서 만든 ACE(액세스 제어 항목) 목록입니다. Windows에는 두 가지 유형의 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에 필요한 크기를 알 수 없으므로 상당한 양의 메모리를 할당합니다.

이 시점에서 ACL은 ACE 항목이 없으므로 비어 있습니다. 빈 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의 시작 부분에 배치하고 ACL 끝에 허용되는 ACE 항목에 액세스하는 것이 중요합니다. 이 순서는 중요합니다. 그렇지 않으면 ACL을 평가할 때 액세스 거부 ACE 전에 액세스 허용 ACE를 찾으면 보안 참조 모니터에서 액세스 권한을 부여합니다. 이 동작은 Microsoft Windows SDK에 잘 설명되어 있지만 보안 참조 모니터가 액세스 권한을 부여할지 아니면 거부할지를 결정하는 데 사용하는 특정 메커니즘과 관련이 있습니다.