Tutorial: Configuración de la autenticación de Active Directory con SQL Server en contenedores de Linux

Se aplica a: SQL Server - Linux

En este tutorial se explica cómo configurar SQL Server en contenedores de Linux para admitir la autenticación de Active Directory, también conocida como autenticación integrada. Para consultar una introducción, vea Autenticación de Active Directory para SQL Server en Linux.

Nota:

Para obtener la guía actual sobre la configuración de red, consulte la documentación del sistema operativo (SO).

Este tutorial consta de las tareas siguientes:

  • Instalación de adutil
  • Unión de un host de Linux a un dominio de Active Directory
  • Creación de un usuario de Active Directory para SQL Server y establecer el nombre de entidad de seguridad de servicio (SPN) mediante la herramienta adutil
  • Creación del archivo keytab del servicio SQL Server
  • Creación de los archivos mssql.conf y krb5.conf que va a usar el contenedor de SQL Server
  • Montaje de los archivos de configuración e implementación el contenedor de SQL Server
  • Creación de inicios de sesión de SQL Server basados en Active Directory mediante Transact-SQL
  • Conexión a SQL Server mediante la autenticación de Active Directory

Requisitos previos

Antes de configurar la autenticación de Active Directory, se requiere:

  • Tener un controlador de Dominio de Active Directory (Windows) en la red.
  • Instale adutil en un equipo host de Linux, que esté unido a un dominio. Siga la sección Instalación de adutil para obtener más detalles.

Implementación y preparación de contenedores

Para configurar el contenedor, necesita saber con antelación el puerto que usará el contenedor en el host. El puerto predeterminado, 1433, podría estar asignado de otra manera en el host del contenedor. En este tutorial, el puerto 5433 del host se asignará al puerto 1433 del contenedor. Para obtener más información, vea el inicio rápido Inicio rápido; Ejecución de imágenes de contenedor Linux de SQL Server con Docker.

Al registrar nombres de entidad de seguridad de servicio (SPN), puede usar el nombre de host de la máquina o el nombre del contenedor. Sin embargo, debe configurarlo de acuerdo con lo que le gustaría ver, al conectarse con el contenedor externamente.

Asegúrese de que haya una entrada de host de reenvío (A) agregada en Active Directory para la dirección IP del host de Linux, asignada al nombre del contenedor de SQL Server. En este tutorial, la dirección IP del equipo host sql1 es 10.0.0.10 y el nombre del contenedor de SQL Server es sql1. Agregue la entrada del host de reenvío en Active Directory como se muestra en la captura de pantalla. La entrada garantiza que los usuarios lleguen al host correcto cuando se conecten a sql1.contoso.com.

Captura de pantalla para agregar un registro de host.

En este tutorial, se usará un entorno en Azure con tres máquinas virtuales (VM). Una máquina virtual que actúa como controlador de dominio de Windows (DC) con el nombre de dominio contoso.com. El nombre del controlador de dominio es adVM.contoso.com. La segunda máquina es un equipo Windows denominado winbox, que ejecuta Windows 10 Desktop, que se usa como un equipo cliente y tiene instalado SQL Server Management Studio (SSMS). La tercera máquina es un equipo Ubuntu 18.04 LTS denominado sql1, en el que se hospedan los contenedores de SQL Server. Todas las máquinas se unen al dominio contoso.com. Para obtener más información, vea Unión de SQL Server en un host de Linux a un dominio de Active Directory.

Nota:

La unión del equipo contenedor host al dominio no es obligatoria, como puede ver más adelante en este artículo.

Instalación de adutil

Para instalar adutil, siga los pasos de Introducción a adutil: utilidad de Active Directory en un equipo host unido al dominio.

Creación del usuario de Active Directory, los SPN y el keytab del servicio de SQL Server

Si no quiere que el host contenedor forme parte del dominio y no ha seguido los pasos para unir el equipo al dominio, debe seguir estos pasos en otro equipo Linux que ya forme parte del dominio de Active Directory:

  1. Cree un usuario de Active Directory para SQL Server y establezca el SPN mediante la herramienta adutil.

  2. Cree y configure el archivo keytab del servicio SQL Server.

