Uso dei SID dei servizi per concedere autorizzazioni ai servizi in SQL Server

SQL Server usa ID di sicurezza (SID) per servizio, dette anche entità di sicurezza del servizio, per consentire la concessione di autorizzazioni direttamente a un servizio specifico. Questo metodo è usato da SQL Server per concedere autorizzazioni al motore e ai servizi agente (NT SERVICE\MSSQL$<InstanceName> e NT SERVICE\SQLAGENT$<InstanceName> rispettivamente). In questo modo tali servizi possono accedere al motore di database solo quando i servizi sono in esecuzione. Per altre informazioni, vedere KB2620201 (collegamento archivio).

È possibile usare questo stesso metodo quando si concedono autorizzazioni ad altri servizi. L'uso di un SID del servizio consente di eliminare il sovraccarico associato alla gestione e alla manutenzione degli account del servizio e offre un controllo più rigoroso e granulare sulle autorizzazioni concesse alle risorse di sistema.

Ecco alcuni esempi di servizi in cui è possibile usare un SID del servizio:

  • Servizio integrità di System Center Operations Manager (NT SERVICE\HealthService)
  • Servizio Windows Server Failover Clustering (WSFC) (NT SERVICE\ClusSvc)

Per impostazione predefinita, ad alcuni servizi non è assegnato alcun SID. Per creare il SID del servizio, è necessario usare SC.exe. Questo metodo è stato adottato dagli amministratori di Microsoft System Center Operations Manager per concedere l'autorizzazione a HealthService in SQL Server.

Dopo aver creato e confermato il SID del servizio, è necessario concedergli l'autorizzazione in SQL Server. Per concedere l'autorizzazione, creare un account di accesso di Windows usando SQL Server Management Studio (SSMS) o una query. Dopo aver creato l'account di accesso, è possibile concedergli le autorizzazioni, aggiungerlo ai ruoli ed eseguirne il mapping ai database come qualsiasi altro account di accesso.

Suggerimento

Se viene restituito l'errore Login failed for user 'NT AUTHORITY\SYSTEM', verificare che il SID del servizio sia disponibile per il servizio desiderato, che l'account di accesso del SID del servizio sia stato creato in SQL Server e che al SID siano state concesse le autorizzazioni appropriate in SQL Server.

Sicurezza

Eliminazione degli account del servizio

Gli account del servizio sono stati usati in genere per consentire ai servizi di accedere a SQL Server. La gestione degli account del servizio è però più complessa perché è necessario mantenere e aggiornare periodicamente la password dell'account. Le credenziali dell'account del servizio potrebbero inoltre essere usate da un individuo che prova a mascherare le proprie attività mentre esegue azioni nell'istanza.

Autorizzazioni granulari per gli account di sistema

Per concedere le autorizzazioni agli account di sistema, viene creato un account di accesso per gli account LocalSystem (NT AUTHORITY\SYSTEM in en-us) o NetworkService (NT AUTHORITY\NETWORK SERVICE in en-us), ai quali vengono quindi concesse le autorizzazioni. Con questo metodo tutti i processi o servizi ottengono le autorizzazioni per SQL, che viene eseguito con un account di sistema.

Con un SID del servizio è invece possibile concedere le autorizzazioni per un servizio specifico. Il servizio può accedere solo alle risorse per le quali ha ottenuto le autorizzazioni quando è in esecuzione. Se, ad esempio, HealthService viene eseguito con l'account LocalSystem e ottiene l'autorizzazione View Server State, LocalSystem disporrà solo dell'autorizzazione View Server State mentre è in esecuzione nel contesto di HealthService. Se un qualsiasi altro processo prova ad accedere allo stato del server di SQL con l'account LocalSystem, l'accesso verrà negato.

Esempi

R. Creare un SID del servizio

Il comando di PowerShell seguente consente di creare un SID del servizio nel servizio integrità di System Center Operations Manager.

sc.exe --% sidtype "HealthService" unrestricted

Importante

--% indica a PowerShell di arrestare l'analisi della parte rimanente del comando. Questo comportamento è utile quando si usano comandi e applicazioni legacy.

B. Eseguire query su un SID del servizio

Per controllare un SID del servizio o per verificarne l'esistenza, eseguire il comando seguente in PowerShell.

sc.exe --% qsidtype "HealthService"

Importante

--% indica a PowerShell di arrestare l'analisi della parte rimanente del comando. Questo comportamento è utile quando si usano comandi e applicazioni legacy.

C. Aggiungere un SID del servizio appena creato come account di accesso

L'esempio seguente consente di creare un account di accesso per il servizio integrità di System Center Operations Manager con T-SQL.

CREATE LOGIN [NT SERVICE\HealthService] FROM WINDOWS
GO

D. Aggiungere un SID del servizio esistente come account di accesso

L'esempio seguente consente di creare un account di accesso per Servizio cluster con T-SQL. La concessione delle autorizzazioni direttamente al Servizio cluster consente di evitare di concedere autorizzazioni eccessive all'account SYSTEM.

CREATE LOGIN [NT SERVICE\ClusSvc] FROM WINDOWS
GO

E. Concedere autorizzazioni a un SID del servizio

Concedere le autorizzazioni necessarie per gestire i gruppi di disponibilità al Servizio 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

Nota

La rimozione degli account di accesso SID del servizio o la relativa rimozione dal ruolo del server sysadmin può causare problemi per i vari componenti di SQL Server che si connettono al motore di database di SQL Server. Alcuni dei problemi sono i seguenti:

  • SQL Server Agent non può avviare o connettersi a un servizio SQL Server
  • Nei programmi di installazione di SQL Server si verifica il problema indicato nell'articolo della Microsoft Knowledge Base seguente: https://mskb.pkisolutions.com/kb/955813

Per un'istanza predefinita di SQL Server, è possibile risolvere il problema aggiungendo il SID del servizio usando i comandi Transact-SQL seguenti:

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]

Per un'istanza denominata di SQL Server, usare i comandi Transact-SQL seguenti:

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]

In questo esempio SQL2019 è il nome dell'istanza di SQL Server.

Passaggi successivi

Per altre informazioni sulla struttura del SID del servizio, vedere SERVICE_SID_INFO structure (Struttura SERVICE_SID_INFO).

Vedere le altre opzioni disponibili quando si crea un account di accesso.

Per usare la sicurezza basata sui ruoli con i SID del servizio, vedere l'articolo sulla creazione dei ruoli in SQL Server.

Scoprire altri modi per concedere le autorizzazioni ai SID del servizio in SQL Server.

Per altre informazioni sulla configurazione degli account del servizio per SQL Server, vedere Configure account del servizio e autorizzazioni di Windows.