Share via


Ativar a autenticação do Active Directory em SMB para clientes do Linux acessando Arquivos do Azure

Para saber mais sobre as opções e considerações compatíveis, confira Visão geral das opções de autenticação baseada em identidade dos Arquivos do Azure para acesso do SMB.

Os Arquivos do Azure dão suporte à autenticação baseada em identidade no protocolo SMB para máquinas virtuais (VMs) Linux usando o protocolo de autenticação Kerberos pelos métodos abaixo:

  • AD DS (Active Directory Domain Services) local do Windows
  • Serviços de Domínio do Microsoft Entra

Para usar o AD DS, você deve sincronizar o AD DS com o Microsoft Entra ID usando o Microsoft Entra Connect.

Observação

Este artigo usa o Ubuntu para as etapas de exemplo. Configurações semelhantes funcionarão para computadores RHEL e SLES, permitindo que você monte compartilhamentos de arquivos do Azure usando o Active Directory.

Aplica-se a

Tipo de compartilhamento de arquivos SMB NFS
Compartilhamentos de arquivos padrão (GPv2), LRS/ZRS Sim, este artigo se aplica aos compartilhamentos de arquivos SMB padrão do Azure em LRS/ZRS. Não, este artigo não se aplica aos compartilhamentos de arquivos do Azure NFS.
Compartilhamentos de arquivos padrão (GPv2), GRS/GZRS Sim, este artigo se aplica aos compartilhamentos de arquivos SMB padrão do Azure em GRS/GZRS. Não, este artigo não se aplica aos compartilhamentos de arquivos NFS do Azure.
Compartilhamento de arquivos premium (FileStorage), LRS/ZRS Sim, este artigo se aplica a compartilhamentos de arquivos SMB premium do Azure. Não, este artigo não se aplica aos compartilhamentos de arquivos NFS premium do Azure.

Limitações do cliente SMB do Linux

Você não pode usar a autenticação baseada em identidade para montar compartilhamentos de Arquivos do Azure em clientes Linux no momento da inicialização usando entradas fstab porque o cliente não pode obter o tíquete Kerberos cedo o suficiente para montar no momento da inicialização. No entanto, você pode usar uma entrada fstab e especificar a opção noauto . Isso não montará o compartilhamento no momento da inicialização, mas permitirá que um usuário monte convenientemente o compartilhamento de arquivos depois de fazer logon 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 habilitar a autenticação do AD em protocolo SMB para compartilhamentos de arquivo do Azure, verifique se que você atendeu aos seguintes pré-requisitos.

  • Uma VM do Linux (Ubuntu 18.04+ ou uma VM RHEL ou SLES equivalente) em execução no Azure. A VM deve ter pelo menos uma interface de rede na VNET que contém o Microsoft Entra Domain Services ou uma VM local do Linux com o AD DS sincronizado com a Microsoft Entra ID.
  • 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 do Linux não deve ter ingressado em nenhum domínio do AD. Se ele já fizer parte de um domínio, ele primeiro precisa sair desse domínio antes de poder ingressar em outro.
  • Um locatário do Microsoft Entra totalmente configurado, com o usuário de domínio já configurado.

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 ferramenta wbinfo faz parte do pacote samba. Ele pode ser útil para fins de autenticação e depuração, como verificar se o controlador de domínio está acessível, verificar em qual domínio um computador está ingressado e encontrar informações sobre os usuários.

Verifique se o host do Linux mantém o tempo sincronizado com o servidor de domínio. Consulte a documentação da distribuição do Linux. Para algumas distribuições, você pode fazer isso usando systemd-timesyncd. Edite /etc/systemd/timesyncd.conf com seu editor de texto favorito para incluir o seguinte:

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

Depois reinicie o serviço:

sudo systemctl restart systemd-timesyncd.service

Habilite a autenticação Kerberos AD

Siga estas etapas para habilitar a autenticação Kerberos do AD. Essa documentação do Samba pode ser útil como referência.

