서비스 보안 및 액세스 권한

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
STANDARD_RIGHTS_READ
SC_MANAGER_ENUMERATE_SERVICE
SC_MANAGER_QUERY_LOCK_STATUS
GENERIC_WRITE
STANDARD_RIGHTS_WRITE
SC_MANAGER_CREATE_SERVICE
SC_MANAGER_MODIFY_BOOT_CONFIG
GENERIC_EXECUTE
STANDARD_RIGHTS_EXECUTE
SC_MANAGER_CONNECT
SC_MANAGER_LOCK
GENERIC_ALL
SC_MANAGER_ALL_ACCESS

올바른 액세스 권한이 있는 프로세스는 OpenService, EnumServicesStatusExQueryServiceLockStatus 함수에서 사용할 수 있는 SCM에 대한 핸들을 열 수 있습니다. 관리자 권한이 있는 프로세스만 CreateService 및 LockServiceDatabase 함수에서 사용할 수 있는 SCM 에 대한 핸들을 열 수 있습니다.

시스템은 SCM에 대한 보안 설명자를 만듭니다. SCM에 대한 보안 설명자를 얻거나 설정하려면 SCManager 개체에 대한 핸들과 함께 QueryServiceObjectSecuritySetServiceObjectSecurity 함수를 사용합니다.

Windows Server 2003 및 Windows XP: 대부분의 다른 보안 개체와 달리 SCM의 보안 설명자는 수정할 수 없습니다. 이 동작은 Windows Server 2003 SP1(서비스 팩 1)을 사용하여 변경되었습니다.

다음 액세스 권한이 부여됩니다.

계정 액세스 권한
원격 인증된 사용자
SC_MANAGER_CONNECT
로컬 인증된 사용자(LocalService 및 NetworkService 포함)
SC_MANAGER_CONNECT
SC_MANAGER_ENUMERATE_SERVICE
SC_MANAGER_QUERY_LOCK_STATUS
STANDARD_RIGHTS_READ
LocalSystem
SC_MANAGER_CONNECT
SC_MANAGER_ENUMERATE_SERVICE
SC_MANAGER_MODIFY_BOOT_CONFIG
SC_MANAGER_QUERY_LOCK_STATUS
STANDARD_RIGHTS_READ
관리자
SC_MANAGER_ALL_ACCESS

네트워크를 통해 인증되었지만 대화형으로 로그온되지 않은 원격 사용자는 SCM에 연결할 수 있지만 다른 액세스 권한이 필요한 작업은 수행할 수 없습니다. 이러한 작업을 수행하려면 사용자가 대화형으로 로그온해야 하거나 서비스에서 서비스 계정 중 하나를 사용해야 합니다.

Windows Server 2003 및 Windows XP: 원격 인증된 사용자에게는 SC_MANAGER_CONNECT, SC_MANAGER_ENUMERATE_SERVICE, SC_MANAGER_QUERY_LOCK_STATUSSTANDARD_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) 서비스 구성을 쿼리하기 위해 QueryServiceConfigQueryServiceConfig2 함수를 호출하는 데 필요합니다.
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
STANDARD_RIGHTS_READ
SERVICE_QUERY_CONFIG
SERVICE_QUERY_STATUS
SERVICE_INTERROGATE
SERVICE_ENUMERATE_DEPENDENTS
GENERIC_WRITE
STANDARD_RIGHTS_WRITE
SERVICE_CHANGE_CONFIG
GENERIC_EXECUTE
STANDARD_RIGHTS_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 포함)
READ_CONTROL
SERVICE_ENUMERATE_DEPENDENTS
SERVICE_INTERROGATE
SERVICE_QUERY_CONFIG
SERVICE_QUERY_STATUS
SERVICE_USER_DEFINED_CONTROL
LocalSystem
READ_CONTROL
SERVICE_ENUMERATE_DEPENDENTS
SERVICE_INTERROGATE
SERVICE_PAUSE_CONTINUE
SERVICE_QUERY_CONFIG
SERVICE_QUERY_STATUS
SERVICE_START
SERVICE_STOP
SERVICE_USER_DEFINED_CONTROL
관리자
DELETE
READ_CONTROL
SERVICE_ALL_ACCESS
WRITE_DAC
WRITE_OWNER

작업을 수행하려면 사용자가 대화형으로 로그온해야 하거나 서비스에서 서비스 계정 중 하나를 사용해야 합니다.

서비스 개체에 대한 보안 설명자를 얻거나 설정하려면 QueryServiceObjectSecuritySetServiceObjectSecurity 함수를 사용합니다. 자세한 내용은 서비스에 대한 DACL 수정을 참조하세요.

프로세스에서 OpenService 함수를 사용하는 경우 시스템은 서비스 개체의 보안 설명자에 대해 요청된 액세스 권한을 확인합니다.

신뢰할 수 없는 사용자(예: SERVICE_CHANGE_CONFIG 또는 SERVICE_STOP)에게 특정 액세스 권한을 부여하면 서비스 실행을 방해하고 LocalSystem 계정으로 애플리케이션을 실행할 수 있습니다.

EnumServicesStatusEx 함수가 호출될 때 호출자에게 서비스에 대한 SERVICE_QUERY_STATUS 액세스 권한이 없는 경우 서비스는 클라이언트로 반환된 서비스 목록에서 자동으로 생략됩니다.