Copie el archivo mssql.keytab que se ha creado en el equipo host que va a ejecutar el contenedor de SQL Server y configure el contenedor para usar el archivo mssql.keytab copiado. Opcionalmente, también puede unir el host de Linux que ejecutará el contenedor de SQL Server al dominio de Active Directory y seguir estos pasos en el mismo equipo.

Creación de un usuario de Active Directory para SQL Server y establecimiento del nombre de entidad de seguridad de servicio con adutil

Para habilitar la autenticación de Active Directory en contenedores de SQL Server en Linux es necesario ejecutar los pasos siguientes en un equipo Linux que forme parte del dominio de Active Directory.

  1. Obtenga o renueve el vale de concesión de vales (TGT) de Kerberos mediante el comando kinit. Use una cuenta con privilegios para el comando kinit. La cuenta debe tener permiso para conectarse al dominio y también debe ser capaz de crear cuentas y SPN en el dominio.

    En este script de ejemplo, ya se ha creado un usuario denominado privilegeduser@CONTOSO.COM con privilegios en el controlador de dominio.

    kinit privilegeduser@CONTOSO.COM
    
  2. Con la herramienta adutil, cree el nuevo usuario que SQL Server utilizará como cuenta de Active Directory con privilegios.

    adutil user create --name sqluser --distname CN=sqluser,CN=Users,DC=CONTOSO,DC=COM --password 'P@ssw0rd'
    

    Las contraseñas se pueden especificar de tres maneras:

    • Marca de contraseña: --password <password>
    • Variables de entorno: ADUTIL_ACCOUNT_PWD
    • Entrada interactiva

    La prioridad de los métodos de entrada de contraseña sigue el orden de las opciones enumeradas anteriormente. Las opciones recomendadas son para proporcionar la contraseña mediante variables de entorno o entrada interactiva, ya que son más seguras en comparación con la marca de contraseña.

    Puede especificar el nombre de la cuenta mediante el nombre distintivo (-distname) como se ha mostrado antes, o también puede usar el nombre de la unidad organizativa (OU). El nombre de la unidad organizativa (--ou) tiene prioridad sobre el nombre distintivo en caso de especificar los dos. Puede ejecutar el comando siguiente para obtener más detalles:

    adutil user create --help
    
  3. Registre los SPN en el usuario creado anteriormente. Si lo prefiere, puede usar el nombre del equipo host en lugar del nombre del contenedor, en función del aspecto externo que quiera para la conexión. En este tutorial, se usa el puerto 5433 en lugar de 1433. Esta es la asignación de puerto para el contenedor. El número de puerto podría ser diferente.

    adutil spn addauto -n sqluser -s MSSQLSvc -H sql1.contoso.com -p 5433
    
    • addauto creará los SPN automáticamente, siempre y cuando haya suficientes privilegios para la cuenta kinit.
    • -n: nombre de la cuenta a la que se asignarán los SPN.
    • -s: nombre del servicio que se va a usar para generar los SPN. En este caso, es para el servicio SQL Server y, por tanto, el nombre del servicio es MSSQLSvc.
    • -H: nombre de host que se va a usar para generar los SPN. Si no se especifica, se usará el FQDN del host local. Proporcione también el FQDN del nombre del contenedor. En este caso, el nombre del contenedor es sql1 y el FQDN es sql1.contoso.com.
    • -p: puerto que se usa para generar los SPN. Si no se especifica, los SPN se generan sin un puerto. Las conexiones solo funcionarán en este caso cuando SQL Server escuche en el puerto predeterminado, 1433.

Creación del archivo keytab del servicio SQL Server

Cree el archivo keytab que contenga entradas para cada uno de los cuatro SPN creados anteriormente y una para el usuario. El archivo keytab se montará en el contenedor, por lo que se puede crear en cualquier ubicación del host. Puede cambiar esta ruta de acceso de forma segura, siempre que el keytab resultante se monte correctamente al usar docker/podman para implementar el contenedor.

