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
ykrb5.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
.
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:
Cree un usuario de Active Directory para SQL Server y establezca el SPN mediante la herramienta adutil.
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.
Obtenga o renueve el vale de concesión de vales (TGT) de Kerberos mediante el comando
kinit
. Use una cuenta con privilegios para el comandokinit
. 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
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
- Marca de contraseña:
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 de1433
. 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 essql1
y el FQDN essql1.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 archivomssql.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 essql1
y el FQDN essql1.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 archivomssql.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
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 archivomssql.conf
se coloca en/container/sql1
, que es el directorio contenedor. El contenido demssql.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 archivomssql.keytab
.
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
Copie todos los archivos,
mssql.conf
,krb5.conf
ymssql.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
ykrb5.conf
en/container/sql1/
.mssql.keytab
se coloca en la ubicación/container/sql1/secrets/
.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
ykrb5.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 dominioadVM
está en el dominiocontoso.com
, con una dirección IP de10.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
- Descripción de la autenticación de Active Directory para SQL Server en Linux y contenedores
- Solución de problemas de la autenticación de Active Directory para SQL Server en Linux y contenedores