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 |
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 |
|
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 |
|
Usuários autenticados locais (incluindo LocalService e 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 |
Administradores |
|
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 |
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 |
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) |
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 |
Administradores |
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.