Segurança do serviço e direitos de acesso

O modelo de segurança do Windows permite controlar o acesso ao SCM (gerenciador de controle de serviço) e aos objetos de serviço. As seções a seguir fornecem informações detalhadas:

Direitos de acesso para o Gerenciador de Controle de Serviço

Veja a seguir os direitos de acesso específicos para o SCM.

Direito de acesso Descrição
SC_MANAGER_ALL_ACCESS (0xF003F) Inclui STANDARD_RIGHTS_REQUIRED, além de todos os direitos de acesso nesta tabela.
SC_MANAGER_CREATE_SERVICE (0x0002) Necessário para chamar a função CreateService para criar um objeto de serviço e adicioná-lo ao banco de dados.
SC_MANAGER_CONNECT (0x0001) Necessário para se conectar ao gerenciador de controle de serviço.
SC_MANAGER_ENUMERATE_SERVICE (0x0004) Necessário para chamar a função EnumServicesStatus ou EnumServicesStatusEx para listar os serviços que estão no banco de dados.
Necessário para chamar a função NotifyServiceStatusChange para receber notificação quando qualquer serviço for criado ou excluído.
SC_MANAGER_LOCK (0x0008) Necessário para chamar a função LockServiceDatabase para adquirir um bloqueio no banco de dados.
SC_MANAGER_MODIFY_BOOT_CONFIG (0x0020) Necessário para chamar a função NotifyBootConfigStatus .
SC_MANAGER_QUERY_LOCK_STATUS (0x0010) Necessário para chamar a função QueryServiceLockStatus para recuperar o bloqueio status informações para o banco de dados.

Veja a seguir os direitos de acesso genéricos para o SCM.

Direito de acesso Descrição
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

Um processo com os direitos de acesso corretos pode abrir um identificador para o SCM que pode ser usado nas funções OpenService, EnumServicesStatusEx e QueryServiceLockStatus . Somente processos com privilégios de Administrador podem abrir identificadores para o SCM que podem ser usados pelas funções CreateService e LockServiceDatabase .

O sistema cria o descritor de segurança para o SCM. Para obter ou definir o descritor de segurança para o SCM, use as funções QueryServiceObjectSecurity e SetServiceObjectSecurity com um identificador para o objeto SCManager.

Windows Server 2003 e Windows XP: Ao contrário da maioria dos outros objetos protegíveis, o descritor de segurança para o SCM não pode ser modificado. Esse comportamento mudou a partir do Windows Server 2003 com Service Pack 1 (SP1).

Os direitos de acesso a seguir são concedidos.