Verifique se o servidor de domínio está acessível e detectável

  1. Verifique se os servidores DNS fornecidos contêm os endereços IP do servidor 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 
  1. Se o comando funcionou, ignore as etapas a seguir e prossiga para a próxima seção.

  2. Se não funcionar, verifique se os endereços IP do servidor de domínio estão executando ping.

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
  1. Se o ping não funcionar, volte para os pré-requisitos e verifique se a VM está em uma VNET que tenha acesso ao locatário Microsoft Entra.

  2. Se os endereços IP estiverem executando ping, mas os servidores DNS não forem descobertos automaticamente, você poderá adicionar os servidores DNS manualmente. Abra /etc/netplan/50-cloud-init.yaml com 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 
  1. O Winbind pressupõe que o servidor DHCP mantenha os registros DNS do domínio atualizados. No entanto, isso não é verdadeiro para o DHCP do Azure. Para configurar o cliente para fazer atualizações de DDNS, use este guia para criar um script de rede. Aqui está um script de exemplo 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 

Conecte-se ao Microsoft Entra Domain Services e verifique se os serviços são detectáveis

  1. Verifique se você consegue executar o ping no servidor de domínio pelo nome de domínio.
ping contosodomain.contoso.com
PING contosodomain.contoso.com (10.0.2.4) 56(84) bytes of data.
64 bytes from pwe-oqarc11l568.internal.cloudapp.net (10.0.2.4): icmp_seq=1 ttl=128 time=1.41 ms
64 bytes from pwe-oqarc11l568.internal.cloudapp.net (10.0.2.4): icmp_seq=2 ttl=128 time=1.02 ms
64 bytes from pwe-oqarc11l568.internal.cloudapp.net (10.0.2.4): icmp_seq=3 ttl=128 time=0.740 ms
64 bytes from pwe-oqarc11l568.internal.cloudapp.net (10.0.2.4): icmp_seq=4 ttl=128 time=0.925 ms 

^C 

--- contosodomain.contoso.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3016ms
rtt min/avg/max/mdev = 0.740/1.026/1.419/0.248 ms 
  1. Verifique se você pode descobrir os serviços do Microsoft Entra na rede.
nslookup
> set type=SRV
> _ldap._tcp.contosodomain.contoso.com.
Server:         127.0.0.53
Address:        127.0.0.53#53

Non-authoritative answer: 

_ldap._tcp.contosodomain.contoso.com service = 0 100 389 pwe-oqarc11l568.contosodomain.contoso.com.
_ldap._tcp.contosodomain.contoso.com service = 0 100 389 hxt4yo--jb9q529.contosodomain.contoso.com. 

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

  1. 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 será usada principalmente para converter o nome do host curto em FQDN. Para obter mais detalhes, consulte Configurando o Samba como um membro do domínio.
127.0.0.1       contosovm.contosodomain.contoso.com contosovm
#cmd=sudo vim /etc/hosts   
#then enter this value instead of localhost "ubuntvm.contosodomain.contoso.com UbuntuVM" 
  1. Agora seu nome de host deve resolver. Você pode ignorar o endereço IP para o qual ele resolve por enquanto. O nome do host curto deve resolver ao FQDN.
getent hosts contosovm
127.0.0.1       contosovm.contosodomain.contoso.com contosovm
dnsdomainname
contosodomain.contoso.com
hostname -f
contosovm.contosodomain.contoso.com 

Observação

Algumas distribuições exigem que você execute o comando hostnamectl para que o nome do host -f seja atualizado:

hostnamectl set-hostname contosovm.contosodomain.contoso.com

Configurar krb5.conf

  1. Configure /etc/krb5.conf para que o KDC (centro de distribuição de chaves) Kerberos com o servidor de domínio 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

  1. Identifique o caminho para smb.conf.
sudo smbd -b | grep "CONFIGFILE"
   CONFIGFILE: /etc/samba/smb.conf
  1. Altere a configuração do SMB para atuar como um membro do domínio. Para obter mais detalhes, consulte Configurando o Samba como um membro do domínio. Aqui está um arquivo smb.conf de exemplo.

Observação

Este exemplo é para o Microsoft Entra Domain Services, para o qual recomendamos definir backend = rid ao configurar o idmap. Os usuários locais do AD DS podem preferir escolher um back-end de idmap diferente.

