Condividi tramite


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

SQL Server usa identificatori di sicurezza (SID) per servizio, detti anche entità di sicurezza del servizio, per consentire l'autorizzazione direttamente a un servizio specifico. Questo metodo viene usato da SQL Server per concedere le autorizzazioni ai servizi del motore e dell'agente (rispettivamente NT SERVICE\MSSQL$<InstanceName> e NT SERVICE\SQLAGENT$<InstanceName> ). Usando questo metodo, tali servizi possono accedere al motore di database solo quando i servizi sono in esecuzione. Per altre informazioni, vedere KB2620201 (collegamento archivio).

Questo stesso metodo può essere usato quando si concedono autorizzazioni ad altri servizi. L'uso di un SID del servizio elimina il sovraccarico della gestione e della gestione degli account del servizio e offre un controllo più rigoroso e granulare sulle autorizzazioni concesse alle risorse di sistema.

Esempi di servizi in cui è possibile usare un SID del servizio sono:

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

Per impostazione predefinita, alcuni servizi non dispongono di un SID del servizio. Il SID del servizio deve essere creato usando SC.exe. Questo metodo è stato adottato dagli amministratori di Microsoft System Center Operations Manager per concedere l'autorizzazione a HealthService all'interno di SQL Server.

Dopo aver creato e confermato il SID del servizio, è necessario concedere l'autorizzazione all'interno di SQL Server. La concessione delle autorizzazioni viene eseguita creando un account di accesso di Windows usando SQL Server Management Studio (SSMS) o una query Transact-SQL. Dopo aver creato l'account di accesso, è possibile concedere le autorizzazioni, aggiungerle ai ruoli ed eseguire il mapping ai database esattamente come qualsiasi altro account di accesso.

Suggerimento

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

Security

Eliminare gli account di servizio

Gli account del servizio sono stati tradizionalmente usati per consentire ai servizi di accedere a SQL Server. Gli account di servizio aggiungono un ulteriore livello di complessità di gestione a causa della necessità di gestire e aggiornare periodicamente la password dell'account del servizio. Inoltre, le credenziali dell'account del servizio possono essere utilizzate da un individuo che tenta di mascherare le attività durante l'esecuzione di azioni nell'istanza.

Autorizzazioni granulari per gli account di sistema

Gli account di sistema sono stati storicamente concessi tramite la creazione di un account di accesso per gli account LocalSystem (NT AUTHORITY\SYSTEM in en-us) o NetworkService (NT AUTHORITY\NETWORK SERVICE in en-us) e concedendole le autorizzazioni di accesso. Questo metodo concede tutte le autorizzazioni di processo o di servizio in SQL, in esecuzione come account di sistema.

L'uso di un SID del servizio consente di concedere autorizzazioni a un servizio specifico. Il servizio ha accesso solo alle risorse a cui sono state concesse le autorizzazioni quando è in esecuzione. Ad esempio, se l'oggetto HealthService è in esecuzione come LocalSystem e viene concesso View Server State, l'account avrà l'autorizzazione LocalSystem a View Server State quando è in esecuzione nel contesto di HealthService. Se un altro processo tenta di accedere allo stato del server di SQL come LocalSystem, verrà negato l'accesso.

Esempi

A. Creare un SID del servizio

Il seguente comando di PowerShell creerà un SID del servizio nel servizio di stato di System Center Operations Manager.

sc.exe --% sidtype "HealthService" unrestricted

Importante

--% indica a PowerShell di interrompere l'analisi del resto del comando. Ciò è utile quando si usano comandi e applicazioni legacy.

B. Interrogare un SID del servizio

Per controllare un SID del servizio o per assicurarsi che esista un SID del servizio, eseguire il comando seguente in PowerShell.

sc.exe --% qsidtype "HealthService"

Importante

--% indica a PowerShell di interrompere l'analisi del resto del comando. Ciò è utile quando si usano comandi e applicazioni legacy.

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

L'esempio seguente crea un login per il servizio di integrità di System Center Operations Manager usando T-SQL.

CREATE LOGIN [NT SERVICE\HealthService] FROM WINDOWS
GO

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

Nell'esempio seguente viene creato un account di accesso per il servizio cluster usando T-SQL. La concessione di autorizzazioni al servizio cluster elimina direttamente la necessità di concedere autorizzazioni eccessive all'account SYSTEM.

CREATE LOGIN [NT SERVICE\ClusSvc] FROM WINDOWS
GO

E. Concedere autorizzazioni a un SID di 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

Annotazioni

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

  • SQL Server Agent non può avviare o connettersi a un servizio SQL Server
  • I programmi di installazione di SQL Server riscontrano 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 questa situazione aggiungendo il SID del servizio usando i comandi di 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, consultare la struttura SERVICE_SID_INFO.

Informazioni sulle opzioni aggiuntive disponibili durante la creazione di un account di accesso.

Per usare la Sicurezza Basata sui Ruoli con SID del servizio, leggere le informazioni sulla creazione di ruoli in SQL Server.

Informazioni sui diversi 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 Configurare account e autorizzazioni del servizio Windows.