Recientemente, trabajando en uno de nuestros proyectos, realizando uno de nuestros habituales chequeos nos topamos con que en el error log de una de las instancias presentaba el siguiente mensaje al arrancar el servicio:
ERRORLOG Windows return code: 0x200b, state: 15: The SQL Server Network Interface library could not register the Service Principal Name (SPN)
Siendo el detalle del mismo:
Este error aparece cuando no se ha registrado el SPN por lo que la autenticación no pueda usar KERBEROS.
Entonces, ¿por qué nos ha permitido conectarnos?
La respuesta es que en caso de fallar ese tipo de autenticación se recurre a la autenticación NTML y es por eso que llegamos a conectarnos a nuestro servidor SQL Server. Por parte de Microsoft se recomienda por seguridad utilizar KERBEROS.
Para comprobar que la autenticación se ha utilizado podemos ejecutar este código T-SQL:
select session_id, net_transport, client_net_address, auth_scheme from sys.dm_exec_connections
Para solucionar esto debemos registrar el SPN.
¿Qué es el SPN (Service Principal Name)?
Es un ID único vinculado a servicios en los servidores. Este SPN es utilizado en la autenticación Kerberos. Con el SPN los clientes pueden identificar un servicio en la red.
¿Dónde se almacena?
Para registrar un SPN el equipo y el servidor deben estar en el mismo dominio Windows o dominio de confianza. Este registro se guarda en el Active Directory.
Métodos para registrar un SPN
Existen dos métodos para registrar los SPN, de manera automática y manual.
- Registro automático: (No recomendado)
Al iniciar la instancia de Sql Server se intenta registrar el SPN del servicio. Igualmente se intenta borrar ese registro cuando se detiene la instancia.
Para que pueda añadir y eliminar un registro SPN la cuenta de servicio debe tener permisos de lectura y escritura en ServicePrincipalName y la opción Validated write to service principal name como os mostramos aquí:
También necesitamos dar los siguientes permisos a la cuenta de servicio:
- Read & Write personal information
Es importante tener en cuenta que, igual que se añaden los SPN al iniciar el servicio, cuando se para los registros SPN desaparecen.
- Registro manual
Para el registro manual se debe usar el comando Setspn
En caso de Sql Server suele ser necesario dar de alta dos registros a través de PowerShell:
setspn -A MSSQLSvc/nombredelamaquina.dominio dominio\nombredelacuenta
setspn -A MSSQLSvc/nombredelamaquina.dominio:1433 dominio\nombredelacuenta
En caso de que estemos trabajando con una instancia con nombre se debe añadir :nombredelainstancia al final de la dirección del servicio:
setspn -A MSSQLSvc/nombredelamaquina.dominio:nombredelainstancia dominio\nombredelacuenta
Como podéis comprobar el segundo es idéntico al primero, pero añadiendo el puerto.
A diferencia de lo que pasa en el registro automático, los registros no se borran al parar el servicio.
No está permitido registrar un mismo SPN a dos cuentas. Si ya existe ese registro y no es válido debemos borrarlo antes de dar de alta el nuevo con este código:
setspn -D MSSQLSvc/dominio dominio\nombredelacuenta
Una vez que el SPN este correctamente registrado el mensaje nos lo confirmará:
The SQL Server Network Interface library successfully registered the Service Principal Name (SPN) [ MSSQLSvc/ Namemachine.domain:1433 ] for the SQL Server service.
¿Ha encontrado errores similares en tus errolog? ¿Cómo los arreglaste? ¿Te ha servido nuestra entrada? Coméntanos.