액세스 제어 목록
ACL(액세스 제어 목록)은 특정 종류의 지정된(보호된) 개체와 연결된 보안 동작을 제어하기 위해 운영 체제에서 만든 ACE(액세스 제어 항목) 목록입니다. Windows에는 두 가지 유형의 ACL이 있습니다.
임의 ACL은 보호된 개체에 대한 액세스 권한을 설명하는 0개 이상의 ACE 목록입니다. 부여된 액세스 권한은 소유자 또는 적절한 권한을 가진 모든 사용자의 재량에 따라 결정되므로 임의입니다.
시스템 ACL은 보호된 개체에 대한 감사 및 경보 정책을 설명하는 0개 이상의 ACE 목록입니다.
"임의"라는 용어는 필수 제어와 임의 제어 간의 차별화를 의미합니다. 필수 컨트롤을 사용하는 환경에서는 개체 소유자가 개체에 대한 액세스 권한을 부여하지 못할 수 있습니다. Windows와 같은 임의 환경에서는 개체 소유자가 이러한 액세스 권한을 부여할 수 있습니다. 필수 컨트롤은 일반적으로 구획화된 보안을 사용하는 것과 같은 엄격한 보안 환경과 연결되며, 시스템에서는 동일한 시스템의 사용자 간에 중요한 정보가 공개되지 않도록 해야 합니다.
ACL을 생성하는 드라이버는 몇 가지 주요 단계를 따릅니다.
ACL에 대한 스토리지를 할당합니다.
ACL을 초기화합니다.
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에 잘 설명되어 있지만 보안 참조 모니터가 액세스 권한을 부여할지 아니면 거부할지를 결정하는 데 사용하는 특정 메커니즘과 관련이 있습니다.