Configure clientes Linux para Arquivos do Azure com AD DS local

Aplica-se a: ✔️ compartilhamentos de arquivos SMB

O Arquivos do Azure suporta autenticação baseada em identidade sobre Server Message Block (SMB) para máquinas virtuais Linux (VMs) usando o protocolo de autenticação Kerberos com Active Directory Domain Services (AD DS) local. Para usar esse procedimento, você deve sincronizar seu ambiente AD DS com o Microsoft Entra ID usando o Microsoft Entra Connect Sync.

Para obter mais informações sobre opções e considerações com suporte, consulte Visão geral das opções de autenticação baseada em identidade do Arquivos do Azure para acesso SMB.

Observação

Este artigo usa o Ubuntu para as etapas de exemplo. Configurações semelhantes funcionam para clientes RHEL e SLES, permitindo que você monte compartilhamentos de arquivos do Azure usando o AD DS local.

Limitações do cliente SMB do Linux

Você não pode usar autenticação baseada em identidade para montar compartilhamentos de arquivos do Azure em clientes Linux no momento da inicialização usando entradas fstab. Essa limitação existe porque o cliente não consegue obter o ticket do Kerberos cedo o suficiente para montar no momento de inicialização. Você pode usar uma fstab entrada e especificar a opção noauto para permitir que um usuário monte o compartilhamento de arquivos após entrar usando um comando de montagem simples sem todos os parâmetros. Você também pode usar autofs para montar o compartilhamento após o acesso.

Pré-requisitos

Antes de configurar um cliente Linux para usar autenticação AD DS local sobre SMB para compartilhamentos de arquivos Azure, complete os seguintes pré-requisitos:

  • Uma VM do Linux executando Ubuntu 18.04+ ou uma VM RHEL ou SLES equivalente. A VM deve ter conectividade de rede aos seus controladores de domínio AD DS on-premises e usar servidores DNS que possam resolver o domínio AD DS.
  • Um ambiente AD DS on-premises sincronizado com o Microsoft Entra ID usando o Microsoft Entra Connect Sync.
  • Um compartilhamento de arquivos SMB do Azure em uma conta de armazenamento configurada para autenticação do AD DS local.
  • Usuário raiz ou credenciais de usuário para uma conta de usuário local que tenha direitos sudo completos (para este guia, localadmin).
  • A VM Linux ainda não está ligada a outro domínio AD DS. Se for, saia desse domínio antes de unir a VM a esse domínio.
  • Uma conta de usuário do domínio AD DS com permissão para conectar computadores ao domínio.

A instalação do pacote samba não é estritamente necessária, mas fornece algumas ferramentas úteis e traz outros pacotes automaticamente, como samba-common e smbclient. Execute os seguintes comandos para instalá-lo. Se você for solicitado a fornecer valores de entrada durante a instalação, deixe-os em branco.

sudo apt update -y
sudo apt install samba winbind libpam-winbind libnss-winbind krb5-config krb5-user keyutils cifs-utils

A wbinfo ferramenta faz parte do pacote de samba e é útil para fins de autenticação e depuração, como verificar se o controlador de domínio é acessível, verificar em qual domínio um computador está unido e encontrar informações sobre os usuários.

Certifique-se de que o host Linux mantenha o horário sincronizado com os controladores de domínio do AD DS. Veja a documentação da sua distribuição Linux. Para algumas distribuições, você pode fazer isso usando systemd-timesyncd. Edite /etc/systemd/timesyncd.conf para incluir a seguinte configuração. Substitua ntp.server pelo mesmo nome de host ou endereço IP do Protocolo de Tempo de Rede (NTP) que seu ambiente AD DS usa.

[Time]
NTP=ntp.server
FallbackNTP=ntp.ubuntu.com

Depois reinicie o serviço:

sudo systemctl restart systemd-timesyncd.service

Ativar a autenticação AD DS Kerberos

Siga estes passos para habilitar a autenticação Kerberos com AD DS local. Para mais informações sobre como configurar o Samba, veja Configurar o Samba como Membro de Domínio.