Conta Direitos de acesso
Usuários autenticados remotos
SC_MANAGER_CONNECT
Usuários autenticados locais (incluindo LocalService e 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
Administradores
SC_MANAGER_ALL_ACCESS

Observe que os usuários remotos autenticados pela rede, mas não conectados interativamente, podem se conectar ao SCM, mas não executar operações que exijam outros direitos de acesso. Para executar essas operações, o usuário deve estar conectado interativamente ou o serviço deve usar uma das contas de serviço.

Windows Server 2003 e Windows XP: Os usuários autenticados remotos recebem os direitos de acesso SC_MANAGER_CONNECT, SC_MANAGER_ENUMERATE_SERVICE, SC_MANAGER_QUERY_LOCK_STATUS e STANDARD_RIGHTS_READ . Esses direitos de acesso são restritos conforme descrito na tabela anterior a partir do Windows Server 2003 com SP1

Quando um processo usa a função OpenSCManager para abrir um identificador para um banco de dados de serviços instalados, ele pode solicitar direitos de acesso. O sistema executa uma marcar de segurança no descritor de segurança do SCM antes de conceder os direitos de acesso solicitados.

Direitos de acesso para um serviço

Veja a seguir os direitos de acesso específicos para um serviço.

Direito de acesso Descrição
SERVICE_ALL_ACCESS (0xF01FF) Inclui STANDARD_RIGHTS_REQUIRED além de todos os direitos de acesso nesta tabela.
SERVICE_CHANGE_CONFIG (0x0002) Necessário para chamar a função ChangeServiceConfig ou ChangeServiceConfig2 para alterar a configuração do serviço. Como isso concede ao chamador o direito de alterar o arquivo executável que o sistema executa, ele deve ser concedido somente aos administradores.
SERVICE_ENUMERATE_DEPENDENTS (0x0008) Necessário para chamar a função EnumDependentServices para enumerar todos os serviços dependentes do serviço.
SERVICE_INTERROGATE (0x0080) Necessário para chamar a função ControlService para solicitar que o serviço relate seu status imediatamente.
SERVICE_PAUSE_CONTINUE (0x0040) Necessário para chamar a função ControlService para pausar ou continuar o serviço.
SERVICE_QUERY_CONFIG (0x0001) Necessário para chamar as funções QueryServiceConfig e QueryServiceConfig2 para consultar a configuração do serviço.
SERVICE_QUERY_STATUS (0x0004) Necessário para chamar a função QueryServiceStatus ou QueryServiceStatusEx para perguntar ao gerenciador de controle de serviço sobre o status do serviço.
Necessário para chamar a função NotifyServiceStatusChange para receber notificação quando um serviço for alterado status.
SERVICE_START (0x0010) Necessário para chamar a função StartService para iniciar o serviço.
SERVICE_STOP (0x0020) Necessário para chamar a função ControlService para interromper o serviço.
SERVICE_USER_DEFINED_CONTROL(0x0100) Necessário para chamar a função ControlService para especificar um código de controle definido pelo usuário.

Veja a seguir os direitos de acesso padrão para um serviço.

Direito de acesso Descrição
ACCESS_SYSTEM_SECURITY Necessário para chamar a função QueryServiceObjectSecurity ou SetServiceObjectSecurity para acessar o SACL. A maneira adequada de obter esse acesso é habilitar o privilégioSE_SECURITY_NAME no token de acesso atual do chamador, abrir o identificador para acesso ACCESS_SYSTEM_SECURITY e desabilitar o privilégio.
DELETE (0x10000) Necessário para chamar a função DeleteService para excluir o serviço.
READ_CONTROL (0x20000) Necessário para chamar a função QueryServiceObjectSecurity para consultar o descritor de segurança do objeto de serviço.
WRITE_DAC (0x40000) Necessário para chamar a função SetServiceObjectSecurity para modificar o membro Dacl do descritor de segurança do objeto de serviço.
WRITE_OWNER (0x80000) Necessário para chamar a função SetServiceObjectSecurity para modificar os membros Proprietário e Grupo do descritor de segurança do objeto de serviço.

Veja a seguir os direitos de acesso genéricos para um serviço.

Direito de acesso Descrição
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

O SCM cria o descritor de segurança de um objeto de serviço quando o serviço é instalado pela função CreateService . O descritor de segurança padrão de um objeto de serviço concede o acesso a seguir.

Conta Direitos de acesso
Usuários autenticados remotos Não concedido por padrão. Windows Server 2003 com SP1: SERVICE_USER_DEFINED_CONTROL
Windows Server 2003 e Windows XP: Os direitos de acesso para usuários autenticados remotos são os mesmos para usuários autenticados locais.
Usuários autenticados locais (incluindo LocalService e 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
Administradores
DELETE
READ_CONTROL
SERVICE_ALL_ACCESS
WRITE_DAC
WRITE_OWNER

Para executar quaisquer operações, o usuário deve estar conectado interativamente ou o serviço deve usar uma das contas de serviço.

Para obter ou definir o descritor de segurança para um objeto de serviço, use as funções QueryServiceObjectSecurity e SetServiceObjectSecurity . Para obter mais informações, consulte Modificando a DACL para um serviço.

Quando um processo usa a função OpenService , o sistema verifica os direitos de acesso solicitados no descritor de segurança do objeto de serviço.

Conceder certos direitos de acesso a usuários não confiáveis (como SERVICE_CHANGE_CONFIG ou SERVICE_STOP) pode permitir que eles interfiram na execução do serviço e, possivelmente, permitir que eles executem aplicativos na conta LocalSystem.

Quando a função EnumServicesStatusEx é chamada, se o chamador não tiver o direito de acesso SERVICE_QUERY_STATUS a um serviço, o serviço será silenciosamente omitido da lista de serviços retornados ao cliente.