Device 개체에 보안 설명자 적용
대부분의 드라이버는 디바이스 개체에 대해 I/O 관리자가 적용한 액세스 제어를 사용하여 부적절한 액세스로부터 자신을 보호합니다. 대부분의 드라이버에 대한 가장 간단한 방법은 드라이버가 설치될 때 명시적 보안 설명자를 적용하는 것입니다. INF 파일에서 이러한 보안 설명자는 AddReg 섹션의 "보안" 항목에 설명되어 있습니다. 보안 설명자를 설명하는 데 사용되는 전체 언어에 대한 자세한 내용은 Microsoft Windows SDK 설명서의 보안 설명자 정의 언어를 참조하세요.
SDDL(보안 설명자 정의 언어)을 사용하는 보안 설명자의 기본 형식에는 다음과 같은 표준 보안 설명자가 포함됩니다.
소유자 SID입니다.
그룹 SID입니다.
DACL(임의 액세스 제어 목록)입니다.
SACL(시스템 액세스 제어 목록)입니다.
따라서 보안 설명자에 대한 INF 스크립트 내의 설명은 다음과 같습니다.
O:owner-sidG:group-sidD:dacl-flags(ace)(ace)S:sacl-flags(ace)(ace)
개별 액세스 제어 항목은 보안 식별자 또는 SID에서 지정한 대로 특정 그룹 또는 사용자에게 부여되거나 거부될 액세스를 설명합니다. 예를 들어 INF 파일에는 다음과 같은 줄이 포함될 수 있습니다.
"D:P(A;CI;GR;;;BU)(A;CI;GR;;;PU)(A;CI;GA;;;BA)(A;CI;GA;;;SY)(A;CI;GA;;;NS)(A;CI;GA;;;LS)(A;CI;CCDCLCSWRPSDRC;;;S-1-5-32-556)"
위의 예제는 NETTCPIP에서 제공되었습니다. Microsoft Windows XP SP1(서비스 팩 1) 시스템의 INF 파일입니다.
이 instance 지정된 소유자 또는 그룹이 없으므로 기본값은 미리 정의된 값 또는 기본값입니다. D는 이것이 DACL임을 나타냅니다. P는 이 ACL이 보호된 ACL이며 포함하는 개체의 보안 설명자로부터 어떠한 권한도 상속하지 않음을 나타냅니다. 보호된 ACL은 부모에 대한 보다 관대한 보안이 상속되지 않도록 합니다. 괄호 식은 ACE(단일 액세스 제어 항목)를 나타냅니다. SDDL을 사용하는 액세스 제어 항목은 여러 고유 세미콜론으로 구분된 구성 요소로 구성됩니다. 순서대로 다음과 같습니다.
ACE의 형식 표시기입니다. DACL에는 네 가지 고유한 형식이 있고 SACL에는 4가지 형식이 있습니다.
자식 개체 또는 ACL에 대한 감사 및 경보 정책에 대해 이 ACE의 상속을 설명하는 데 사용되는 플래그 필드입니다.
권한 필드는 ACE에 의해 부여되거나 거부된 권한을 나타냅니다. 이 필드는 이 ACE에 적용되는 제네릭, 표준 및 특정 권한을 나타내는 특정 숫자 값을 지정하거나 일반적인 액세스 권한에 대한 문자열 설명을 사용할 수 있습니다.
DACL이 개체별 ACE 구조체인 경우 개체 GUID입니다.
DACL이 개체별 ACE 구조체인 경우 상속된 개체 GUID
이 ACE가 적용되는 보안 엔터티를 나타내는 SID입니다.
따라서 샘플 보안 설명자를 해석하면 ACE를 이끄는 "A"는 이것이 "액세스 허용" 항목임을 나타냅니다. 대안은 자주 사용되지 않으며 선행 "D" 문자로 표시되는 "액세스 거부" 항목입니다. flags 필드는 이 ACE가 하위 개체에 의해 상속됨을 나타내는 CI(Container Inherit)를 지정합니다.
권한 필드 값은 일반 권한 및 표준 권한을 포함하는 특정 권한을 인코딩합니다. 예를 들어 "GR"은 "제네릭 읽기" 액세스를 나타내고 "GA"는 "제네릭 모두" 액세스를 나타내며 둘 다 제네릭 권한입니다. 이러한 일반 권한은 여러 가지 특별 권한을 따릅니다. 위의 샘플에서 "CC"는 파일 및 디렉터리 권한과 관련된 자식 액세스 만들기를 나타냅니다. 위의 샘플에는 자식 액세스 삭제를 위한 "DC", 목록 자식 액세스에 대한 "LC", 자체 권한 액세스를 위한 "SW", 읽기 속성 액세스의 경우 "RP", 표준 삭제 액세스의 경우 "SD", 읽기 제어 액세스에 대한 "RC"를 포함하여 "CC" 문자열 다음에 다른 표준 권한도 포함됩니다.
위의 샘플의 SID 항목 문자열에는 전원 사용자를 위한 "PU", 기본 제공 사용자에 대한 "BU", "기본 제공 관리자용 "BA", 로컬 서비스 계정의 경우 "LS", 로컬 시스템의 경우 "SY", 네트워크 서비스 계정의 경우 "NS"가 포함됩니다. 따라서 위의 예제에서는 사용자에게 개체에 대한 일반 읽기 권한이 부여됩니다. 반면, 기본 제공 관리자, 로컬 서비스 계정, 로컬 시스템 및 네트워크 서비스에는 일반 모든 액세스 권한(읽기, 쓰기 및 실행)이 제공됩니다. 가능한 모든 권한 및 표준 SID 문자열의 전체 집합은 Windows SDK에 설명되어 있습니다.
이러한 ACL은 지정된 드라이버에서 만든 모든 디바이스 개체에 적용됩니다. 드라이버는 명명된 디바이스 개체를 만들 때 새 함수 인 IoCreateDeviceSecure를 사용하여 특정 개체의 보안 설정을 제어할 수도 있습니다. IoCreateDeviceSecure 함수는 Windows XP 서비스 팩 1 및 Windows Server 2003 이상에서 사용할 수 있습니다. IoCreateDeviceSecure를 사용하여 디바이스 개체에 적용할 보안 설명자는 디바이스 개체에 적합한 전체 보안 설명자 정의 언어의 하위 집합을 사용하여 설명합니다.
디바이스 개체에 특정 보안 설명자를 적용하는 목적은 애플리케이션이 디바이스 자체에 액세스하려고 할 때마다 디바이스에 대해 적절한 보안 검사를 수행하는 것입니다. 이름 구조(예: 파일 시스템의 네임스페이스)가 포함된 디바이스 개체의 경우 이 디바이스 네임스페이스에 대한 액세스를 관리하는 세부 정보는 I/O 관리자가 아닌 드라이버에 속합니다.
이러한 경우 흥미로운 문제는 드라이버 디바이스 개체에 대한 액세스를 확인하는 I/O 관리자와 드라이버에 적합한 보안 정책을 구현하는 디바이스 드라이버 사이의 경계에서 보안을 처리하는 방법입니다. 일반적으로 열려 있는 개체가 디바이스 자체의 이름인 경우 I/O 관리자는 해당 보안 설명자를 사용하여 디바이스 개체에 대한 전체 액세스 검사 수행합니다. 그러나 열려 있는 개체가 드라이버 자체 내의 경로를 나타내는 경우 I/O 관리자는 트래버스 액세스 권한이 디바이스 개체에 부여되도록 검사. 일반적으로 이 트래버스 권한은 대부분의 스레드에 SeChangeNotifyPrivilege가 부여되었기 때문에 부여됩니다. 이는 디렉터리에 대한 트래버스 권한을 부여하는 데 해당합니다. 이름 구조를 지원하지 않는 디바이스는 일반적으로 I/O 관리자가 전체 보안 검사 수행되도록 요청합니다. 이 작업은 디바이스 특성 필드에서 FILE_DEVICE_SECURE_OPEN 비트를 설정하여 수행됩니다. 이러한 디바이스 개체의 혼합을 포함하는 드라이버는 이름 구조를 지원하지 않는 디바이스에 대해 이 특성을 설정해야 합니다. 예를 들어 파일 시스템은 명명된 디바이스 개체(명명 구조를 지원하지 않음)에서 이 옵션을 설정하지만 명명 구조를 지원하는 명명되지 않은 디바이스 개체(예: 볼륨)에서는 이 옵션을 설정하지 않습니다. 이 비트를 올바르게 설정하지 못하는 것은 드라이버의 일반적인 버그이며 디바이스에 대한 부적절한 액세스를 허용할 수 있습니다. 첨부 파일 인터페이스(예: IoAttachDeviceToDeviceStackSafe)를 사용하는 드라이버의 경우 드라이버가 연결 중인 디바이스에서 이 필드가 설정되면 FILE_DEVICE_SECURE_OPEN 비트가 설정됩니다. 따라서 필터 드라이버는 보안 검사의 이러한 특정 측면에 대해 걱정할 필요가 없습니다.