Certifique-se de que os controladores de domínio do AD DS estejam acessíveis e descobríveis

  1. Certifique-se de que os servidores DNS configurados possam resolver seu domínio AD DS e seus controladores de domínio.

    systemd-resolve --status
    
    Global 
              DNSSEC NTA: 10.in-addr.arpa
                          16.172.in-addr.arpa
                          168.192.in-addr.arpa
                          17.172.in-addr.arpa
                          18.172.in-addr.arpa
                          19.172.in-addr.arpa
                          20.172.in-addr.arpa
                          21.172.in-addr.arpa
                          22.172.in-addr.arpa
                          23.172.in-addr.arpa
                          24.172.in-addr.arpa
                          25.172.in-addr.arpa
                          26.172.in-addr.arpa
                          27.172.in-addr.arpa
                          28.172.in-addr.arpa
                          29.172.in-addr.arpa
                          30.172.in-addr.arpa
                          31.172.in-addr.arpa
                          corp
                          d.f.ip6.arpa
                          home
                          internal
                          intranet
                          lan
                          local
                          private
                          test 
    
    Link 2 (eth0) 
          Current Scopes: DNS
           LLMNR setting: yes
    MulticastDNS setting: no
          DNSSEC setting: no
        DNSSEC supported: no
             DNS Servers: 10.0.2.5
                          10.0.2.4
                          10.0.0.41
              DNS Domain: domain1.contoso.com
    
  2. Se os servidores DNS contêm os endereços IP do controlador de domínio, proceda a Configurar nome de host e FQDN. Se o comando não produzir a saída esperada, veja Solucionar problemas na descoberta do controlador de domínio AD DS.

Solucionar problemas na descoberta do controlador de domínio AD DS

  1. Certifique-se de que você pode fazer ping nos endereços IP do controlador de domínio AD DS.

    ping 10.0.2.5
    
    PING 10.0.2.5 (10.0.2.5) 56(84) bytes of data.
    64 bytes from 10.0.2.5: icmp_seq=1 ttl=128 time=0.898 ms
    64 bytes from 10.0.2.5: icmp_seq=2 ttl=128 time=0.946 ms
    
    ^C 
    
    --- 10.0.2.5 ping statistics --- 
    2 packets transmitted, 2 received, 0% packet loss, time 1002ms
    rtt min/avg/max/mdev = 0.898/0.922/0.946/0.024 ms
    
  2. Se o ping não funcionar, revise os pré-requisitos e certifique-se de que sua VM tem conectividade de rede aos controladores de domínio do AD DS.

  3. Se os endereços IP responderem ao ping, mas os servidores DNS não forem descobertos automaticamente, você poderá adicionar os servidores DNS manualmente. Edite /etc/netplan/50-cloud-init.yaml usando seu editor de texto favorito.

    # This file is generated from information provided by the datasource.  Changes
    # to it will not persist across an instance reboot.  To disable cloud-init's
    # network configuration capabilities, write a file
    # /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following:
    # network: {config: disabled}
    network:
        ethernets:
            eth0:
                dhcp4: true
                dhcp4-overrides:
                    route-metric: 100
                dhcp6: false
                match:
                    macaddress: 00:22:48:03:6b:c5
                set-name: eth0
                nameservers:
                    addresses: [10.0.2.5, 10.0.2.4]
        version: 2
    

    Em seguida, aplique as alterações:

    sudo netplan --debug apply 
    
  4. O Winbind pressupõe que o servidor DHCP mantenha os registros DNS do domínio atualizados. No entanto, essa suposição não é verdadeira para Azure DHCP. Para configurar o cliente para fazer atualizações de DDNS, use este guia para criar um script de rede. Aqui está um exemplo de script que reside em /etc/dhcp/dhclient-exit-hooks.d/ddns-update.

    #!/bin/sh 
    
    # only execute on the primary nic
    if [ "$interface" != "eth0" ]
    then
        return
    fi 
    
    # When you have a new IP, perform nsupdate
    if [ "$reason" = BOUND ] || [ "$reason" = RENEW ] ||
       [ "$reason" = REBIND ] || [ "$reason" = REBOOT ]
    then
       host=`hostname -f`
       nsupdatecmds=/var/tmp/nsupdatecmds
         echo "update delete $host a" > $nsupdatecmds
         echo "update add $host 3600 a $new_ip_address" >> $nsupdatecmds
         echo "send" >> $nsupdatecmds
    
         nsupdate $nsupdatecmds
    fi 
    

Após resolver o problema, proceda a configurar um nome de host e um nome de domínio totalmente qualificado.

Configure o nome do host e o FQDN (nome de domínio totalmente qualificado)

