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 e krb5.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.

Screenshot of adding a host record.

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:

  1. Crie um usuário do Active Directory para SQL Server e defina o SPN usando o adutil.

  2. 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.

  1. 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 comando kinit. 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
    
  2. 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
    
  3. 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 de 1433. 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 arquivo mssql.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 arquivo mssql.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

  1. 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 arquivo mssql.conf em /container/sql1, que é nosso diretório de contêiner. O conteúdo de mssql.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 o mssql.keytab arquivo estará localizado.
  2. 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
    
    [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 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 e krb5.conf em /container/sql1/. mssql.keytab é colocado no local /container/sql1/secrets/.

  4. 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 e krb5.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ínio adVM está no domínio contoso.com, com um endereço IP 10.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