Para crear el keytab para todos los SPN, se puede usar la opción createauto:

adutil keytab createauto -k /container/sql1/secrets/mssql.keytab -p 5433 -H sql1.contoso.com --password 'P@ssw0rd' -s MSSQLSvc
  • -k: ruta de acceso en la que se quiere crear el archivo mssql.keytab. En el ejemplo anterior, el directorio /container/sql1/secrets ya debe existir en el host.
  • -p: puerto que se usa para generar los SPN. Si no se especifica, los SPN se generan sin un puerto.
  • -H: nombre de host que se va a usar para generar los SPN. Si no se especifica, se usa el FQDN del host local. Proporcione también el FQDN del nombre del contenedor. En este caso, el nombre del contenedor es sql1 y el FQDN es sql1.contoso.com.
  • -s: nombre del servicio que se va a usar para generar los SPN. En este caso, es para el servicio SQL Server y, por tanto, el nombre del servicio es MSSQLSvc.
  • --password: contraseña de la cuenta de usuario de Active Directory con privilegios que se ha creado antes.
  • -e o --enctype: tipos de cifrado para la entrada de keytab. Use una lista de valores separados por comas. Si no se especifica, se presenta un mensaje interactivo.

Cuando se le ofrezca una opción para elegir los tipos de cifrado, puede elegir más de uno. En este ejemplo, se han elegido aes256-cts-hmac-sha1-96 y arcfour-hmac. Asegúrese de elegir un tipo de cifrado que sea compatible con el host y el dominio.

Si prefiere elegir el tipo de cifrado de forma no interactiva, puede especificarlo con el argumento -e en el comando anterior. Para obtener más ayuda sobre los comandos de adutil, ejecute el comando siguiente.

adutil keytab createauto --help

Precaución

arcfour-hmac es un cifrado débil y no es un tipo recomendado para usarlo en un entorno de producción.

Para crear el keytab para el usuario, el comando es el siguiente:

adutil keytab create -k /container/sql1/secrets/mssql.keytab -p sqluser --password 'P@ssw0rd'
  • -k: ruta de acceso en la que se quiere crear el archivo mssql.keytab. En el ejemplo anterior, el directorio /container/sql1/secrets ya debe existir en el host.
  • -p: entidad de seguridad que se va a agregar al keytab.

El keytab create/autocreate de adutil no sobrescribe los archivos anteriores; se anexa al archivo si ya están presentes.

Asegúrese de que el keytab que se crea tiene los permisos correctos establecidos al implementar el contenedor.

chmod 440 /container/sql1/secrets/mssql.keytab

En este momento, puede copiar el archivo mssql.keytab del host de Linux actual en el host de Linux donde se implementará el contenedor de SQL Server y seguir el resto de los pasos en el host de Linux que ejecutará el contenedor de SQL Server. Si los pasos anteriores se han realizado en el mismo host de Linux donde se implementarán los contenedores de SQL Server, siga también los pasos siguientes en el mismo host.

Creación de los archivos de configuración que va a usar el contenedor de SQL Server

  1. Cree un archivo mssql.conf con la configuración de Active Directory. Este archivo se puede crear en cualquier parte del host y se debe montar correctamente durante el comando docker run. En este ejemplo, este archivo mssql.conf se coloca en /container/sql1, que es el directorio contenedor. El contenido de mssql.conf se muestra de esta forma:

    [network]
    privilegedadaccount = sqluser
    kerberoskeytabfile = /var/opt/mssql/secrets/mssql.keytab
    
    • privilegedadaccount: usuario de Active Directory con privilegios que se usará para la autenticación de Active Directory.
    • kerberoskeytabfile: ruta de acceso en el contenedor donde se ubicará el archivo mssql.keytab.
  2. Cree un archivo krb5.conf, como el ejemplo siguiente. En estos archivos es importante el uso de mayúsculas y minúsculas.

    [libdefaults]
    default_realm = CONTOSO.COM
    
    [realms]
    CONTOSO.COM = {
        kdc = adVM.contoso.com
        admin_server = adVM.contoso.com
        default_domain = CONTOSO.COM
    }
    
    [domain_realm]
    .contoso.com = CONTOSO.COM
    contoso.com = CONTOSO.COM
    
  3. Copie todos los archivos, mssql.conf, krb5.conf y mssql.keytab, en una ubicación que se montará en el contenedor de SQL Server. En este ejemplo, estos archivos se colocan en el host en las siguientes ubicaciones: mssql.conf y krb5.conf en /container/sql1/. mssql.keytab se coloca en la ubicación /container/sql1/secrets/.

  4. Asegúrese de que hay permisos suficientes en estas carpetas para el usuario que ejecuta el comando docker/podman. Cuando se inicia el contenedor, el usuario necesita acceso a la ruta de acceso a la carpeta creada. En este ejemplo, proporcionamos los siguientes permisos proporcionados a la ruta de acceso a la carpeta:

    sudo chmod 755 /container/sql1/
    

