Abilitare l'autenticazione di Active Directory tramite SMB per i client Linux che accedono a File di Azure

Per altre informazioni sulle opzioni e sulle considerazioni supportate, vedere Panoramica delle opzioni di autenticazione basate sull'identità File di Azure per l'accesso SMB.

File di Azure supporta l'autenticazione basata su identità su SMB (Server Message Block) per le macchine virtuali Linux usando il protocollo di autenticazione Kerberos tramite i metodi seguenti:

  • Servizi Windows Dominio di Active Directory locali (AD DS)
  • Servizi di dominio Microsoft Entra

Per usare la prima opzione (AD DS), è necessario sincronizzare Active Directory Domain Services con Microsoft Entra ID usando Microsoft Entra Connessione.

Nota

Questo articolo usa Ubuntu per i passaggi di esempio. Le configurazioni simili funzioneranno per i computer RHEL e SLES, consentendo di montare condivisioni file di Azure usando Active Directory.

Si applica a

Tipo di condivisione file SMB NFS
Condivisioni file Standard (GPv2), archiviazione con ridondanza locale/archiviazione con ridondanza della zona Yes, this article applies to standard SMB Azure file shares LRS/ZRS. No, this article doesn't apply to NFS Azure file shares.
Condivisioni file Standard (GPv2), archiviazione con ridondanza geografica/archiviazione con ridondanza geografica della zona Yes, this article applies to standard SMB Azure file shares GRS/GZRS. No this article doesn't apply to NFS Azure file shares.
Condivisioni file Premium (FileStorage), archiviazione con ridondanza locale/archiviazione con ridondanza della zona Yes, this article applies to premium SMB Azure file shares. No, this article doesn't apply to premium NFS Azure file shares.

Limitazioni del client SMB linux

Non è possibile usare l'autenticazione basata su identità per montare condivisioni file di Azure nei client Linux in fase di avvio usando fstab voci perché il client non riesce a ottenere il ticket Kerberos abbastanza presto da montare in fase di avvio. Tuttavia, è possibile usare una fstab voce e specificare l'opzione noauto . Questa operazione non monterà la condivisione in fase di avvio, ma consentirà a un utente di montare facilmente la condivisione file dopo l'accesso usando un semplice comando di montaggio senza tutti i parametri. È anche possibile usare autofs per montare la condivisione al momento dell'accesso.

Prerequisiti

Prima di abilitare l'autenticazione di Active Directory tramite SMB per le condivisioni file di Azure, assicurarsi di aver completato i prerequisiti seguenti.

  • Una macchina virtuale Linux (Ubuntu 18.04+ o una macchina virtuale RHEL o SLES equivalente) in esecuzione in Azure. La macchina virtuale deve avere almeno un'interfaccia di rete nella rete virtuale contenente i Servizi di dominio Microsoft Entra o una macchina virtuale Linux locale con Active Directory Domain Services sincronizzata con Microsoft Entra ID.
  • Credenziali utente o utente radice per un account utente locale con diritti sudo completi (per questa guida localadmin).
  • La macchina virtuale Linux non deve avere aggiunto alcun dominio di Active Directory. Se fa già parte di un dominio, deve prima lasciare tale dominio prima di poter essere aggiunto a questo dominio.
  • Un tenant di Microsoft Entra completamente configurato, con l'utente di dominio già configurato.

L'installazione del pacchetto samba non è strettamente necessaria, ma offre alcuni strumenti utili e inserisce automaticamente altri pacchetti, ad esempio samba-common e smbclient. Eseguire i comandi seguenti per installarlo. Se vengono richiesti valori di input durante l'installazione, lasciarli vuoti.

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

Lo wbinfo strumento fa parte della suite samba. Può essere utile per scopi di autenticazione e debug, ad esempio per verificare se il controller di dominio è raggiungibile, controllare il dominio a cui viene aggiunto un computer e trovare informazioni sugli utenti.

Assicurarsi che l'host Linux mantenga l'ora sincronizzata con il server di dominio. Vedere la documentazione per la distribuzione di Linux. Per alcune distribuzioni, è possibile eseguire questa operazione usando systemd-timesyncd. Modificare /etc/systemd/timesyncd.conf con l'editor di testo preferito per includere quanto segue:

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

Riavviare quindi il servizio:

sudo systemctl restart systemd-timesyncd.service

Abilitare l'autenticazione Kerberos di ACTIVE Directory

Seguire questa procedura per abilitare l'autenticazione Kerberos di ACTIVE Directory. Questa documentazione di Samba può essere utile come riferimento.

Assicurarsi che il server di dominio sia raggiungibile e individuabile

  1. Assicurarsi che i server DNS forniti contengano gli indirizzi IP del server di dominio.
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 il comando ha funzionato, ignorare i passaggi seguenti e passare alla sezione successiva.

  2. Se non funziona, assicurarsi che gli indirizzi IP del server di dominio eseseguono il 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 il ping non funziona, tornare ai prerequisiti e assicurarsi che la macchina virtuale si trova in una rete virtuale che abbia accesso al tenant di Microsoft Entra.

  2. Se gli indirizzi IP eseguono il ping, ma i server DNS non vengono individuati automaticamente, è possibile aggiungere manualmente i server DNS. Modificare /etc/netplan/50-cloud-init.yaml con l'editor di testo preferito.