Usando o editor de texto, atualize o arquivo /etc/hosts com o FQDN final (depois de ingressar no domínio) e o alias do host. O endereço IP não importa por enquanto, pois essa linha é usada principalmente para traduzir nome de host curto para FQDN. Para obter mais informações, consulte Configurando o Samba como um membro de domínio.

127.0.0.1       contosovm.contosodomain.contoso.com contosovm
#cmd=sudo vim /etc/hosts   
#then enter this value instead of localhost "ubuntuvm.contosodomain.contoso.com UbuntuVM" 

Agora, verifique se seu nome de host se resolve corretamente executando os três comandos a seguir.

Use getent hosts para confirmar que o nome de host curto é resolvido para o FQDN. Você pode ignorar o endereço IP que é devolvido.

getent hosts contosovm
127.0.0.1       contosovm.contosodomain.contoso.com contosovm

Use dnsdomainname para confirmar que o nome de domínio está configurado corretamente.

dnsdomainname
contosodomain.contoso.com

Use hostname -f para confirmar que o FQDN completo está resolvido.

hostname -f
contosovm.contosodomain.contoso.com 

Observação

Algumas distribuições Linux exigem que você execute o comando hostnamectl para que hostname -f seja atualizado:

hostnamectl set-hostname contosovm.contosodomain.contoso.com

Configurar krb5.conf

Configure /etc/krb5.conf para que o centro de distribuição de chaves Kerberos (KDC) em um controlador de domínio AD DS possa ser contatado para autenticação. Para obter mais informações, confira a documentação do MIT Kerberos. Aqui está um arquivo /etc/krb5.conf de exemplo.

[libdefaults]
        default_realm = CONTOSODOMAIN.CONTOSO.COM
        dns_lookup_realm = false
        dns_lookup_kdc = true

Configurar smb.conf

Identifique o caminho para smb.conf.

sudo smbd -b | grep "CONFIGFILE"
   CONFIGFILE: /etc/samba/smb.conf

Mude a configuração do SMB para atuar como um membro do domínio AD DS. O exemplo a seguir usa o rid backend idmap. Revise a escolha de um backend idmap e selecione o backend que atenda aos requisitos do seu ambiente AD DS.

[global]
   workgroup = CONTOSODOMAIN
   security = ADS
   realm = CONTOSODOMAIN.CONTOSO.COM

   winbind refresh tickets = Yes
   vfs objects = acl_xattr
   map acl inherit = Yes
   store dos attributes = Yes

   dedicated keytab file = /etc/krb5.keytab
   kerberos method = secrets and keytab

   winbind use default domain = Yes 

   load printers = No
   printing = bsd
   printcap name = /dev/null
   disable spoolss = Yes

   log file = /var/log/samba/log.%m
   log level = 1

   idmap config * : backend = tdb
   idmap config * : range = 3000-7999

   idmap config CONTOSODOMAIN : backend = rid
   idmap config CONTOSODOMAIN : range = 10000-999999

   template shell = /bin/bash
   template homedir = /home/%U 

Force winbind a recarregar o arquivo de configuração alterado.

sudo smbcontrol all reload-config

Junte-se ao domínio AD DS

Use o net ads join comando para unir o host ao domínio. Se o comando retornar um erro, consulte Solução de problemas de membros do domínio de samba para resolver o problema.

sudo net ads join -U contososmbadmin

Enter contososmbadmin's password:
Using short domain name -- CONTOSODOMAIN
Joined 'CONTOSOVM' to dns domain 'contosodomain.contoso.com' 

Certifique-se de que o registro DNS deste host existe no DNS ADS.

nslookup contosovm.contosodomain.contoso.com 10.0.2.5
Server:         10.0.2.5
Address:        10.0.2.5#53

Name:   contosovm.contosodomain.contoso.com
Address: 10.0.0.8

Configurar nsswitch.conf

Se você planeja que os usuários façam login ativamente em máquinas clientes e acessem os compartilhamentos de arquivos do Azure, você precisará configurar nsswitch.conf. Se o acesso planejado for limitado a aplicativos representados por uma conta de usuário ou conta de computador que precise da autenticação Kerberos para acessar o compartilhamento de arquivos, você poderá ignorar esta etapa.

Depois de ingressar o host no domínio, adicione as bibliotecas winbind aos caminhos de pesquisa de usuários e grupos. Use o editor de texto para editar /etc/nsswitch.conf e adicionar as seguintes entradas:

