Uso de SID de servicio para conceder permisos a servicios en SQL Server

SQL Server usa identificadores de seguridad (SID) por servicio (también conocidos como "entidad de seguridad de servicio" [SID]) para permitir la concesión de los permisos directamente a un servicio específico. Este método lo usa SQL Server para conceder permisos a los servicios de motor y agente (NT SERVICE\MSSQL$<InstanceName> and NT SERVICE\SQLAGENT$<InstanceName>, respectivamente). Con este método, estos servicios pueden acceder al motor de base de datos solo cuando se ejecutan los servicios. Para obtener más información, vea KB2620201 (vínculo archivado).

Este mismo método se puede usar cuando se conceden permisos a otros servicios. El uso de un SID de servicio elimina la sobrecarga de administrar y mantener las cuentas de servicio y proporciona un control más granular y más preciso sobre los permisos concedidos a los recursos del sistema.

Ejemplos de servicios donde se puede usar un SID de servicio:

  • Servicio de mantenimiento de System Center Operations Manager (NT SERVICE\HealthService)
  • Servicio de Clústeres de conmutación por error de Windows Server (WSFC) (NT SERVICE\ClusSvc)

Algunos servicios no disponen de un SID de servicio de forma predeterminada. El SID de servicio debe crearse con SC.exe. Este método lo han adoptado los administradores de Microsoft System Center Operations Manager a fin de conceder permiso para el Servicio de mantenimiento en SQL Server.

Una vez se haya creado y confirmado el servicio de SID, se debe conceder permiso en SQL Server. La concesión de permisos se lleva a cabo mediante la creación de un inicio de sesión en Windows con SQL Server Management Studio (SSMS) o una consulta. Una vez creado el inicio de sesión, se le pueden conceder permisos, agregar a roles y asignar a bases de datos al igual que cualquier otro inicio de sesión.

Sugerencia

Si se recibe el error Login failed for user 'NT AUTHORITY\SYSTEM', compruebe que existe el SID de servicio para el servicio deseado, que el inicio de sesión de SID de servicio se ha creado en SQL Server y que se han concedido los permisos adecuados para el SID de servicio en SQL Server.

Seguridad

Eliminación de cuentas de servicio

Tradicionalmente, las cuentas de servicio se han usado para permitir que los servicios inicien sesión en SQL Server. Las cuentas de servicio agregan una capa adicional de complejidad de administración ya que tienen que mantener y actualizar con frecuencia la contraseña de la cuenta de servicio. Además, las credenciales de la cuenta de servicio las podría usar una persona que intentara ocultar sus actividades cuando realizara acciones en la instancia.

Permisos granulares a las cuentas del sistema

Las cuentas del sistema históricamente han concedido permisos mediante la creación de un inicio de sesión para las cuentas LocalSystem (NT AUTHORITY\SYSTEM en en-us) o NetworkService ( NT AUTHORITY\NETWORK SERVICE en en-us) y la concesión de esos permisos de los inicios de sesión. Este método concede cualquier permiso de proceso o servicio en SQL, que se ejecuta como una cuenta del sistema.

El uso de un SID de servicio permite que los permisos se concedan a un servicio específico. El servicio solo tiene acceso a los recursos cuyos permisos se le han concedido cuando se está ejecutando. Por ejemplo, si la HealthService se está ejecutando como LocalSystem y se le concede View Server State, la cuenta LocalSystem solo tendrá permiso para View Server State cuando se esté ejecutando en el contexto de la HealthService. Si cualquier otro proceso intenta acceder al estado del servidor de SQL como LocalSystem, se le denegará el acceso.

Ejemplos

A Creación de un SID de servicio

El siguiente comando de PowerShell creará un SID de servicio en el servicio de mantenimiento de System Center Operations Manager.

sc.exe --% sidtype "HealthService" unrestricted

Importante

--% indica a PowerShell detener el análisis del resto del comando. Esto es útil cuando se usan comandos y aplicaciones heredados.

B. Realización de una consulta de un SID de servicio

Para comprobar un SID de servicio o para garantizar que un SID de servicio existe, ejecute el siguiente comando en PowerShell.

sc.exe --% qsidtype "HealthService"

Importante

--% indica a PowerShell detener el análisis del resto del comando. Esto es útil cuando se usan comandos y aplicaciones heredados.

C. Adición de un SID de servicio recién creado como un inicio de sesión

El ejemplo siguiente crea un inicio de sesión para el servicio de mantenimiento de System Center Operations Manager con T-SQL.

CREATE LOGIN [NT SERVICE\HealthService] FROM WINDOWS
GO

D. Adición de un SID de servicio existente como un inicio de sesión

El ejemplo siguiente crea un inicio de sesión para el servicio de clúster con T-SQL. La concesión directa de permisos al servicio de clúster elimina la necesidad de conceder permisos excesivos para la cuenta del SISTEMA.

CREATE LOGIN [NT SERVICE\ClusSvc] FROM WINDOWS
GO

E. Concesión de permisos al SID de servicio

Conceda los permisos necesarios con el fin de administrar grupos de disponibilidad para el servicio de clúster.

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:

Si se quitan los inicios de sesión de SID de servicio o se quitan del rol de servidor sysadmin, pueden producirse problemas en varios componentes de SQL Server que se conectan al Motor de base de datos SQL Server. Entre los problemas se incluyen los siguientes:

  • El Agente SQL Server no puede iniciarse o conectarse a un servicio SQL Server.
  • Los programas de instalación de SQL Server encuentran el problema que se menciona en el siguiente artículo de Microsoft Knowledge Base: https://mskb.pkisolutions.com/kb/955813.

En el caso de una instancia predeterminada de SQL Server, puede corregir esta situación agregando el SID del servicio mediante los siguientes comandos de 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 una instancia con nombre de SQL Server, utilice los siguientes comandos de 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]

En este ejemplo, SQL2019 es el nombre de instancia de SQL Server.

Pasos siguientes

Para obtener más información sobre la estructura de SID de servicio, consulte Estructura de SERVICE_SID_INFO.

Obtenga información sobre las opciones adicionales que están disponibles cuando se crea un inicio de sesión.

Para usar seguridad basada en roles con los SID de servicio, obtenga información sobre crear roles en SQL Server.

Obtenga información sobre diferentes formas de conceder permisos a SID de servicio en SQL Server.

Para más información sobre la configuración de cuentas de servicio para SQL Server, vea Configuración de permisos y cuentas de servicio de Windows.