# 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

Applicare quindi le modifiche:

sudo netplan --debug apply 
  1. Winbind presuppone che il server DHCP mantenga aggiornati i record DNS del dominio. Tuttavia, questo non è vero per DHCP di Azure. Per configurare il client per eseguire gli aggiornamenti DDNS, usare questa guida per creare uno script di rete. Ecco uno script di esempio che si trova in /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 

Connessione a Microsoft Entra Domain Services e assicurarsi che i servizi siano individuabili

  1. Assicurarsi di poter effettuare il ping del server di dominio in base al nome di dominio.
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. Assicurarsi di poter individuare i servizi Microsoft Entra in rete.
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. 

Configurare il nome host e il nome di dominio completo (FQDN)

  1. Usando l'editor di testo, aggiornare il /etc/hosts file con il nome di dominio completo finale (dopo l'aggiunta al dominio) e l'alias per l'host. L'indirizzo IP non è importante perché questa riga verrà usata principalmente per convertire il nome host breve in FQDN. Per altre informazioni, vedere Configurazione di Samba come membro di dominio.
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. A questo momento, il nome host dovrebbe essere risolto. È possibile ignorare l'indirizzo IP in cui si risolve per il momento. Il nome host breve deve essere risolto nel nome di dominio completo.
getent hosts contosovm
127.0.0.1       contosovm.contosodomain.contoso.com contosovm
dnsdomainname
contosodomain.contoso.com
hostname -f
contosovm.contosodomain.contoso.com 

Nota

Alcune distribuzioni richiedono l'esecuzione del hostnamectl comando affinché il nome host -f venga aggiornato:

hostnamectl set-hostname contosovm.contosodomain.contoso.com

Configurare krb5.conf

  1. Configurare /etc/krb5.conf in modo che il Centro distribuzione chiavi Kerberos (KDC) con il server di dominio possa essere contattato per l'autenticazione. Per altre informazioni, vedere la documentazione di MIT Kerberos. Ecco un file di esempio /etc/krb5.conf .
[libdefaults]
        default_realm = CONTOSODOMAIN.CONTOSO.COM
        dns_lookup_realm = false
        dns_lookup_kdc = true

Configurare smb.conf

  1. Identificare il percorso di smb.conf.
sudo smbd -b | grep "CONFIGFILE"
   CONFIGFILE: /etc/samba/smb.conf
  1. Modificare la configurazione SMB in modo da fungere da membro del dominio. Per altre informazioni, vedere Configurazione di samba come membro di dominio. Ecco un file di esempio smb.conf .

Nota

Questo esempio è per Microsoft Entra Domain Services, per cui è consigliabile impostare backend = rid durante la configurazione di idmap. Gli utenti di Active Directory Domain Services locali potrebbero preferire la scelta di un back-end idmap diverso.

[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. Forzare winbind a ricaricare il file di configurazione modificato.
sudo smbcontrol all reload-config

Accedere al dominio

  1. Usare il net ads join comando per aggiungere l'host al dominio di Servizi di dominio Microsoft Entra. Se il comando genera un errore, vedere Risoluzione dei problemi relativi ai membri del dominio samba per risolvere il 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. Assicurarsi che il record DNS esista per questo host nel server di dominio.
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 gli utenti accedono attivamente a computer client o macchine virtuali e accedono alle condivisioni file di Azure, è necessario configurare nsswitch.conf e configurare PAM per winbind. Se l'accesso sarà limitato alle applicazioni rappresentate da un account utente o da un account computer che richiede l'autenticazione Kerberos per accedere alla condivisione file, è possibile ignorare questi passaggi.

Configurare nsswitch.conf

  1. Ora che l'host è stato aggiunto al dominio, è necessario inserire le librerie winbind nelle posizioni in cui cercare utenti e gruppi. A tale scopo, aggiornare le voci passwd e group in nsswitch.conf. Usare l'editor di testo per modificare /etc/nsswitch.conf e aggiungere le voci seguenti:
passwd:         compat systemd winbind
group:          compat systemd winbind
  1. Abilitare il servizio winbind per l'avvio automatico al riavvio.
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. Riavviare quindi il servizio.
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. Assicurarsi che gli utenti e i gruppi di dominio vengano individuati.
getent passwd contososmbadmin
contososmbadmin:*:12604:10513::/home/contososmbadmin:/bin/bash
getent group 'domain users'
domain users:x:10513: 

Se il codice precedente non funziona, verificare se il controller di dominio è raggiungibile tramite lo strumento wbinfo:

wbinfo --ping-dc

Configurare PAM per winbind

  1. È necessario inserire winbind nello stack di autenticazione in modo che gli utenti di dominio vengano autenticati tramite winbind configurando PAM (Pluggable Authentication Module) per winbind. Il secondo comando garantisce che homedir venga creato per un utente di dominio al primo accesso a questo sistema.
sudo pam-auth-update --enable winbind
sudo pam-auth-update --enable mkhomedir 
  1. Verificare che la configurazione di autenticazione PAM contenga gli argomenti seguenti in /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. A questo momento dovrebbe essere possibile accedere a questo sistema come utente di dominio, tramite ssh, su o qualsiasi altro mezzo di autenticazione.
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) 

