프로세스 보안 및 액세스 권한

Microsoft Windows 보안 모델을 사용하면 프로세스 개체에 대한 액세스를 제어할 수 있습니다. 보안에 대한 자세한 내용은 Access-Control 모델을 참조하세요.

사용자가 로그인하면 시스템은 인증 프로세스 중에 사용자를 고유하게 식별하고 액세스 토큰에 저장하는 데이터 집합을 수집합니다. 이 액세스 토큰은 사용자와 연결된 모든 프로세스의 보안 컨텍스트를 설명합니다. 프로세스의 보안 컨텍스트는 프로세스를 만든 사용자 계정 또는 프로세스에 지정된 자격 증명 집합입니다.

토큰을 사용하여 CreateProcessWithTokenW 함수를 사용하여 프로세스의 현재 보안 컨텍스트를 지정할 수 있습니다. CreateProcess, CreateProcessAsUser 또는 CreateProcessWithLogonW 함수를 호출할 때 프로세스에 대한 보안 설명자를 지정할 수 있습니다. NULL을 지정하는 경우 프로세스는 기본 보안 설명자를 가져옵니다. 프로세스에 대한 기본 보안 설명자의 ACL은 작성자의 기본 또는 가장 토큰에서 가져옵니다.

프로세스의 보안 설명자를 검색하려면 GetSecurityInfo 함수를 호출합니다. 프로세스의 보안 설명자를 변경하려면 SetSecurityInfo 함수를 호출합니다.

프로세스 개체에 대한 유효한 액세스 권한에는 표준 액세스 권한 및 일부 프로세스별 액세스 권한이 포함됩니다. 다음 표에는 모든 개체에서 사용하는 표준 액세스 권한이 나열되어 있습니다.

의미
DELETE (0x00010000L) 개체를 삭제하는 데 필요합니다.
READ_CONTROL (0x00020000L) SACL의 정보를 포함하지 않고 개체의 보안 설명자에서 정보를 읽는 데 필요합니다. SACL을 읽거나 쓰려면 ACCESS_SYSTEM_SECURITY 액세스 권한을 요청해야 합니다. 자세한 내용은 SACL 액세스 권한을 참조하세요.
SYNCHRONIZE (0x00100000L) 동기화에 개체를 사용할 수 있는 권한입니다. 이렇게 하면 스레드가 개체가 신호 상태가 될 때까지 대기할 수 있습니다.
WRITE_DAC (0x00040000L) 개체의 보안 설명자에서 DACL을 수정하는 데 필요합니다.
WRITE_OWNER (0x00080000L) 개체의 보안 설명자에서 소유자를 변경해야 합니다.

 

다음 표에서는 프로세스별 액세스 권한을 나열합니다.