passwd:         compat systemd winbind
group:          compat systemd winbind

Habilite o serviço winbind para iniciar automaticamente na reinicialização.

sudo systemctl enable winbind
Synchronizing state of winbind.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable winbind

Reinicie o serviço.

sudo systemctl restart winbind
sudo systemctl status winbind
winbind.service - Samba Winbind Daemon
   Loaded: loaded (/lib/systemd/system/winbind.service; enabled; vendor preset: enabled)
   Active: active (running) since Fri 2020-04-24 09:34:31 UTC; 10s ago
     Docs: man:winbindd(8)
           man:samba(7)
           man:smb.conf(5)
 Main PID: 27349 (winbindd)
   Status: "winbindd: ready to serve connections..."
    Tasks: 2 (limit: 4915)
   CGroup: /system.slice/winbind.service
           ├─27349 /usr/sbin/winbindd --foreground --no-process-group
           └─27351 /usr/sbin/winbindd --foreground --no-process-group

Apr 24 09:34:31 contosovm systemd[1]: Starting Samba Winbind Daemon...
Apr 24 09:34:31 contosovm winbindd[27349]: [2020/04/24 09:34:31.724211,  0] ../source3/winbindd/winbindd_cache.c:3170(initialize_winbindd_cache)
Apr 24 09:34:31 contosovm winbindd[27349]:   initialize_winbindd_cache: clearing cache and re-creating with version number 2
Apr 24 09:34:31 contosovm winbindd[27349]: [2020/04/24 09:34:31.725486,  0] ../lib/util/become_daemon.c:124(daemon_ready)
Apr 24 09:34:31 contosovm systemd[1]: Started Samba Winbind Daemon.
Apr 24 09:34:31 contosovm winbindd[27349]:   STATUS=daemon 'winbindd' finished starting up and ready to serve connections 

Verifique se os usuários e grupos de domínio foram descobertos.

getent passwd contososmbadmin
contososmbadmin:*:12604:10513::/home/contososmbadmin:/bin/bash
getent group 'domain users'
domain users:x:10513: 

Se os passos anteriores não funcionarem, verifique se um controlador de domínio AD DS está acessível usando a wbinfo ferramenta:

wbinfo --ping-dc

Configurar PAM para o winbind

Se você planeja que os usuários entrem ativamente em computadores cliente e acessem os compartilhamentos de arquivos Azure, você precisará configurar o PAM para winbind. Se o acesso planejado for limitado a aplicativos representados por uma conta de usuário ou conta de computador que precise da autenticação Kerberos para acessar o compartilhamento de arquivos, você poderá ignorar esta etapa.

Coloque o winbind na pilha de autenticação para que os usuários de domínio se autentiquem por meio dele configurando o PAM (Módulo de Autenticação Conectável) para winbind. O segundo comando garante que o sistema crie o diretório base para um usuário de domínio após o primeiro logon.

sudo pam-auth-update --enable winbind
sudo pam-auth-update --enable mkhomedir 

Verifique se a configuração de autenticação PAM tem os argumentos corretos pam_winbind.so em /etc/pam.d/common-auth:

grep pam_winbind.so /etc/pam.d/common-auth
auth    [success=1 default=ignore]      pam_winbind.so krb5_auth krb5_ccache_type=FILE cached_login try_first_pass 

Se o comando não devolver saída, execute sudo pam-auth-update --enable winbind novamente para garantir que o winbind seja adicionado à pilha de autenticação PAM.

Agora você pode entrar nesse sistema como o usuário de domínio, por meio de ssh, su ou qualquer outro meio de autenticação.

su - contososmbadmin
Password:
Creating directory '/home/contososmbadmin'.
contososmbadmin@contosovm:~$ pwd
/home/contososmbadmin
contososmbadmin@contosovm:~$ id
uid=12604(contososmbadmin) gid=10513(domain users) groups=10513(domain users),10520(group policy creator owners),10572(denied rodc password replication group),11102(dnsadmins),11104(aad dc administrators),11164(group-readwrite),11165(fileshareallaccess),12604(contososmbadmin) 

Verifique a autenticação do AD DS no Linux

Para verificar se a máquina cliente está conectada ao domínio AD DS, procure a FQDN do cliente usando um servidor DNS AD DS e confirme que a entrada DNS existe para o cliente. Em muitos casos, <dnsserver> é o mesmo que o nome de domínio AD DS ao qual o cliente está conectado.

