Tutorial: Configurar a autenticação do Active Directory com contêineres do SQL Server em Linux
Aplica-se a: SQL Server – Linux
Este tutorial explica como configurar contêineres do SQL Server em Linux para dar suporte à autenticação do Active Directory, também conhecida como autenticação integrada. Para obter uma visão geral, confira Autenticação do Active Directory para SQL Server em Linux.
Observação
Para obter diretrizes atuais sobre configuração de rede, consulte a documentação do sistema operacional (SO).
Este tutorial é composto pelas seguintes etapas:
- Instalar o adutil
- Ingressar host do Linux em domínio do Active Directory
- Criar um usuário do Active Directory para SQL Server e definir o SPN (nome da entidade de serviço) usando a ferramenta adutil
- Criar o arquivo keytab do serviço SQL Server
- Criar os arquivos
mssql.conf
ekrb5.conf
a serem usados pelo contêiner do SQL Server - Montar os arquivos de configuração e implantar o contêiner de SQL Server
- Criar logons do SQL Server baseados no Active Directory usando Transact-SQL
- Conectar-se ao SQL Server usando a autenticação do Active Directory
Pré-requisitos
Os itens a seguir são necessários antes de configurar a autenticação do Active Directory:
- Ter um controlador de domínio do Active Directory (Windows) em sua rede.
- Instalar o adutil em um computador host Linux que esteja associado a um domínio. Siga a seção Instalar adutil para obter detalhes.
Preparação e implantação de contêiner
Para configurar seu contêiner, você precisa saber com antecedência a porta que será usada pelo contêiner no host. A porta padrão, 1433
, pode ser mapeada de forma diferente no host do contêiner. Para este tutorial, a porta 5433
do host será mapeada para a porta 1433
do contêiner. Para obter mais informações, consulte nosso início rápido, Início rápido: executar imagens de contêiner do SQL Server Linux com Docker.
Ao registrar SPN (Nomes de Entidades de Serviço), você pode usar o nome do host do computador ou o nome do contêiner. No entanto, você deve configurá-lo de acordo com o que gostaria de ver ao se conectar externamente ao contêiner.
Verifique se há uma entrada de host de encaminhamento (A
) adicionada no Active Directory para o endereço IP do host Linux, mapeando para o nome do contêiner do SQL Server. Neste tutorial, o endereço IP do computador host sql1
é 10.0.0.10
e o nome do contêiner do SQL Server é sql1
. Adicione a entrada do host de encaminhamento no Active Directory, conforme mostrado na captura de tela. A entrada garante que, quando os usuários se conectarem a sql1.contoso.com
, o host correto será atingido.
Para este tutorial, estamos usando um ambiente no Azure com três VMs (máquinas virtuais). Uma VM que atua como o DC (controlador de domínio) do Windows, com o nome de domínio contoso.com
. O controlador de domínio se chama adVM.contoso.com
. O segundo computador é um computador Windows chamado winbox
, executando o Windows 10 desktop, que é usado como uma caixa cliente e tem o SSMS (SQL Server Management Studio) instalado. O terceiro computador é um computador Ubuntu 18.04 LTS chamado sql1
, que hospeda os contêineres do SQL Server. Todas as máquinas estão associadas ao domínio contoso.com
. Para saber mais, confira Ingressar o SQL Server em um host Linux em um domínio do Active Directory.
Observação
Ingressar o computador do contêiner de host no domínio não é obrigatório, como você pode ver mais adiante neste artigo.
Instalar o adutil
Para instalar o adutil, siga as etapas em Introdução ao adutil: utilitário do Active Directory, em um computador host associado ao domínio.
Criar usuário do Active Directory, SPNs e keytab de serviço do SQL Server
Se você não deseja que o host do contêiner faça parte do domínio e não seguiu as etapas para associar o computador ao domínio, siga estas etapas em outro computador Linux que já faça parte do domínio do Active Directory:
Crie um usuário do Active Directory para SQL Server e defina o SPN usando o adutil.
Criar e configurar o arquivo keytab do serviço SQL Server.
Copie o arquivo mssql.keytab
que foi criado para o computador host que executará o contêiner do SQL Server e configure o contêiner para usar o arquivo mssql.keytab
. Opcionalmente, você também pode associar seu host Linux que executará o contêiner do SQL Server ao domínio do Active Directory e seguir essas etapas na mesmo computador.
Crie um usuário do Active Directory para SQL Server e defina o Nome da Entidade de Serviço com o adutil
Habilitar a autenticação do Active Directory no SQL Server em contêineres Linux requer que as etapas a seguir sejam executadas em um computador Linux que faça parte do domínio do Active Directory.
Obtenha ou renove o TGT (tíquete de concessão de tíquete) do Kerberos usando o comando
kinit
. Use uma conta com privilégios para o comandokinit
. A conta precisa ter permissão para se conectar ao domínio e também deve ser capaz de criar contas e SPNs no domínio.Neste script de exemplo, um usuário com privilégios chamado
privilegeduser@CONTOSO.COM
já foi criado no controlador de domínio.kinit privilegeduser@CONTOSO.COM
Usando o adutil, crie o usuário que será usado como a conta do Active Directory com privilégios pelo SQL Server.
adutil user create --name sqluser --distname CN=sqluser,CN=Users,DC=CONTOSO,DC=COM --password 'P@ssw0rd'
As senhas podem ser especificadas de qualquer uma destas três maneiras:
- Sinalizador de senha:
--password <password>
- Variáveis de ambiente –
ADUTIL_ACCOUNT_PWD
- Entrada Interativa
A precedência dos métodos de entrada de senha segue a ordem das opções listadas acima. As opções recomendadas são fornecer a senha usando variáveis de ambiente ou entrada interativa, pois elas são mais seguras em comparação com o sinalizador de senha.
Você pode especificar o nome da conta usando o nome diferenciado (
-distname
), como mostrado acima, ou pode usar o nome da UO (unidade organizacional). O nome da UO (--ou
) tem precedência sobre o nome diferenciado, caso você especifique ambos. Você pode executar o comando abaixo para obter mais detalhes:adutil user create --help
- Sinalizador de senha:
Registre os SPNs para o usuário criado acima. Você pode usar o nome do computador host em vez do nome do contêiner, se desejar, dependendo de como deseja que a conexão pareça externamente. Neste tutorial, a porta
5433
é usada em vez de1433
. Esse é o mapeamento de portas para o contêiner. Seu número da porta pode ser diferente.adutil spn addauto -n sqluser -s MSSQLSvc -H sql1.contoso.com -p 5433
addauto
criará os SPNs automaticamente, desde que privilégios suficientes estejam presentes para a conta de kinit.-n
: nome da conta à qual os SPNs serão atribuídos.-s
: o nome do serviço a ser usado para gerar SPNs. Nesse caso, é para o serviço SQL Server e, portanto, o nome do serviço é MSSQLSvc.-H
: o nome do host a ser usado para gerar SPNs. Se não for especificado, o FQDN do host local será usado. Forneça também o FQDN para o nome do contêiner. Nesse caso, o nome do contêiner ésql1
e o FQDN ésql1.contoso.com
.-p
: a porta a ser usada para gerar SPNs. Se não for especificado, os SPNs serão gerados sem uma porta. As conexões só funcionarão nesse caso quando o SQL Server estiver escutando a porta padrão,1433
.
Criar arquivo keytab do serviço SQL Server
Crie o arquivo keytab que contém entradas para cada um dos quatro SPNs criados anteriormente, bem como um para o usuário. O arquivo keytab será montado no contêiner para que possa ser criado em qualquer local no host. Você pode alterar esse caminho com segurança, desde que o keytab resultante seja montado corretamente ao usar o docker/podman para implantar o contêiner.
Para criar o keytab para todos os SPNs, podemos usar a opção createauto
:
adutil keytab createauto -k /container/sql1/secrets/mssql.keytab -p 5433 -H sql1.contoso.com --password 'P@ssw0rd' -s MSSQLSvc
-k
: caminho em que você deseja que o arquivomssql.keytab
seja criado. No exemplo anterior, o diretório/container/sql1/secrets
já deveria existir no host.-p
: a porta a ser usada para gerar SPNs. Se não for especificado, os SPNs serão gerados sem uma porta.-H
: o nome do host a ser usado para gerar SPNs. Se não for especificado, o FQDN do host local será usado. Forneça também o FQDN para o nome do contêiner. Nesse caso, o nome do contêiner ésql1
e o FQDN ésql1.contoso.com
.-s
: o nome do serviço a ser usado para gerar SPNs. Nesse caso, é para o serviço SQL Server e, portanto, o nome do serviço é MSSQLSvc.--password
: é a senha da conta de usuário privilegiada do Active Directory que foi criada anteriormente.-e
ou--enctype
: Tipos de criptografia para a entrada de keytab. Use uma lista de valores separados por vírgulas. Se não for especificado, um prompt interativo será apresentado.
Quando for dada a opção de escolher os tipos de criptografia, você poderá escolher mais de um. Para este exemplo, escolhemos aes256-cts-hmac-sha1-96
e arcfour-hmac
. Escolha um tipo de criptografia compatível com o host e o domínio.
Se deseja escolher o tipo de criptografia de maneira não interativa, você pode especificar sua escolha de tipo de criptografia com o argumento -e no comando acima. Para obter ajuda adicional sobre os comandos do adutil, execute o comando a seguir.
adutil keytab createauto --help
Cuidado
arcfour-hmac
é uma criptografia fraca e não é um tipo de criptografia recomendado para uso em um ambiente de produção.
Para criar o keytab para o usuário, o comando é:
adutil keytab create -k /container/sql1/secrets/mssql.keytab -p sqluser --password 'P@ssw0rd'
-k
: caminho em que você deseja que o arquivomssql.keytab
seja criado. No exemplo anterior, o diretório/container/sql1/secrets
já deveria existir no host.-p
: entidade de segurança a ser adicionada ao keytab.
O keytab create/autocreate do adutil não substitui os arquivos anteriores; ele é anexado ao arquivo, se já está presente.
Verifique se o keytab criado tem as permissões corretas definidas ao implantar o contêiner.
chmod 440 /container/sql1/secrets/mssql.keytab
Nesse ponto, você pode copiar mssql.keytab
do host Linux atual para o host Linux em que implantaria o contêiner do SQL Server e seguir o restante das etapas no host Linux que executará o contêiner do SQL Server. Se as etapas acima foram executadas no mesmo host Linux em que os contêineres do SQL Server serão implantados, siga as próximas etapas também no mesmo host.
Criar arquivos de configuração para serem usados pelo contêiner do SQL Server
Crie um arquivo de
mssql.conf
com as configurações do Active Directory. Esse arquivo pode ser criado em qualquer lugar no host e precisa ser montado corretamente durante o comando docker run. Neste exemplo, colocamos esse arquivomssql.conf
em/container/sql1
, que é nosso diretório de contêiner. O conteúdo demssql.conf
é mostrado a seguir:[network] privilegedadaccount = sqluser kerberoskeytabfile = /var/opt/mssql/secrets/mssql.keytab
privilegedadaccount
: usuário privilegiado do Active Directory a ser usado para a autenticação do Active Directory.kerberoskeytabfile
: o caminho no contêiner em que omssql.keytab
arquivo estará localizado.
Crie um arquivo
krb5.conf
, como o exemplo a seguir. O uso de maiúsculas e minúsculas é importante nesses arquivos.[libdefaults] default_realm = CONTOSO.COM default_keytab_name = /var/opt/mssql/secrets/mssql.keytab default_ccache_name = "" [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 os arquivos,
mssql.conf
,krb5.conf
,mssql.keytab
para um local que será montado no contêiner SQL Server. Neste exemplo, esses arquivos são colocados no host nos seguintes locais:mssql.conf
ekrb5.conf
em/container/sql1/
.mssql.keytab
é colocado no local/container/sql1/secrets/
.Verifique se há permissão suficiente nessas pastas para o usuário que executa o comando docker/podman. Quando o contêiner é iniciado, o usuário precisa acessar o caminho da pasta criado. Neste exemplo, disponibilizamos as permissões abaixo fornecidas ao caminho da pasta:
sudo chmod 755 /container/sql1/
Monte arquivos de configuração e implante o contêiner do SQL Server
Execute o contêiner do SQL Server e monte os arquivos de configuração corretos do Active Directory que foram criados anteriormente:
Importante
A variável de ambiente SA_PASSWORD
foi preterida. Use MSSQL_SA_PASSWORD
em vez disso.
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
Observação
Ao executar o contêiner no LSM (Módulo de Segurança do Linux) como hosts habilitados para SELinux, você precisa montar os volumes usando a opção Z
, que instrui o Docker a rotular o conteúdo com um rótulo não compartilhado privado. Para obter mais informações, confira Configurar o rótulo do SE Linux.
Nosso exemplo conteria estes comandos:
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
- Os arquivos
mssql.conf
ekrb5.conf
ficam localizados no caminho do arquivo de host/container/sql1
. - O
mssql.keytab
que foi criado fica localizado no caminho do arquivo de host/container/sql1/secrets
. - Como nosso computador host está no Azure, os detalhes do Active Directory precisam ser anexados ao comando
docker run
na mesma ordem. Em nosso exemplo, o controlador de domínioadVM
está no domíniocontoso.com
, com um endereço IP10.0.0.4
. O controlador de domínio executa DNS e KDC.
Criar logons do SQL Server baseados no Active Directory usando Transact-SQL
Conecte-se ao contêiner do SQL Server. Usando os comandos a seguir, crie o logon e confirme se ele existe. Você pode executar esse comando em um computador cliente (Windows ou Linux) executando SSMS, Azure Data Studio ou qualquer outra ferramenta de CLI (interface de linha de comando).
CREATE LOGIN [contoso\amvin] FROM WINDOWS;
SELECT name FROM sys.server_principals;
Conectar-se ao SQL Server com autenticação do Active Directory
Para se conectar usando o SQL Server Management Studio (SSMS) ou o Azure Data Studio, entre no SQL Server com credenciais do Windows usando o nome e o número da porta do SQL Server (o nome pode ser o nome do contêiner ou o nome do host). Em nosso exemplo, o nome do servidor seria sql1.contoso.com,5433
.
Você também pode usar uma ferramenta como sqlcmd para se conectar ao SQL Server em seu contêiner.
sqlcmd -E -S 'sql1.contoso.com,5433'
Recursos
- Noções básicas sobre a autenticação do Active Directory para SQL Server no Linux e em contêineres
- Solucionar problemas de autenticação do Active Directory para SQL Server no Linux e em contêineres