Configurazione di Samba 4 su Debian 13
Il punto di partenza e` l'howto dal sito di Samba, qui: https://wiki.samba.org/index.php/Setting_up_Samba_as_an_Active_Directory_Domain_Controller
Attenzione: usare il DC anche come file server non è supportato. Funziona ma non è una buona idea. Al giorno d'oggi non è certo un problema fare due virtuali una per il DC e una per il file server.
apt install acl attr samba samba-dsdb-modules samba-vfs-modules winbind libpam-winbind libnss-winbind libpam-krb5 krb5-config krb5-user dnsutils smbclient
pam-auth-update
(dopo aver installato i pacchetti) e disattivate l'opzione "Winbind NT/Active Directory Authentication"Prima di partire, occorre ricordare che il dominio AD funziona con il DNS, ergo e` esigente e invadente al riguardo. Occorre controllare che l'hostname fully qualified (con anche il dominio) del server dove stiamo installando Samba sia congruente con quello che sara` il nome del dominio AD (per esempio, "dc1.dominio.internal"), e sia risolvibile correttamente sia dal server stesso che dai client che poi aggiungeremo, sia a dritto che a rovescio.
Qui le best practice sono tante e non tutte concordano, ma la cosa importante e` che il nome del dominio AD NON SI CAMBIA MAI PIU` dopo averlo impostato. La best practice al 2025 (vedi https://wiki.samba.org/index.php/Active_Directory_Naming_FAQ) dice di usare un subdomain di un nome di dominio ufficiale e registrato (tipo ad esempio dominiosamba.example.com) ma io preferisco normalmente usare un dominio non registrato pubblicamente, tipo "nomeazienda.internal". (Vedi: https://en.wikipedia.org/wiki/.internal) Badate bene di NON usare ".local" che e` stato "rubato" da Avahi (Bonjour) e quindi ci sarebbero problemi nella risoluzione dei nomi. Se si prevede di avere una "foresta" (come la chiama MS) di domini correlati, allora occorre considerare bene la scelta dei nomi, ma questo va oltre lo scopo attuale del sottoscritto, che e` di avere un dominio AD e basta. Qui si parla di una installazione in una piccola azienda o in un setup casalingo.
Se usiamo un dominio "interno" tipo appunto "nomeazienda.internal" potremo usare direttamente questo come dominio per l' Active Directory. Se usiamo un dominio pubblico esistente (per dire, nomeazienda.it) allora DOBBIAMO usare un sottodominio, tipo "AD.nomeazienda.it" o "samba.nomeazienda.it", e NON usare direttamente "nomezienda.it" come dominio per Active Directory. Chiaramente nessuno ci vieta di usare un sottodominio di un dominio interno, tipo "AD.nomeazienda.internal". Alla fine è tutta una questione legata al fato che il DNS autoritativo per questo dominio che useremo per AD deve essere il nostro domain controller e nessun altro. Per questo motivo se usiamo un dominio interno possiamo serenamente usare il nostro DC come DNS autoritativo per l'interno dominio "nomeazienda.internal" mentre se usiamo un dominio pubblico ufficiale a noi registrato il DNS autoritativo non può essere il nostro interno ma deve essere quello pubblico su internet, tuttavia non c'e` nessun problema a usare il nostro DC come DNS autoritativo per un sottominio (AD.nomeazienda.it ad esempio) che chiaramente deve non esistere sul DNS esterno autoritativo per "nomeazienda.it". Chiaro? Per niente? Andate a rileggere https://wiki.samba.org/index.php/Active_Directory_Naming_FAQ
In questo esempio useremo ad.sambalab.internal come dominio AD
Essendo una nuova installazione, partiamo da zero con il provisioning di un dominio "vergine". Prima di farlo, mi assicuro di non avere configurazioni pregresse o di default che non mi siano gradite.
systemctl stop smbd nmbd winbind
/etc/samba/smb.conf
smbd -b | egrep "LOCKDIR|STATEDIR|CACHEDIR|PRIVATE_DIR"
. Un metodo (pericoloso?) per rimuoverli tutti in blocco è questo:smbd -b | egrep "LOCKDIR|STATEDIR|CACHEDIR|PRIVATE_DIR" | awk -F\: {'system("find "$2" -type f -name \"*.[t|l]db\" -delete")'}
/etc/krb5.conf
/etc/hosts
che ci sia una riga che contiene il nome del nostro server che punta al suo IP e non a localhost, tipo:192.168.1.100 dc1.ad.sambalab.internal dc1
hostname -f
riporti "dc1.ad.sambalab.internal" ovvero il nome host con il dominio che abbiamo deciso di usare corretto.samba-tool domain provision --use-rfc2307 --interactive
Realm [AD.SAMBALAB.INTERNAL]: Domain [AD]: Server Role (dc, member, standalone) [dc]: DNS backend (SAMBA_INTERNAL, BIND9_FLATFILE, BIND9_DLZ, NONE) [SAMBA_INTERNAL]: DNS forwarder IP address (write 'none' to disable forwarding) [10.0.2.1]: Administrator password: Otto88@88 Retype password: Otto88@88
Il tool di provisioning avra` creato una serie di cose:
Samba usa kerberos internamente per autenticare utenti, macchine, ecc. (Sono ignorante per cui non so esattamente come, quando, e perché. Tuttavia, è opportuno che kerberos funzioni localmente, quindi provvediamo a copiare (non symlinkare, ma copiare!) la configurazione autogenerata da Samba durante il provisioning dentro a /etc, come segue)
cp /var/lib/samba/private/krb5.conf /etc/krb5.conf
In Debian 12 sntp non funziona con Samba. Credo che la cosa sia stata risolta in Debian 13, ma possiamo comunque usare Chrony al posto di sntp, in questo modo:
/var/lib/samba/ntp_signd
, la quale deve poter essere letta dal server Chrony, che gira con user e group "_chrony" (notare l'underscore all'inizio) mkdir /var/lib/samba/ntp_signd chgrp _chrony /var/lib/samba/ntp_signd chmod 750 /var/lib/samba/ntp_signd
/etc/chrony/conf.d/
. Per esempio possiamo fare /etc/chrony/conf.d/samba.conf
contenente queste righe:ntpsigndsocket /var/lib/samba/ntp_signd allow all
chronyd[xxxx]: MS-SNTP authentication enabled
w32tm /resync
Samba vuole risolvere i suoi nomi interni per funzionare, ergo se il server dove e` installato samba usa come DNS un altro DNS che non sia se` stesso, o che non sia in qualche modo configurato per richiedere a Samba i nomi giusti, allora Samba quando si avvia dara` errori nel log (e non so poi se possa funzionare bene).
Il bello di Samba in versione AD e` che e` semplice (attenzione: questo è sarcasmo).
Quindi, la cosa piu` facile da fare e` impostare sul nostro domain controller in /etc/resolv.conf
il dns per essere localhost (127.0.0.1) oppure l'ip della nostra interfaccia alla quale abbiamo bindato Samba
search ad.sambalab.internal nameserver 127.0.0.1
Di default il DNS interno di Samba è autoritativo per il nostro dominio AD (in questo esempio ad.sambalab.internal) e passa ad un altro DNS, configurato in smb.conf, tutte le altre richieste.
Quando configureremo i client potremo farli puntare al nostro DC Samba oppure farli puntare ad un altro DNS purché questo altro DNS inoltri le richieste per il nostro dominio AD (ad.sambalab.internal) al dns che gira su Samba sul DC.
Notare che di default il DNS in Samba non contiene una zona "reverse" ma solo una zona "forward" per i nomi interni al dominio: funziona bene lo stesso, ma se volete potete anche configurare una zona reverse e popolarla con gli host statici (se ho capito bene non viene auto-popolata).
Dal momento che abbiamo modificato la config in resolv.conf, ora il nostro server DC non risolve più i nomi, quindi per poter lavorare senza problemi possiamo avviare Samba (e se vogliamo verificare che la risoluzione dns funzioni di nuovo) Notare che vengono avviati automaticamente anche smbd e winbindd in questa configurazione.
systemctl start samba-ad-dc host google.it
Per poter vedere correttamente gli utenti di Samba dal sistema (sulla macchina stessa del DC AD),e` sufficiente verificare che winbindd stia girando (ps ax) e poi modificare il file /etc/nsswitch.conf
come segue: (potrebbe essere che troviate "compat" al posto di "files", in quel caso mettete "compat winbind")
passwd: files winbind group: files winbind
(occorre che le librerie libnss-winbind libpam-winbind siano installate)
Questa impostazione non è più necessaria, è già configurato in modo corretto
I test minimali li ho presi direttamente dall' HOWTO.
Prima di tutto il test con smbclient, che si fa cosi`:
smbclient -L localhost -N
L'output e` tipo questo:
Anonymous login successful Sharename Type Comment --------- ---- ------- sysvol Disk netlogon Disk IPC$ IPC IPC Service (Samba 4.22.3-Debian-4.22.3+dfsg-4) SMB1 disabled -- no workgroup available
Poi l'accesso a uno share:
smbclient //localhost/netlogon -UAdministrator -c 'ls'
L'output e` tipo questo:
Enter Administrator's password: Otto88@88 Domain=[SAMDOM] OS=[Unix] Server=[Samba 4.x.y] . D 0 Sat Jul 5 08:40:00 2014 .. D 0 Sat Jul 5 08:40:00 2014 49386 blocks of size 524288. 42093 blocks available
Passo successivo il test del DNS. Queste query devono dare tutte risposte sensate e mai un not found.
host -t SRV _ldap._tcp.ad.sambalab.internal. host -t SRV _kerberos._udp.ad.sambalab.internal. host -t A dc1.ad.sambalab.internal.
Test di Kerberos:
La procedura di test per Kerberos richiede due comandi, kinit e klist:
kinit administrator@AD.SAMBALAB.INTERNAL
Notare che il dominio deve essere in maiuscolo (e può essere omesso, dovrebbe risolverlo da solo)
klist
Viene mostrato un output tipo questo:
Ticket cache: FILE:/tmp/krb5cc_0 Default principal: administrator@AD.SAMBALAB.INTERNAL Valid starting Expires Service principal 08/16/2025 17:52:11 08/17/2025 03:52:11 krbtgt/AD.SAMBALAB.INTERNAL@AD.SAMBALAB.INTERNAL renew until 08/17/2025 17:52:05
wbinfo --ping-dc
wbinfo -u administrator krbtgt guest wbinfo -g enterprise read-only domain controllers domain admins domain users domain guests domain computers domain controllers schema admins enterprise admins group policy creator owners read-only domain controllers dnsupdateproxy
id administrator uid=0(root) gid=0(root) groups=0(root) id guest uid=3000011(guest) gid=3000012(domain guests) groups=3000012(domain guests),3000011(guest),3000015(BUILTIN\guests) getfacl /var/lib/samba/sysvol getfacl: Removing leading '/' from absolute path names # file: var/lib/samba/sysvol # owner: root # group: BUILTIN\134administrators user::rwx user:root:rwx user:BUILTIN\134administrators:rwx group::rwx group:BUILTIN\134administrators:rwx group:BUILTIN\134server\040operators:r-x group:3000002:rwx group:3000003:r-x mask::rwx other::--- default:user::rwx default:user:root:rwx default:user:BUILTIN\134administrators:rwx default:group::--- default:group:BUILTIN\134administrators:rwx default:group:BUILTIN\134server\040operators:r-x default:group:3000002:rwx default:group:3000003:r-x default:mask::rwx default:other::---