Compartir vía


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

SQL Server usa identificadores de seguridad por servicio (SID), también denominados entidades de seguridad de servicio, para permitir que los permisos se concedan directamente a un servicio específico. SQL Server usa este método para conceder permisos a los servicios de motor y agente (NT SERVICE\MSSQL$<InstanceName> y NT SERVICE\SQLAGENT$<InstanceName> respectivamente). Con este método, esos servicios solo pueden acceder al motor de base de datos cuando se ejecutan los servicios. Para obtener más información, consulte KB2620201 (vínculo de archivo).

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

Ejemplos de servicios en los que se puede usar un SID de servicio son:

  • Servicio de Salud 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 tienen un SID de servicio de forma predeterminada. El SID de servicio debe crearse mediante SC.exe. Los administradores de Microsoft System Center Operations Manager han adoptado este método para conceder permiso a HealthService en SQL Server.

Una vez que se haya creado y confirmado el SID del servicio, se le debe conceder permiso en SQL Server. La concesión de permisos se realiza mediante la creación de un inicio de sesión de Windows mediante SQL Server Management Studio (SSMS) o una consulta de Transact-SQL. Una vez creado el inicio de sesión, se pueden conceder permisos, agregarlos a roles y asignarlos a bases de datos como cualquier otro inicio de sesión.

Sugerencia

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

Security

Eliminación de cuentas de servicio

Tradicionalmente, se han usado cuentas de servicio para permitir que los servicios inicien sesión en SQL Server. Las cuentas de servicio agregan una capa adicional de complejidad de administración debido a tener que mantener y actualizar periódicamente la contraseña de la cuenta de servicio. Además, las credenciales de una cuenta de servicio podrían ser utilizadas por una persona que intenta enmascarar sus actividades al realizar acciones en la instancia.

Permisos granulares para cuentas del sistema

Históricamente se han concedido permisos a las cuentas del sistema 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 conceder esos permisos de inicio de sesión. Este método concede permisos de proceso o servicio a SQL, que se ejecuta como una cuenta del sistema.

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

Examples

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 que deje de analizar el resto del comando. Esto resulta útil cuando se usan comandos y aplicaciones heredados.

B. Consulta de un SID de servicio

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

sc.exe --% qsidtype "HealthService"

Importante

--% indica a PowerShell que deje de analizar el resto del comando. Esto resulta útil cuando se usan comandos y aplicaciones heredados.

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

En el ejemplo siguiente se crea un inicio de sesión para el servicio de estado de System Center Operations Manager mediante T-SQL.

CREATE LOGIN [NT SERVICE\HealthService] FROM WINDOWS
GO

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

En el ejemplo siguiente se crea un inicio de sesión para el servicio de clúster mediante T-SQL. La concesión de permisos al servicio de clúster elimina directamente la necesidad de conceder permisos excesivos a la cuenta SYSTEM.

CREATE LOGIN [NT SERVICE\ClusSvc] FROM WINDOWS
GO

E. Conceder permisos a un SID de servicio

Conceda los permisos necesarios para administrar grupos de disponibilidad en 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:

Quitar los SID(s) de servicio de los inicios de sesión o retirarlos del rol de servidor sysadmin puede provocar problemas a varios componentes de SQL Server que se conectan al motor de la base de datos de SQL Server. Algunos problemas incluyen lo siguiente:

  • El Agente SQL Server no puede iniciar ni conectarse a un servicio de 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

Para una instancia predeterminada de SQL Server, puede corregir esta situación agregando el SID de 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, use 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, lea estructura SERVICE_SID_INFO.

Obtenga información sobre las opciones adicionales que están disponibles al crear un inicio de sesión.

Para usar la seguridad basada en roles con SID de servicios, lea sobre cómo crear roles en SQL Server.

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

Para obtener más información sobre cómo configurar cuentas de servicio para SQL Server, consulte Configurar cuentas y permisos de servicio de Windows.