의미
PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED(0x000F0000L) | SYNCHRONIZE(0x00100000L) | 0xFFFF) 프로세스 개체에 대해 가능한 모든 액세스 권한입니다. Windows Server 2003 및 Windows XP: Windows Server 2008 및 Windows Vista에서 PROCESS_ALL_ACCESS 플래그의 크기가 증가했습니다. Windows Server 2008용으로 컴파일된 애플리케이션과 Windows Vista가 Windows Server 2003 또는 Windows XP에서 실행되는 경우 PROCESS_ALL_ACCESS 플래그가 너무 커서 이 플래그를 지정하는 함수가 ERROR_ACCESS_DENIED 실패합니다. 이 문제를 방지하려면 작업에 필요한 최소 액세스 권한 집합을 지정합니다. PROCESS_ALL_ACCESS 사용해야 하는 경우 _WIN32_WINNT 애플리케이션이 대상으로 하는 최소 운영 체제(예: #define _WIN32_WINNT _WIN32_WINNT_WINXP)로 설정합니다. 자세한 내용은 Windows 헤더 사용을 참조하세요.
PROCESS_CREATE_PROCESS (0x0080) 이 프로세스를 PROC_THREAD_ATTRIBUTE_PARENT_PROCESS 부모 프로세스로 사용하는 데 필요합니다.
PROCESS_CREATE_THREAD (0x0002) 프로세스에서 스레드를 만드는 데 필요합니다.
PROCESS_DUP_HANDLE (0x0040) DuplicateHandle을 사용하여 핸들을 복제하는 데 필요합니다.
PROCESS_QUERY_INFORMATION (0x0400) 토큰, 종료 코드 및 우선 순위 클래스와 같은 프로세스에 대한 특정 정보를 검색하는 데 필요합니다( OpenProcessToken 참조).
PROCESS_QUERY_LIMITED_INFORMATION (0x1000) 프로세스에 대한 특정 정보를 검색하는 데 필요합니다( GetExitCodeProcess, GetPriorityClass, IsProcessInJob, QueryFullProcessImageName 참조). PROCESS_QUERY_INFORMATION 액세스 권한이 있는 핸들은 PROCESS_QUERY_LIMITED_INFORMATION 자동으로 부여됩니다. Windows Server 2003 및 Windows XP: 이 액세스 권한은 지원되지 않습니다.
PROCESS_SET_INFORMATION (0x0200) 우선 순위 클래스와 같은 프로세스에 대한 특정 정보를 설정하는 데 필요합니다( SetPriorityClass 참조).
PROCESS_SET_QUOTA (0x0100) SetProcessWorkingSetSize를 사용하여 메모리 제한을 설정하는 데 필요합니다.
PROCESS_SUSPEND_RESUME (0x0800) 프로세스를 일시 중단하거나 다시 시작하는 데 필요합니다.
PROCESS_TERMINATE (0x0001) TerminateProcess를 사용하여 프로세스를 종료하는 데 필요합니다.
PROCESS_VM_OPERATION (0x0008) 프로세스의 주소 공간에서 작업을 수행하는 데 필요합니다( VirtualProtectExWriteProcessMemory 참조).
PROCESS_VM_READ (0x0010) ReadProcessMemory를 사용하여 프로세스에서 메모리를 읽는 데 필요합니다.
PROCESS_VM_WRITE (0x0020) WriteProcessMemory를 사용하는 프로세스에서 메모리에 쓰는 데 필요합니다.
SYNCHRONIZE (0x00100000L) 대기 함수를 사용하여 프로세스가 종료되기를 기다리는 데 필요합니다.

 

다른 프로세스에 대한 핸들을 열고 전체 액세스 권한을 얻으려면 SeDebugPrivilege 권한을 사용하도록 설정해야 합니다. 자세한 내용은 토큰의 권한 변경을 참조하세요.

CreateProcess 함수에서 반환된 핸들에는 프로세스 개체에 대한 액세스 권한이 PROCESS_ALL_ACCESS. OpenProcess 함수를 호출할 때 시스템은 프로세스의 보안 설명자에서 DACL에 대해 요청된 액세스 권한을 확인합니다. GetCurrentProcess 함수를 호출하면 시스템에서 DACL이 호출자에게 허용하는 최대 액세스 권한이 있는 의사 핸들을 반환합니다.

개체의 SACL을 읽거나 쓰려는 경우 프로세스 개체에 대한 ACCESS_SYSTEM_SECURITY 액세스 권한을 요청할 수 있습니다. 자세한 내용은 ACL(액세스 제어 목록)SACL 액세스 권한을 참조하세요.

경고

여기에 설명된 액세스 권한 중 일부가 있는 프로세스는 이를 사용하여 다른 액세스 권한을 얻을 수 있습니다. 예를 들어 프로세스 A에 PROCESS_DUP_HANDLE 액세스 권한이 있는 B를 처리하는 핸들이 있는 경우 프로세스 B에 대한 의사 핸들을 복제할 수 있습니다. 이렇게 하면 프로세스 B에 대한 최대 액세스 권한이 있는 핸들이 만들어집니다. 의사 핸들에 대한 자세한 내용은 GetCurrentProcess를 참조하세요.

 

보호된 프로세스

Windows Vista는 디지털 권한 관리에 대한 지원을 강화하기 위해 보호된 프로세스를 도입했습니다. 시스템은 보호된 프로세스 및 보호된 프로세스의 스레드에 대한 액세스를 제한합니다.

다음 표준 액세스 권한은 프로세스에서 보호된 프로세스로 허용되지 않습니다.

  • DELETE
  • READ_CONTROL
  • WRITE_DAC
  • WRITE_OWNER

다음 특정 액세스 권한은 프로세스에서 보호된 프로세스로 허용되지 않습니다.

  • PROCESS_ALL_ACCESS
  • PROCESS_CREATE_PROCESS
  • PROCESS_CREATE_THREAD
  • PROCESS_DUP_HANDLE
  • PROCESS_QUERY_INFORMATION
  • PROCESS_SET_INFORMATION
  • PROCESS_SET_QUOTA
  • PROCESS_VM_OPERATION
  • PROCESS_VM_READ
  • PROCESS_VM_WRITE

PROCESS_QUERY_INFORMATION 통해 사용할 수 있는 정보의 하위 집합에 대한 액세스를 제공하기 위해 PROCESS_QUERY_LIMITED_INFORMATION 권한이 도입되었습니다.