Usando SIDs de serviço para conceder permissões para serviços no SQL Server

O SQL Server usa SID (identificadores de segurança) por serviço (também conhecidos como entidade de segurança de serviço) para possibilitar a concessão de permissões diretamente a um serviço específico. Esse método é usado por SQL Server para conceder permissões aos serviços de mecanismo e agente (NT SERVICE\MSSQL$<InstanceName> e NT SERVICE\SQLAGENT$<InstanceName>, respectivamente). Usando esse método, esses serviços podem acessar o mecanismo de banco de dados somente quando os serviços estão em execução.

Esse mesmo método pode ser usado ao conceder permissões a outros serviços. Usar um SID de serviço elimina a sobrecarga de gerenciamento e manutenção de contas de serviço e dá um controle mais rigoroso e granular sobre as permissões concedidas aos recursos do sistema.

Exemplos de serviços em que um SID de serviço pode ser usado são:

  • Serviço de Integridade do System Center Operations Manager (NT SERVICE\HealthService)
  • Serviço de Clustering de Failover do Windows Server (WSFC) (SERVICE\ClusSvc NT)

Por padrão, alguns serviços não têm um SID de serviço. O SID de serviço deve ser criado usando SC.exe. Esse método foi adotado por administradores do Microsoft System Center Operations Manager para conceder permissão para o HealthService dentro do SQL Server.

Uma vez o serviço SID foi criado e confirmado, ele deve ter a permissão dentro do SQL Server. Conceder permissões é feito criando um logon do Windows usando um SSMS (SQL Server Management Studio) ou uma consulta. Depois que o logon for criado, ele poderá receber permissões, ser adicionado a funções e ser mapeado para bancos de dados assim como qualquer outro logon.

Dica

Se o erro Login failed for user 'NT AUTHORITY\SYSTEM' for recebido, verifique se o SID de serviço existe para o serviço desejado, se o logon do SID de serviço foi criado no SQL Server e se as permissões apropriadas foram concedidas para o SID de serviço no SQL Server.

Segurança

Eliminar as contas de serviço

Tradicionalmente, contas de serviço eram usadas para permitir os serviços logon no SQL Server. Contas de serviço adicionam uma camada adicional de complexidade de gerenciamento devido à necessidade de manter e atualizar periodicamente a senha da conta de serviço. Além disso, as credenciais da conta de serviço poderiam ser usadas por uma pessoa tentando mascarar suas atividades ao realizar ações na instância.

Permissões granulares para contas do sistema

Contas do sistema historicamente recebem permissões criando um logon para as contas LocalSystem (NT AUTHORITY\SYSTEM em en-us) ou NetworkService (NT AUTHORITY\NETWORK SERVICE em en-us) e concedendo a elas permissões de logon. Esse método concede qualquer permissão de processo ou serviço em SQL, que está em execução como uma conta do sistema.

Usar um SID de Serviço possibilita a concessão de permissões a um serviço específico. O serviço só tem acesso aos recursos para os quais recebeu permissões quando está em execução. Por exemplo, se o HealthService estiver em execução como LocalSystem e receber View Server State, a conta LocalSystem só terá permissão para View Server State quando estiver em execução no contexto do HealthService. Se qualquer outro processo tentar acessar o estado do servidor do SQL como LocalSystem, ele terá o acesso negado.

Exemplos

a. Criar uma ID de Serviço

O seguinte comando do PowerShell criará um SID de serviço no serviço de integridade do System Center Operations Manager.

sc.exe --% sidtype "HealthService" unrestricted

Importante

--% diz para o PowerShell deixar de analisar o restante do comando. Isso é útil ao usar comandos e aplicativos herdados.

B. Consultar um SID de Serviço

Para verificar um SID de serviço ou verificar se um SID de serviço existe, execute o seguinte comando no PowerShell.

sc.exe --% qsidtype "HealthService"

Importante

--% diz para o PowerShell deixar de analisar o restante do comando. Isso é útil ao usar comandos e aplicativos herdados.

C. Adicionar um SID de serviço recém-criado como um logon

O exemplo a seguir cria um logon para o serviço de integridade do System Center Operations Manager usando o T-SQL.

CREATE LOGIN [NT SERVICE\HealthService] FROM WINDOWS
GO

D. Adicionar um SID de serviço existente como um logon

O exemplo a seguir cria um logon para o Serviço de Cluster usando o T-SQL. Conceder permissões ao serviço de cluster elimina diretamente a necessidade de conceder permissões excessivas para a conta SYSTEM.

CREATE LOGIN [NT SERVICE\ClusSvc] FROM WINDOWS
GO

E. Conceder permissões para um SID de Serviço

Conceda as permissões necessárias para gerenciar grupos de disponibilidade para o Serviço de Cluster.

GRANT ALTER ANY AVAILABILITY GROUP TO [NT SERVICE\ClusSvc]
GO

GRANT CONNECT SQL TO [NT SERVICE\ClusSvc]
GO

GRANT VIEW SERVER STATE TO [NT SERVICE\ClusSvc]
GO

Observação

Remover os logons de SID do serviço ou da função de servidor sysadmin pode causar problemas em vários componentes do SQL Server que se conectam ao Mecanismo de Banco de Dados do SQL Server. Alguns problemas incluem:

  • O SQL Server Agent não consegue iniciar nem se conectar a um serviço SQL Server
  • Os programas de instalação do SQL Server encontram o problema mencionado no seguinte artigo da base de dados de conhecimento da Microsoft: https://mskb.pkisolutions.com/kb/955813

Para uma instância padrão do SQL Server, você pode corrigir essa situação adicionando o SID do serviço usando os seguintes comandos Transact-SQL:

CREATE LOGIN [NT SERVICE\MSSQLSERVER] FROM WINDOWS WITH DEFAULT_DATABASE=[master], DEFAULT_LANGUAGE=[us_english]

ALTER ROLE sysadmin ADD MEMBER [NT SERVICE\MSSQLSERVER]

CREATE LOGIN [NT SERVICE\SQLSERVERAGENT] FROM WINDOWS WITH DEFAULT_DATABASE=[master], DEFAULT_LANGUAGE=[us_english]

ALTER ROLE sysadmin ADD MEMBER [NT SERVICE\SQLSERVERAGENT]

Para uma instância nomeada do SQL Server, use os seguintes comandos Transact-SQL:

CREATE LOGIN [NT SERVICE\MSSQL$SQL2019] FROM WINDOWS WITH DEFAULT_DATABASE=[master], DEFAULT_LANGUAGE=[us_english]

ALTER ROLE sysadmin ADD MEMBER [NT SERVICE\MSSQL$SQL2019]

CREATE LOGIN [NT SERVICE\SQLAgent$SQL2019] FROM WINDOWS WITH DEFAULT_DATABASE=[master], DEFAULT_LANGUAGE=[us_english]

ALTER ROLE sysadmin ADD MEMBER [NT SERVICE\SQLAgent$SQL2019]

Nesse exemplo, SQL2019 é o nome da instância do SQL Server.

Próximas etapas

Para obter mais informações sobre o serviço de estrutura de sid, leia estrutura SERVICE_SID_INFO.

Leia sobre as opções adicionais disponíveis ao criar um logon.

Para usar segurança baseada em função com SIDs de serviço, leia sobre criar funções no SQL Server.

Leia sobre diferentes maneiras de conceder permissões para SIDs de serviço no SQL Server.

Para obter mais informações sobre como configurar contas de serviço para o SQL Server, leia Configurar contas de serviço e permissões do Windows.