Montaje de los archivos de configuración e implementación del contenedor de SQL Server

Ejecute el contenedor de SQL Server y monte los archivos de configuración correctos de Active Directory que se han creado antes:

Importante

La variable de entorno SA_PASSWORD está en desuso. En su lugar, use MSSQL_SA_PASSWORD.

sudo docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong@Passw0rd>" \
-p 5433:1433 --name sql1 \
-v /container/sql1:/var/opt/mssql \
-v /container/sql1/krb5.conf:/etc/krb5.conf \
-d mcr.microsoft.com/mssql/server:2019-latest

Nota:

Al ejecutar el contenedor en LSM (Módulo de seguridad de Linux) como hosts habilitados para SELinux, debe montar los volúmenes con la opción Z, que indica a Docker que etiquete el contenido con una etiqueta privada sin compartir. Para obtener más información, vea Configuración de la etiqueta de Linux SE.

El ejemplo contendrá los comandos siguientes:

sudo docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=P@ssw0rd" -p 5433:1433 --name sql1 \
-v /container/sql1:/var/opt/mssql/ \
-v /container/sql1/krb5.conf:/etc/krb5.conf \
--dns-search contoso.com \
--dns 10.0.0.4 \
--add-host adVM.contoso.com:10.0.0.4 \
--add-host contoso.com:10.0.0.4 \
--add-host contoso:10.0.0.4 \
-d mcr.microsoft.com/mssql/server:2019-latest
  • Los archivos mssql.conf y krb5.conf se encuentran en la ruta de acceso del archivo de host /container/sql1.
  • La instancia de mssql.keytab que se ha creado se encuentra en la ruta de acceso del archivo de host /container/sql1/secrets.
  • Como el equipo host está en Azure, es necesario anexar los detalles de Active Directory al comando docker run en el mismo orden. En el ejemplo, el controlador de dominio adVM está en el dominio contoso.com, con una dirección IP de 10.0.0.4. El controlador de dominio ejecuta DNS y KDC.

Creación de inicios de sesión de SQL Server basados en Active Directory mediante Transact-SQL

Conexión al contenedor de SQL Server Con los siguientes comandos, cree el inicio de sesión y confirme que existe. Puede ejecutar este comando desde un equipo cliente (Windows o Linux) que ejecute SSMS, Azure Data Studio o cualquier otra herramienta de la interfaz de la línea de comandos (CLI).

CREATE LOGIN [contoso\amvin] FROM WINDOWS;

SELECT name FROM sys.server_principals;

Conexión a SQL Server mediante la autenticación de Active Directory

Para conectarse mediante SQL Server Management Studio (SSMS) o Azure Data Studio, inicie sesión en SQL Server con las credenciales de Windows con el nombre y el número de puerto de SQL Server (el nombre podría ser el del contenedor o el del host). En el ejemplo, el nombre del servidor sería sql1.contoso.com,5433.

También puede usar una herramienta como sqlcmd para conectarse a SQL Server en el contenedor.

sqlcmd -E -S 'sql1.contoso.com,5433'

Recursos