Verificare la configurazione

Per verificare che il computer client sia aggiunto al dominio, cercare il nome di dominio completo del client nel controller di dominio e trovare la voce DNS elencata per questo client specifico. In molti casi, <dnsserver> corrisponde al nome di dominio a cui viene aggiunto il client.

nslookup <clientname> <dnsserver>

Usare quindi il klist comando per visualizzare i ticket nella cache Kerberos. Dovrebbe essere presente una voce che inizia con krbtgt un aspetto simile al seguente:

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

Se PAM non è stato configurato per winbind, klist potrebbe non visualizzare la voce del ticket. In questo caso, è possibile autenticare manualmente l'utente per ottenere i ticket:

wbinfo -K contososmbadmin

È anche possibile eseguire il comando come parte di uno script:

wbinfo -K 'contososmbadmin%SUPERSECRETPASSWORD'

Montare la condivisione file

Dopo aver abilitato l'autenticazione Kerberos di AD (o Microsoft Entra ID) e aver aggiunto al dominio la macchina virtuale Linux, è possibile montare la condivisione file.

Per istruzioni dettagliate sul montaggio, vedere Montare la condivisione file di Azure su richiesta con il montaggio.

Usare l'opzione di montaggio aggiuntiva seguente con tutti i modelli di controllo di accesso per abilitare la sicurezza Kerberos: sec=krb5

Nota

Questa funzionalità supporta solo un modello di controllo di accesso imposto dal server usando ACL NT senza bit di modalità. Gli strumenti Linux che aggiornano gli ACL NT sono minimi, quindi aggiornare gli elenchi di controllo di accesso tramite Windows. I modelli di controllomodefromsid,idsfromsid di accesso () e controllo di accesso convertito dal client (cifsacl) non sono attualmente supportati.

Altre opzioni di montaggio

Montaggio utente singolo e multiutente

In un caso d'uso di montaggio a singolo utente, il punto di montaggio è accessibile da un singolo utente del dominio di ACTIVE Directory e non viene condiviso con altri utenti del dominio. Ogni accesso ai file avviene nel contesto dell'utente le cui credenziali krb5 sono state usate per montare la condivisione file. Qualsiasi utente nel sistema locale che accede al punto di montaggio rappresenta l'utente.

In un caso d'uso di montaggio multiutente è ancora presente un singolo punto di montaggio, ma più utenti di Active Directory possono accedere allo stesso punto di montaggio. Negli scenari in cui più utenti nello stesso client accederanno alla stessa condivisione e il sistema è configurato per Kerberos e montato con sec=krb5, è consigliabile usare l'opzione multiuser di montaggio.

Autorizzazioni dei file

Le autorizzazioni per i file sono importanti, soprattutto se i client Linux e Windows accederanno alla condivisione file. Per convertire le autorizzazioni dei file in DACL nei file, usare un'opzione di montaggio predefinita, ad esempio file_mode=<>,dir_mode=<>. Le autorizzazioni per i file specificate come file_mode e dir_mode vengono applicate solo all'interno del client. Il server applica il controllo di accesso in base al descrittore di sicurezza del file o della directory.

Proprietà del file

La proprietà dei file è importante, soprattutto se i client Linux e Windows accederanno alla condivisione file. Scegliere una delle opzioni di montaggio seguenti per convertire l'UID/GID di proprietà del file in SID proprietario/gruppo nel FILE DACL:

  • Usare un valore predefinito, ad esempio uid=<>,gid=<>
  • Configurare il mapping UID/GID tramite RFC2307 e Active Directory (nss_winbind o nss_sssd)

Coescenza della cache degli attributi dei file

Le prestazioni sono importanti, anche se gli attributi del file non sono sempre accurati. Il valore predefinito per actimeo è 1 (secondo), il che significa che gli attributi del file vengono recuperati di nuovo dal server se gli attributi memorizzati nella cache sono più di 1 secondo precedente. L'aumento del valore a 60 indica che gli attributi vengono memorizzati nella cache per almeno 1 minuto. Per la maggior parte dei casi d'uso, è consigliabile usare il valore 30 per questa opzione (actimeo=30).

Per i kernel più recenti, è consigliabile impostare le funzionalità actimeo in modo più granulare. È possibile usare acdirmax per la riconvalida della voce di directory e acregmax per la memorizzazione nella cache dei metadati del file, ad esempio acdirmax=60,acregmax=5.

Passaggi successivi

Per altre informazioni su come montare una condivisione file SMB in Linux, vedere: