Tutorial: Uso de la autenticación de Active Directory con SQL Server en Linux
Se aplica a:
SQL Server (todas las versiones admitidas): Linux
En este tutorial se explica cómo configurar SQL Server en Linux para admitir la autenticación de Active Directory (AD), también conocida como autenticación integrada. Para consultar una introducción, vea Autenticación de Active Directory para SQL Server en Linux.
Este tutorial consta de las tareas siguientes:
- Unión del host de SQL Server con el dominio de AD
- Creación del usuario de AD para SQL Server y establecimiento del SPN
- Configuración del archivo keytab del servicio SQL Server
- Protección del archivo keytab
- Configuración de SQL Server para usar el archivo keytab para la autenticación Kerberos
- Creación de inicios de sesión basados en AD en Transact-SQL
- Conexión con SQL Server mediante la autenticación de AD
Prerrequisitos
Antes de configurar la autenticación de AD, debe hacer lo siguiente:
- Configurar un controlador de dominio de AD (Windows) en la red.
- Instalar SQL Server
Unión del host de SQL Server con el dominio de AD
Una el host Linux de SQL Server con un controlador de dominio de Active Directory. Para obtener información sobre cómo unir un dominio de Active Directory, consulte Unión de SQL Server en un host de Linux a un dominio de Active Directory.
Creación del usuario de AD (o MSA) para SQL Server y establecimiento del SPN
Nota
En los siguientes pasos se usa el nombre de dominio completo. Si está en Azure, debe crear uno para poder continuar.
En el controlador de dominio, ejecute el comando de PowerShell New-ADUser para crear un usuario de AD con una contraseña que no expire nunca. En el ejemplo siguiente se asigna el nombre
sqlsvca la cuenta, pero el nombre de la cuenta puede ser el que quiera. Se le pedirá que escriba una contraseña nueva para la cuenta.Import-Module ActiveDirectory New-ADUser sqlsvc -AccountPassword (Read-Host -AsSecureString "Enter Password") -PasswordNeverExpires $true -Enabled $trueNota
Es un procedimiento de seguridad recomendado tener una cuenta de AD dedicada para SQL Server, de modo que las credenciales de SQL Server no se compartan con otros servicios que usen la misma cuenta. En cambio, si quiere puede volver a usar una cuenta de AD existente si conoce su contraseña (que es necesaria para generar un archivo keytab en el paso siguiente). Además, la cuenta debe estar habilitada para admitir el cifrado AES de Kerberos de 128 y 256 bits (atributo msDS-SupportedEncryptionTypes) en la cuenta de usuario. Para validar que la cuenta está habilitada para el cifrado AES, busque la cuenta en la utilidad Usuarios y equipos de Active Directory y seleccione Propiedades. Busque la pestaña Cuentas en las Propiedades y compruebe que estén activadas las dos casillas de verificación siguientes.
Esta cuenta admite cifrado AES de Kerberos de 128 bits
Esta cuenta admite cifrado AES de Kerberos de 256 bits
Establezca el ServicePrincipalName (SPN) de esta cuenta mediante la herramienta setspn.exe. El SPN debe tener el formato exacto que se especifica en el ejemplo siguiente. Para buscar el nombre de dominio completo del equipo host de SQL Server, ejecute
hostname --all-fqdnsen el host de SQL Server. El puerto TCP debe ser 1433 a menos que haya configurado SQL Server para usar otro número de puerto.setspn -A MSSQLSvc/<fully qualified domain name of host machine>:<tcp port> sqlsvc setspn -A MSSQLSvc/<netbios name of the host machine>:<tcp port> sqlsvcNota
Si recibe el error
Insufficient access rights, pídale al administrador del dominio que compruebe si tiene permisos suficientes para establecer un SPN en esta cuenta. La cuenta que se usa para registrar un SPN necesitará los permisos Escribir nombreEntidadDeServicio. Para obtener más información, vea Registrar un nombre de entidad de seguridad de servicio para las conexiones con Kerberos.Si cambia el puerto TCP en el futuro, debe volver a ejecutar el comando setspn con el nuevo número de puerto. También debe seguir los pasos de la siguiente sección para agregar el nuevo SPN al archivo keytab del servicio SQL Server.
Para obtener más información, vea Registrar un nombre de entidad de seguridad de servicio para las conexiones con Kerberos.
Configuración del archivo keytab del servicio SQL Server
La configuración de la autenticación de AD para SQL Server en Linux requiere una cuenta de AD (MSA o una cuenta de usuario de AD) y el SPN creado en la sección anterior.
Importante
Si se cambia la contraseña de la cuenta de AD o la de la cuenta a la que se asignan los SPN, tendrá que actualizar el archivo keytab con la nueva contraseña y el número de versión de la clave (KVNO). Algunos servicios también pueden rotar las contraseñas automáticamente. Consulte las directivas de rotación de contraseñas de las cuentas en cuestión y adáptelas a las actividades de mantenimiento programado para evitar tiempos de inactividad inesperados.
Entradas del archivo keytab de SPN
Compruebe el número de versión de la clave (KVNO) de la cuenta de AD creada en el paso anterior. Suele ser 2, pero podría ser otro entero si ha cambiado la contraseña de la cuenta varias veces. En el equipo host de SQL Server, ejecute los siguientes comandos:
- En los ejemplos siguientes se supone que
userestá en el dominio@CONTOSO.COM. Cambie el nombre de usuario y de dominio por los suyos.
kinit user@CONTOSO.COM kvno user@CONTOSO.COM kvno MSSQLSvc/<fully qualified domain name of host machine>:<tcp port>@CONTOSO.COMNota
Los SPN pueden tardar varios minutos en propagarse por el dominio, sobre todo si el dominio es grande. Si recibe el error
kvno: Server not found in Kerberos database while getting credentials for MSSQLSvc/<fully qualified domain name of host machine>:<tcp port>@CONTOSO.COM, espere unos minutos y vuelva a intentarlo.
Los comandos anteriores solo funcionarán si el servidor se ha unido a un dominio de AD, lo que se ha descrito en la sección anterior.- En los ejemplos siguientes se supone que
Con ktpass, agregue entradas de archivo keytab para cada SPN mediante los comandos siguientes en un símbolo del sistema del equipo Windows:
<DomainName>\<UserName>: puede ser una cuenta de usuario de MSA o de AD.@CONTOSO.COM: use el nombre de dominio./kvno <#>: reemplace<#>por el valor KVNO obtenido en un paso anterior.<StrongPassword>: use una contraseña segura.
ktpass /princ MSSQLSvc/<fully qualified domain name of host machine>:<tcp port>@CONTOSO.COM /ptype KRB5_NT_PRINCIPAL /crypto aes256-sha1 /mapuser <DomainName>\<UserName> /out mssql.keytab -setpass -setupn /kvno <#> /pass <StrongPassword> ktpass /princ MSSQLSvc/<fully qualified domain name of host machine>:<tcp port>@CONTOSO.COM /ptype KRB5_NT_PRINCIPAL /crypto rc4-hmac-nt /mapuser <DomainName>\<UserName> /in mssql.keytab /out mssql.keytab -setpass -setupn /kvno <#> /pass <StrongPassword> ktpass /princ MSSQLSvc/<netbios name of the host machine>:<tcp port>@CONTOSO.COM /ptype KRB5_NT_PRINCIPAL /crypto aes256-sha1 /mapuser <DomainName>\<UserName> /in mssql.keytab /out mssql.keytab -setpass -setupn /kvno <#> /pass <StrongPassword> ktpass /princ MSSQLSvc/<netbios name of the host machine>:<tcp port>@CONTOSO.COM /ptype KRB5_NT_PRINCIPAL /crypto rc4-hmac-nt /mapuser <DomainName>\<UserName> /in mssql.keytab /out mssql.keytab -setpass -setupn /kvno <#> /pass <StrongPassword> ktpass /princ <UserName>@CONTOSO.COM /ptype KRB5_NT_PRINCIPAL /crypto aes256-sha1 /mapuser <DomainName>\<UserName> /in mssql.keytab /out mssql.keytab -setpass -setupn /kvno <#> /pass <StrongPassword> ktpass /princ <UserName>@CONTOSO.COM /ptype KRB5_NT_PRINCIPAL /crypto rc4-hmac-nt /mapuser <DomainName>\<UserName> /in mssql.keytab /out mssql.keytab -setpass -setupn /kvno <#> /pass <StrongPassword>Nota
Los comandos anteriores permiten los codificadores de cifrado AES y RC4 para la autenticación de AD. RC4 es un codificador de cifrado más antiguo y, si se requiere un mayor grado de seguridad, puede optar por crear las entradas del archivo keytab solo con el codificador de cifrado AES. Las dos últimas entradas
UserNamedeben estar en minúsculas, o es posible que se produzca un error en la autenticación del permiso.Después de ejecutar el comando anterior, debe tener un archivo keytab denominado mssql.keytab. Copie el archivo en la carpeta
/var/opt/mssql/secretsdel equipo en el que se ejecute SQL Server.Proteja el archivo keytab.
Cualquier persona con acceso a este archivo keytab puede suplantar SQL Server en el dominio, por lo que debe asegurarse de restringir el acceso al archivo de forma que solo la cuenta mssql tenga acceso de lectura:
sudo chown mssql:mssql /var/opt/mssql/secrets/mssql.keytab sudo chmod 400 /var/opt/mssql/secrets/mssql.keytabLa opción de configuración siguiente se debe establecer con la herramienta mssql-conf para especificar la cuenta que se va a usar al acceder al archivo keytab.
sudo mssql-conf set network.privilegedadaccount <username>Nota
Incluya solo el nombre de usuario, no el nombre de dominio\nombre de usuario ni username@domain. De forma interna, SQL Server agrega el nombre de dominio según sea necesario junto con este nombre de usuario cuando se usa.
Siga los pasos que se indican a continuación para configurar SQL Server a fin de empezar a usar el archivo keytab para la autenticación Kerberos.
sudo mssql-conf set network.kerberoskeytabfile /var/opt/mssql/secrets/mssql.keytab sudo systemctl restart mssql-serverSugerencia
Opcionalmente, deshabilite las conexiones UDP al controlador de dominio para mejorar el rendimiento. En muchos casos, se produce un error coherente en las conexiones UDP al conectarse a un controlador de dominio, por lo que puede establecer opciones de configuración en /etc/krb5.conf para omitir las llamadas a UDP. Edite /etc/krb5.conf y establezca las siguientes opciones:
/etc/krb5.conf [libdefaults] udp_preference_limit=0
En este momento, ya puede usar el inicio de sesión basado en AD en SQL Server.
Creación de inicios de sesión basados en AD en Transact-SQL
Conéctese a SQL Server y cree un inicio de sesión basado en AD:
CREATE LOGIN [CONTOSO\user] FROM WINDOWS;Compruebe que el inicio de sesión aparece en la vista del catálogo del sistema sys.server_principals:
SELECT name FROM sys.server_principals;
Conexión con SQL Server mediante la autenticación de AD
Inicie sesión en un equipo cliente con sus credenciales de dominio. Ya puede conectarse a SQL Server sin volver a escribir la contraseña mediante la autenticación de AD. Si crea un inicio de sesión para un grupo de AD, cualquier usuario de AD que pertenezca a ese grupo podrá conectarse de la misma manera.
El parámetro de cadena de conexión específico para que los clientes usen la autenticación de AD depende del controlador que esté usando. Fíjese en los ejemplos de las secciones siguientes.
sqlcmd en un cliente Linux unido a un dominio
Inicie sesión en un cliente Linux unido a un dominio con ssh y sus credenciales de dominio:
ssh -l user@contoso.com client.contoso.com
Asegúrese de que ha instalado el paquete mssql-tools y después conéctese con sqlcmd sin especificar ninguna credencial:
sqlcmd -S mssql-host.contoso.com
A diferencia de SQL para Windows, la autenticación Kerberos funciona para la conexión local en SQL para Linux. Sin embargo, sigue siendo necesario proporcionar el FQDN del host de SQL para Linux. Asimismo, la autenticación de AD no funcionará si se intenta conectar a ".", "localhost", "127.0.0.1", etc.
SSMS en un cliente Windows unido a un dominio
Inicie sesión en un cliente Windows unido a un dominio con sus credenciales de dominio. Asegúrese de que SQL Server Management Studio esté instalado y luego conéctese a su instancia de SQL Server (por ejemplo, mssql-host.contoso.com) al especificar Autenticación de Windows en el cuadro de diálogo Conectar al servidor.
Autenticación de AD con otros controladores de cliente
En la tabla siguiente se describen las recomendaciones de otros controladores de cliente:
| Controlador de cliente | Recomendación |
|---|---|
| JDBC | Use la autenticación integrada Kerberos para conectarse con SQL Server. |
| ODBC | Use la autenticación integrada. |
| ADO.NET | Sintaxis de la cadena de conexión. |
Opciones de configuración adicionales
Si usa utilidades de terceros como PBIS, VAS o Centrify para unir el host de Linux con el dominio de AD y quiere forzar que SQL server use la biblioteca openldap directamente, puede configurar la opción disablesssd con mssql-conf de la siguiente forma:
sudo mssql-conf set network.disablesssd true
systemctl restart mssql-server
Nota
Hay utilidades como realmd que configuran SSSD, mientras que otras herramientas como PBI, VAS y Centrify no configuran SSSD. Si la utilidad que ha usado para unirse al dominio de AD no configura SSSD, se recomienda configurar la opción disablesssd en true. Aunque no es necesario ya que SQL Server intentará usar SSSD para AD antes de revertir al mecanismo de openldap, sería más eficaz configurarlo para que SQL Server haga que las llamadas a openldap omitan directamente el mecanismo de SSSD.
Si su controlador de dominio admite LDAPS, puede forzar que todas las conexiones de SQL Server a los controladores de dominio sean a través de LDAPS. Para comprobar si el cliente puede ponerse en contacto con el controlador de dominio mediante LDAPS, ejecute el siguiente comando de Bash: ldapsearch -H ldaps://contoso.com:3269. Para establecer SQL Server para que solo use LDAPS, ejecute lo siguiente:
sudo mssql-conf set network.forcesecureldap true
systemctl restart mssql-server
De esta forma, se usará LDAPS antes que SSSD si la unión a un dominio de AD en el host se ha realizado mediante el paquete SSSD y disablesssd no está establecido en true. Si disablesssd está establecido en true y forcesecureldap está establecido en true, usará el protocolo LDAPS antes que las llamadas a la biblioteca openldap realizadas por SQL Server.
A partir de SQL Server 2017 CU14
A partir de SQL Server 2017 CU14, si SQL Server se ha unido a un controlador de dominio de AD mediante proveedores de terceros y está configurado para usar llamadas a openldap para la búsqueda general de AD al establecer disablesssd en true, también puede usar la opción enablekdcfromkrb5 para forzar que SQL Server use la biblioteca krb5 para la búsqueda de KDC en lugar de la búsqueda inversa de DNS para el servidor de KDC.
Esto puede ser útil para el escenario en el que quiere configurar manualmente los controladores de dominio con los que SQL Server intenta comunicarse. Para usar el mecanismo de la biblioteca openldap, se utiliza la lista de KDC de krb5.conf.
Primero, establezca disablesssd y enablekdcfromkrb5conf en "true" y, después, reinicie SQL Server:
sudo mssql-conf set network.disablesssd true
sudo mssql-conf set network.enablekdcfromkrb5conf true
systemctl restart mssql-server
Luego, configure la lista de KDC en /etc/krb5.conf como se indica a continuación:
[realms]
CONTOSO.COM = {
kdc = dcWithGC1.contoso.com
kdc = dcWithGC2.contoso.com
}
Nota
Aunque no se recomienda, es posible usar utilidades, como realmd, que configuran SSSD a la vez que unen el host de Linux al dominio, al mismo tiempo que se configura disablesssd en true para que SQL Server use las llamadas a openldap en lugar de SSSD para las llamadas relacionadas con Active Directory.
Nota
No se admite el inicio de sesión de SQL Server mediante un nombre de dominio completo (FQDN), (por ejemplo, CONTOSO.COM\Nombre de usuario). Use el formato CONTOSO\Nombre de usuario.
No se admiten inicios de sesión de SQL Server desde grupos locales de dominio. En vez de estos, debe usar grupos de dominio de seguridad global.
Pasos siguientes
En este tutorial, se ha descrito cómo configurar la autenticación de Active Directory con SQL Server en Linux. Ha aprendido a:
- Unión del host de SQL Server con el dominio de AD
- Creación del usuario de AD para SQL Server y establecimiento del SPN
- Configuración del archivo keytab del servicio SQL Server
- Creación de inicios de sesión basados en AD en Transact-SQL
- Conexión con SQL Server mediante la autenticación de AD
Explore ahora otros escenarios de seguridad para SQL Server en Linux.