nslookup <clientname> <dnsserver>

Em seguida, corra klist para ver os tickets no cache do Kerberos:

klist

A saída deve incluir uma entrada começando por krbtgt que seja semelhante a:

krbtgt/CONTOSODOMAIN.CONTOSO.COM@CONTOSODOMAIN.CONTOSO.COM

Se você não configurou o PAM para o winbind, talvez klist não mostre a entrada do tíquete. Nesse caso, você pode autenticar manualmente o usuário para obter os tíquetes:

wbinfo -K contososmbadmin

Você também pode executar o comando como parte de um script:

wbinfo -K 'contososmbadmin%SUPERSECRETPASSWORD'

Montar o compartilhamento de arquivos

Depois de habilitar a autenticação Kerberos e ingressar no domínio na VM do Linux, você poderá montar o compartilhamento de arquivos.

Use a seguinte opção de montagem com todos os modelos de controle de acesso para habilitar a segurança Kerberos: sec=krb5. Omita o nome de usuário e a senha quando você usa sec=krb5. Por exemplo:

sudo mount -t cifs $SMB_PATH $MNT_PATH -o sec=krb5,cruid=$UID,serverino,nosharesock,actimeo=30,mfsymlinks

Observação

Esse recurso só dá suporte a um modelo de controle de acesso imposto pelo servidor que usa ACLs NT sem bits de modo. As ferramentas do Linux que atualizam os ACLs NT são mínimas, portanto, atualize os ACLs por meio do Windows. Atualmente, não há suporte para modelos de controle de acesso imposto pelo cliente (modefromsid,idsfromsid) e controle de acesso traduzido pelo cliente (cifsacl).

Opções adicionais de montagem SMB do Arquivos do Azure para Linux

Montagem de usuário único versus multiusuário

Em um caso de uso de montagem para usuário único, um único usuário no domínio AD DS acessa o ponto de montagem e não o compartilha com outros usuários no domínio. Cada acesso a arquivos ocorre no contexto do usuário cujas credenciais krb5 são usadas para montar o compartilhamento de arquivos. Qualquer usuário no sistema local que acessa o ponto de montagem faz isso se passando por aquele usuário.

Em um caso de uso multiusuário, ainda há um único ponto de montagem, mas vários usuários do AD DS podem acessar esse mesmo ponto de montagem. Em cenários em que vários usuários no mesmo cliente acessam o mesmo compartilhamento e o sistema é configurado para Kerberos e montado com sec=krb5, considere usar a opção multiuser de montagem.

Permissões de arquivo

As permissões de arquivo são importantes, especialmente se clientes de Linux e Windows acessarem o compartilhamento de arquivos. Para converter permissões de arquivo em DACLs em arquivos, use uma opção de montagem padrão, como file_mode=<>,dir_mode=<>. O cliente só impõe permissões de arquivo especificadas como file_mode e dir_mode. O servidor impõe o controle de acesso com base no descritor de segurança do arquivo ou do diretório.

Propriedade do arquivo

A propriedade do arquivo é importante, especialmente se o Linux e os clientes Windows acessarem o compartilhamento de arquivos. Escolha uma das seguintes opções de montagem para converter a propriedade do arquivo UID/GID em SID de proprietário/grupo no arquivo DACL:

  • Use um padrão como uid=<>,gid=<>
  • Configure o mapeamento UID/GID via RFC2307 e AD DS usando nss_winbind ou nss_sssd.

Coerência do cache de atributos de arquivo

O desempenho é importante, mesmo que os atributos de arquivo nem sempre sejam precisos. O valor padrão para actimeo é 1 (segundo), o que significa que os atributos de arquivo são buscados novamente do servidor se os atributos armazenados em cache tiverem mais de 1 segundo de idade. Aumentar o valor para 60 significa que os atributos são armazenados em cache por pelo menos um minuto. Para a maioria dos casos de uso, use um valor de 30 para essa opção (actimeo=30).

Para kernels mais recentes, considere definir os recursos de actimeo de forma mais granular. Você pode usar acdirmax para cache de revalidação de entrada de diretório e acregmax para armazenar em cache metadados de arquivo, por exemplo acdirmax=60,acregmax=5.

Próxima etapa

Para saber como montar um compartilhamento de arquivos SMB no Linux, confira: