서비스 보안 및 액세스 권한
Windows 보안 모델을 사용하면 SCM(서비스 제어 관리자) 및 서비스 개체에 대한 액세스를 제어할 수 있습니다. 다음 섹션에서는 자세한 정보를 제공합니다.
Service Control Manager에 대한 액세스 권한
다음은 SCM에 대한 특정 액세스 권한입니다.
액세스 권한 | 설명 |
---|---|
SC_MANAGER_ALL_ACCESS (0xF003F) | 이 테이블의 모든 액세스 권한 외에도 STANDARD_RIGHTS_REQUIRED 포함합니다. |
SC_MANAGER_CREATE_SERVICE (0x0002) | CreateService 함수를 호출하여 서비스 개체를 만들고 데이터베이스에 추가하는 데 필요합니다. |
SC_MANAGER_CONNECT (0x0001) | 서비스 제어 관리자에 연결하는 데 필요합니다. |
SC_MANAGER_ENUMERATE_SERVICE (0x0004) |
EnumServicesStatus 또는 EnumServicesStatusEx 함수를 호출하여 데이터베이스에 있는 서비스를 나열하는 데 필요합니다. 서비스를 만들거나 삭제할 때 알림을 받으려면 NotifyServiceStatusChange 함수를 호출해야 합니다. |
SC_MANAGER_LOCK (0x0008) | LockServiceDatabase 함수를 호출하여 데이터베이스에 대한 잠금을 획득하는 데 필요합니다. |
SC_MANAGER_MODIFY_BOOT_CONFIG (0x0020) | NotifyBootConfigStatus 함수를 호출하는 데 필요합니다. |
SC_MANAGER_QUERY_LOCK_STATUS (0x0010) | QueryServiceLockStatus 함수를 호출하여 데이터베이스에 대한 잠금 상태 정보를 검색하는 데 필요합니다. |
다음은 SCM에 대한 일반 액세스 권한 입니다.
액세스 권한 | 설명 |
---|---|
GENERIC_READ |
SC_MANAGER_ENUMERATE_SERVICE SC_MANAGER_QUERY_LOCK_STATUS |
GENERIC_WRITE |
SC_MANAGER_CREATE_SERVICE SC_MANAGER_MODIFY_BOOT_CONFIG |
GENERIC_EXECUTE |
SC_MANAGER_CONNECT SC_MANAGER_LOCK |
GENERIC_ALL |
|
올바른 액세스 권한이 있는 프로세스는 OpenService, EnumServicesStatusEx 및 QueryServiceLockStatus 함수에서 사용할 수 있는 SCM에 대한 핸들을 열 수 있습니다. 관리자 권한이 있는 프로세스만 CreateService 및 LockServiceDatabase 함수에서 사용할 수 있는 SCM 에 대한 핸들을 열 수 있습니다.
시스템은 SCM에 대한 보안 설명자를 만듭니다. SCM에 대한 보안 설명자를 얻거나 설정하려면 SCManager 개체에 대한 핸들과 함께 QueryServiceObjectSecurity 및 SetServiceObjectSecurity 함수를 사용합니다.
Windows Server 2003 및 Windows XP: 대부분의 다른 보안 개체와 달리 SCM의 보안 설명자는 수정할 수 없습니다. 이 동작은 Windows Server 2003 SP1(서비스 팩 1)을 사용하여 변경되었습니다.
다음 액세스 권한이 부여됩니다.
계정 | 액세스 권한 |
---|---|
원격 인증된 사용자 |
|
로컬 인증된 사용자(LocalService 및 NetworkService 포함) |
SC_MANAGER_ENUMERATE_SERVICE SC_MANAGER_QUERY_LOCK_STATUS STANDARD_RIGHTS_READ |
LocalSystem |
SC_MANAGER_ENUMERATE_SERVICE SC_MANAGER_MODIFY_BOOT_CONFIG SC_MANAGER_QUERY_LOCK_STATUS STANDARD_RIGHTS_READ |
관리자 |
|
네트워크를 통해 인증되었지만 대화형으로 로그온되지 않은 원격 사용자는 SCM에 연결할 수 있지만 다른 액세스 권한이 필요한 작업은 수행할 수 없습니다. 이러한 작업을 수행하려면 사용자가 대화형으로 로그온해야 하거나 서비스에서 서비스 계정 중 하나를 사용해야 합니다.
Windows Server 2003 및 Windows XP: 원격 인증된 사용자에게는 SC_MANAGER_CONNECT, SC_MANAGER_ENUMERATE_SERVICE, SC_MANAGER_QUERY_LOCK_STATUS 및 STANDARD_RIGHTS_READ 액세스 권한이 부여됩니다. 이러한 액세스 권한은 WINDOWS Server 2003 SP1의 이전 표에 설명된 대로 제한됩니다.
프로세스가 OpenSCManager 함수를 사용하여 설치된 서비스 데이터베이스에 대한 핸들을 열면 액세스 권한을 요청할 수 있습니다. 시스템은 요청된 액세스 권한을 부여하기 전에 SCM의 보안 설명자에 대해 보안 검사 수행합니다.
서비스에 대한 액세스 권한
다음은 서비스에 대한 특정 액세스 권한입니다.
액세스 권한 | 설명 |
---|---|
SERVICE_ALL_ACCESS (0xF01FF) | 이 테이블의 모든 액세스 권한 외에도 STANDARD_RIGHTS_REQUIRED 포함합니다. |
SERVICE_CHANGE_CONFIG (0x0002) | 서비스 구성을 변경하려면 ChangeServiceConfig 또는 ChangeServiceConfig2 함수를 호출해야 합니다. 이렇게 하면 호출자에게 시스템이 실행하는 실행 파일을 변경할 수 있는 권한이 부여되므로 관리자에게만 부여되어야 합니다. |
SERVICE_ENUMERATE_DEPENDENTS (0x0008) | EnumDependentServices 함수를 호출하여 서비스에 종속된 모든 서비스를 열거하는 데 필요합니다. |
SERVICE_INTERROGATE (0x0080) | ControlService 함수를 호출하여 서비스에 해당 상태 즉시 보고하도록 요청하는 데 필요합니다. |
SERVICE_PAUSE_CONTINUE (0x0040) | 서비스를 일시 중지하거나 계속하려면 ControlService 함수를 호출해야 합니다. |
SERVICE_QUERY_CONFIG (0x0001) | 서비스 구성을 쿼리하기 위해 QueryServiceConfig 및 QueryServiceConfig2 함수를 호출하는 데 필요합니다. |
SERVICE_QUERY_STATUS (0x0004) |
QueryServiceStatus 또는 QueryServiceStatusEx 함수를 호출하여 서비스 제어 관리자에게 서비스의 상태 요청하는 데 필요합니다. 서비스가 상태 변경될 때 알림을 수신하려면 NotifyServiceStatusChange 함수를 호출해야 합니다. |
SERVICE_START (0x0010) | 서비스를 시작하려면 StartService 함수를 호출해야 합니다. |
SERVICE_STOP (0x0020) | 서비스를 중지하려면 ControlService 함수를 호출해야 합니다. |
SERVICE_USER_DEFINED_CONTROL(0x0100) | ControlService 함수를 호출하여 사용자 정의 컨트롤 코드를 지정하는 데 필요합니다. |
다음은 서비스에 대한 표준 액세스 권한 입니다.
액세스 권한 | 설명 |
---|---|
ACCESS_SYSTEM_SECURITY | SACL에 액세스하려면 QueryServiceObjectSecurity 또는 SetServiceObjectSecurity 함수를 호출해야 합니다. 이 액세스를 가져오는 적절한 방법은 호출자의 현재 액세스 토큰에서 SE_SECURITY_NAME권한을 사용하도록 설정하고 ACCESS_SYSTEM_SECURITY 액세스에 대한 핸들을 연 다음 권한을 사용하지 않도록 설정하는 것입니다. |
DELETE (0x10000) | 서비스를 삭제하려면 DeleteService 함수를 호출해야 합니다. |
READ_CONTROL (0x20000) | 서비스 개체의 보안 설명자를 쿼리하려면 QueryServiceObjectSecurity 함수를 호출해야 합니다. |
WRITE_DAC (0x40000) | 서비스 개체의 보안 설명자의 Dacl 멤버를 수정하려면 SetServiceObjectSecurity 함수를 호출해야 합니다. |
WRITE_OWNER (0x80000) | 서비스 개체의 보안 설명자의 소유자 및 그룹 멤버를 수정하려면 SetServiceObjectSecurity 함수를 호출해야 합니다. |
다음은 서비스에 대한 일반 액세스 권한 입니다.
액세스 권한 | 설명 |
---|---|
GENERIC_READ |
SERVICE_QUERY_CONFIG SERVICE_QUERY_STATUS SERVICE_INTERROGATE SERVICE_ENUMERATE_DEPENDENTS |
GENERIC_WRITE |
SERVICE_CHANGE_CONFIG |
GENERIC_EXECUTE |
SERVICE_START SERVICE_STOP SERVICE_PAUSE_CONTINUE SERVICE_USER_DEFINED_CONTROL |
SCM은 서비스가 CreateService 함수에 의해 설치될 때 서비스 개체의 보안 설명자를 만듭니다. 서비스 개체의 기본 보안 설명자는 다음 액세스 권한을 부여합니다.
계정 | 액세스 권한 |
---|---|
원격 인증된 사용자 | 기본적으로 부여되지 않습니다. Windows Server 2003 SP1: SERVICE_USER_DEFINED_CONTROL Windows Server 2003 및 Windows XP: 원격 인증된 사용자에 대한 액세스 권한은 로컬 인증된 사용자와 동일합니다. |
로컬 인증된 사용자(LocalService 및 NetworkService 포함) |
SERVICE_ENUMERATE_DEPENDENTS SERVICE_INTERROGATE SERVICE_QUERY_CONFIG SERVICE_QUERY_STATUS SERVICE_USER_DEFINED_CONTROL |
LocalSystem |
SERVICE_ENUMERATE_DEPENDENTS SERVICE_INTERROGATE SERVICE_PAUSE_CONTINUE SERVICE_QUERY_CONFIG SERVICE_QUERY_STATUS SERVICE_START SERVICE_STOP SERVICE_USER_DEFINED_CONTROL |
관리자 |
READ_CONTROL SERVICE_ALL_ACCESS WRITE_DAC WRITE_OWNER |
작업을 수행하려면 사용자가 대화형으로 로그온해야 하거나 서비스에서 서비스 계정 중 하나를 사용해야 합니다.
서비스 개체에 대한 보안 설명자를 얻거나 설정하려면 QueryServiceObjectSecurity 및 SetServiceObjectSecurity 함수를 사용합니다. 자세한 내용은 서비스에 대한 DACL 수정을 참조하세요.
프로세스에서 OpenService 함수를 사용하는 경우 시스템은 서비스 개체의 보안 설명자에 대해 요청된 액세스 권한을 확인합니다.
신뢰할 수 없는 사용자(예: SERVICE_CHANGE_CONFIG 또는 SERVICE_STOP)에게 특정 액세스 권한을 부여하면 서비스 실행을 방해하고 LocalSystem 계정으로 애플리케이션을 실행할 수 있습니다.
EnumServicesStatusEx 함수가 호출될 때 호출자에게 서비스에 대한 SERVICE_QUERY_STATUS 액세스 권한이 없는 경우 서비스는 클라이언트로 반환된 서비스 목록에서 자동으로 생략됩니다.