[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 
  1. Force winbind a recarregar o arquivo de configuração alterado.
sudo smbcontrol all reload-config

Ingressar no domínio

  1. Use o comando net ads join para ingressar o host no domínio do Microsoft Entra Domain Services. Se o comando gerar um erro, consulte Solução de problemas de membros do domínio samba para resolver o problema.
sudo net ads join -U contososmbadmin    # user  - garead

Enter contososmbadmin's password:
Using short domain name -- CONTOSODOMAIN
Joined 'CONTOSOVM' to dns domain 'contosodomain.contoso.com' 
  1. Verifique se o registro DNS existe para esse host no servidor de domínio.
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

Se os usuários fizerem logon ativamente em computadores cliente ou VMs e acessarem os compartilhamentos de arquivos do Azure, você precisará configurar o nsswitch.conf e configurar o PAM para winbind. Se o acesso for limitado a aplicativos representados por uma conta de usuário ou conta de computador que precisem de autenticação Kerberos para acessar o compartilhamento de arquivos, você poderá ignorar estas etapas.

Configurar nsswitch.conf

  1. Agora que o host está ingressado no domínio, você precisa colocar bibliotecas winbind nos locais a serem procurados ao procurar usuários e grupos. Faça isso atualizando as entradas passwd e group em nsswitch.conf. Use o editor de texto para editar /etc/nsswitch.conf e adicionar as seguintes entradas:
passwd:         compat systemd winbind
group:          compat systemd winbind
  1. 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
  1. Em seguida, 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 
  1. 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 o exemplo acima não funcionar, verifique se o controlador de domínio está acessível usando a ferramenta wbinfo:

wbinfo --ping-dc

Configure o PAM para winbind

  1. Você precisa colocar winbind na pilha de autenticação para que os usuários de domínio sejam autenticados por meio de winbind configurando o PAM (Módulo de Autenticação Conectável) para winbind. O segundo comando garante que o homedir seja criado para um usuário de domínio após o primeiro logon nesse sistema.
sudo pam-auth-update --enable winbind
sudo pam-auth-update --enable mkhomedir 
  1. Verifique se a configuração de autenticação do PAM tem os seguintes argumentos 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 
  1. Agora você já deve poder fazer logon nesse sistema como o usuário de domínio, seja 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) 

Verificar a configuração

Para verificar se o computador cliente está ingressado no domínio, procure o FQDN do cliente no controlador de domínio e localize a entrada DNS listada para esse cliente específico. Em muitos casos, <dnsserver> é o mesmo que o nome de domínio ao qual o cliente está ingressado.

nslookup <clientname> <dnsserver>

Em seguida, use o comando klist para exibir os tíquetes no cache Kerberos. Deve haver uma entrada começando com krbtgt que seja semelhante a:

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

Se você não configurou o PAM para 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 do AD (ou Microsoft Entra ID) e ingressar no domínio da VM do Linux, você poderá montar o compartilhamento de arquivos.

Para obter instruções detalhadas de montagem, consulte Montar o compartilhamento de arquivos do Azure sob demanda com montagem.

Use a seguinte opção de montagem adicional com todos os modelos de controle de acesso para habilitar a segurança do Kerberos: sec=krb5

Observação

Esse recurso dá suporte apenas a um modelo de controle de acesso imposto pelo servidor usando NT ACLs sem bits de modo. As ferramentas do Linux que atualizam NT ACLs são mínimas, portanto, atualize as 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).

Outras opções de montagem

Montagem de usuário único versus multiusuário

Em um caso de uso de montagem de usuário único, o ponto de montagem é acessado por um único usuário do domínio do AD e não é compartilhado com outros usuários do domínio. Cada acesso a arquivos ocorre no contexto do usuário cujas credenciais krb5 foram usadas para montar o compartilhamento de arquivos. Qualquer usuário no sistema local que acessar o ponto de montagem representará esse usuário.

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

Permissões de arquivo

As permissões de arquivo importam, especialmente se os clientes 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=<>. As permissões de arquivo especificadas como file_mode e dir_mode só são impostas dentro do cliente. 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 os clientes Linux e 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 de UID/GID por meio do RFC2307 e do Active Directory (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 1 minuto. Para a maioria dos casos de uso, é recomendável usar 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 obter mais informações sobre como montar um compartilhamento de arquivos SMB no Linux, consulte: