====== Samba 4 come member server ======
Questa configurazione è stata provata su Debian 12 e 13
Configurazione di una macchina con Samba4 che sia membro di un dominio AD. Il domain controller in questo caso e` Samba, ma dovrebbe funzionare anche con un DC Windows (non ho provato).
Riferimento al Wiki di Samba: https://wiki.samba.org/index.php/Setting_up_Samba_as_a_Domain_Member
===== Prerequisiti =====
* Samba richiede l'uso delle ACL Posix e degli attributi estesi sul file system. Occorre quindi usare ext4 (che li supporta di default) oppure abilitarli sul file system che volete usare.
* Usare NTP perche` la sincronizzazione dell'ora e` importante
* Configurare la risoluzione dei nomi:
* Modificare ''/etc/resolv.conf'' in modo che punti al DNS che serve il dominio (che è lo stesso che usano i client, ovvero è il domain controller medesimo oppure può essere Dnsmasq se è stato configurato correttamente per risolvere i nomi relativi al dominio AD) e in modo che il parametro "search" sia impostato al nome del dominio AD.
nameserver 192.168.0.1
search ad.sambalab.internal
* Modificare il file ''/etc/hosts'' in modo che NON CONTENGA riferimenti all'hostname della macchina che puntino a 127.0.0.1 (o a ::1). È corretto avere "localhost" che punta a 127.0.0.1 e ::1. Il nome dell'host deve puntare all'indirizzo ip dell'interfaccia che usiamo per servire i files con Samba (che ragionevolmente sarà una sola; se ne avete più di una sinceramente non so come si possa fare). Per esempio, questo è un file hosts corretto:
# localhost
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
# il nome del mio server punta all' IP dell'interfaccia di rete
192.168.0.248 fileserver.ad.sambalab.internal fileserver
===== Installazione di Samba =====
* Installare normalmente i pacchetti di Samba "ufficiali" più alcuni pacchetti di contorno:
apt install acl attr samba samba-dsdb-modules samba-vfs-modules winbind libpam-winbind libnss-winbind libpam-krb5 krb5-config krb5-user dnsutils smbclient
* ignorare le domande relative alla config di Kerberos, che tanto dovremo rifarla dopo.
* **ATTENZIONE:** installando libpam-winbind si autorizzano di default gli utenti di Samba ad accedere in ssh. Questo potrebbe essere molto pericoloso. Se non volete che succeda, usate il comando ''pam-auth-update'' (dopo aver installato i pacchetti) e disattivate l'opzione "Winbind NT/Active Directory Authentication"
===== Configurazione di systemd-timesyncd (default in Debian 13) =====
NTP deve essere configurato per prendere l'ora corretta dal DC o da un altro server NTP che sia in sincro con il DC. Probabilmente usare la config di default va bene comunque, visto che si presume che l'ora esatta sia giusta anche se la prendo da un server NTP pubblico. Tuttavia se vogliamo possiamo configurare NTP per usare il DC come riferimento. (vedi https://wiki.samba.org/index.php/Time_Synchronisation)
Questi comandi creano una config che punta al nostro DC (se ne abbiamo piu` di uno, ne impostiamo piu` di uno)
mkdir /etc/systemd/timesyncd.conf.d/
echo "NTP=dc1.ad.sambalab.internal" >> /etc/systemd/timesyncd.conf.d/ntp-samba.conf
systemctl restart systemd-timesyncd.service
===== Configurazione di NTP (se preferite usare ntp invece di systemd-timesync) =====
NTP deve essere configurato per prendere l'ora corretta dal DC o da un altro server NTP che sia in sincro con il DC. Probabilmente usare la config di default va bene comunque, visto che si presume che l'ora esatta sia giusta anche se la prendo da un server NTP pubblico. Tuttavia se vogliamo possiamo configurare NTP per usare il DC come riferimento. (vedi https://wiki.samba.org/index.php/Time_Synchronisation)
Per fare questa configurazione, modifichiamo il file /etc/ntpd.conf in modo da eliminare i server ntp pubblici e mettere come server NTP il domain contoroller (o i domain controller se sono piu` di uno). Questa configurazione è basata su ntpd così come è impostato in Devuan Beowulf. Di fatto ho tolto le righe "pool" che fanno riferimenti ai server ntp di Debian, e ho aggiunto le righe che fanno riferimento al DC come server NTP:
# Aggiunta per Samba:
server dc1.ad.sambalab.internal iburst prefer
#server dc1.ad.sambalab.internal iburst
tinker panic 0
# commentate queste righe:
#pool 0.debian.pool.ntp.org iburst
#pool 1.debian.pool.ntp.org iburst
#pool 2.debian.pool.ntp.org iburst
#pool 3.debian.pool.ntp.org iburst
===== Configurazione di Kerberos =====
Modificare il file ''/etc/krb5.conf'' come segue: (al posto di "AD.SAMBALAB.INTERNAL" ovviamente mettete il vostro dominio AD, in maiuscolo. Togliete tutto il resto, non deve rimanere altro che questo.
[libdefaults]
default_realm = DOMAIN.LOCALE
dns_lookup_realm = false
dns_lookup_kdc = true
===== Test del DNS =====
* Verificare se si risolvono correttamente i nomi relativi al dominio, ai domain controller, ecc:
host -t SRV _ldap._tcp.ad.sambalab.internal.
host -t SRV _kerberos._udp.ad.sambalab.internal.
host -t A dc1.ad.sambalab.internal.
* Verificare se funziona la risoluzione inversa dell' ip dei domain controller. Se non funziona è perché non l'abbiamo configurata nel DNS nel DC, e non è grave.
host
===== 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 credo possa essere omesso, dovrebbe risolverlo da solo) Viene chiesta la password di administrator.
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 18:24:39 08/17/2025 04:24:39 krbtgt/AD.SAMBALAB.INTERNAL@AD.SAMBALAB.INTERNAL
renew until 08/17/2025 18:24:35
===== Configurazione di nsswitch (non più necessaria in Debian 13) =====
Per poter vedere correttamente gli utenti di del dominio come utenti di sistema occorre 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)
===== Preparazione (pulizia) di Samba =====
* Fermare samba
systemctl stop smbd nmbd winbind
* Assicurarsi che sia fermo. Se ci sono processi smbd, nmbd, o winbindd, killarli senza pietà.
* Cancellare o rinominare il file ''/etc/samba/smb.conf''
* Se ci sono, cancellare tutti i files tdb e ldb. 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")'}
===== Configurazione di Samba =====
Nota bene: Esistono tre (per il momento) sistemi per mappare gli ID di user e gruppi di Linux (necessari per le ACL) sugli ID nativi di AD. Questa configurazione si basa sul backend "rid". Per ulteriori informazioni su quali usare a seconda delle vostre esigenze, potete andare qui: https://wiki.samba.org/index.php/Identity_Mapping_Back_Ends
Prima di tutto dobbiamo creare un file smb.conf adeguato. (attenzione a mettere il nome giusto del dominio in vari punti nel file)
[global]
# il workgroup e il realm vanno impostati come sono impostati nel Domain Controller a cui vogliamo collegarci
workgroup = AD
realm = AD.SAMBALAB.INTERNAL
# l'autenticazione avviene su dominio AD
security = ADS
# Questi parametri vengono da una vecchia versione del Wiki di Samba.
# Credo che gli ultimi due possano essere tolti da Samba 4.22 (Debian 13)
# però ad oggi (2025) la documentazione mi sembra lacunosa
winbind refresh tickets = Yes
dedicated keytab file = /etc/krb5.keytab
kerberos method = secrets and keytab
# Winbind ha una cache locale dei dati degli account che prende dal DC
# Questa cache ha un timeout di default di 300 secondi, che possiamo ridurre
# se vogliamo che le modifiche a utenti e gruppi siano recepite prima
# però questo potrebbe causare un lieve calo di prestazioni.
# Possiamo vedere e flushare la cache con "net cache list" e "net cache flush"
# winbind cache time = 300
# Default ID mapping configuration for local BUILTIN accounts
# and groups on a domain member. The default (*) domain:
# - must not overlap with any domain ID mapping configuration!
# - must use a read-write-enabled back end, such as tdb.
idmap config * : backend = tdb
idmap config * : range = 3000-7999
# Mapping degli ID per il dominio AD a cui andiamo a joinare il server.
# notare che il dominio è indicato per nome (in questo caso e` "AD").
# Se abbiamo più domini,dovremo ripetere questa config usando ovviamente un range che NON sia il medesimo.
# questo mapping ci fornisce spazio per 999.999-10.000 = 989.999 utenti o gruppi.
# NOTA: un utente cancellato NON RECUPERA SPAZIO, quindi ogni modifica spreca comunque un ID
idmap config AD : backend = rid
idmap config AD : range = 10000-999999
# Template settings for login shell and home directory
# Gli utenti del dominio sono utenti validi per la macchina locale, e devono
# avere una shell e una home. Qui definisco quale shell e quale home hanno.
# Questa configurazione si applica solo se abbiamo lasciato abilitata l'autenticazione PAM
# tramite Winbind (a default è attiva)
template shell = /bin/bash
template homedir = /srv/home/%D/%U
# moduli e configurazioni necessarie per gestire i permessi sul file system
# in modo compatibile con Windows. I permessi speciali che ha solo Windows
# vengono salvati in attributi estesi.
vfs objects = acl_xattr
map acl inherit = Yes
store dos attributes = Yes
# solo per testing, enumera tutti i gruppi e users, è lento in produzione:
#winbind enum users = yes
#winbind enum groups = yes
# disabilito totalmente la gestione delle stampanti perché odio le stampanti
load printers = no
printing = bsd
printcap name = /dev/null
disable spoolss = yes
Una volta creati i files di configurazione, possiamo verificare di non avere fatto errori di battiutura usando il comando ''testparm'', che ci segnala eventuali voci di configurazione errate.
===== Join al dominio =====
Ora dovrei poter effettivamente joinare il dominio con il mio member server:
net ads join -U administrator
L'output dovrebbe essere una cosa del tipo:
Enter administrator's password:
Using short domain name -- DOMINIO
Joined 'FILESERVER01' to dns domain 'dominio.locale'
===== Avviare Samba =====
Notare che qui NON USIAMO samba-ad-dc ma i singoli componenti. Questo perché questa macchina NON È un domain controller. (tranquilli, all'avvio della macchina partono le cose giuste)
systemctl start smbd
systemctl start nmbd
systemctl status winbind
===== Testare la connessione con il domain controller =====
Ora testiamo approfonditamente la connessione con il domain controller:
wbinfo --ping-dc
Dovrebbe dare questo output:
checking the NETLOGON for domain[ML] dc connection to "dc01.dominio.locale" succeeded
I seguenti due comandi dovrebbero elencare utenti e gruppi del dominio (posto che abbiamo attivato in smb.conf winbind enum groups = Yes e winbind enum users = Yes)
wbinfo -u
wbinfo -g
I seguenti comandi testano l'integrazione di nsswitch con winbind, mostrando id e gruppi del dominio: (notare il doppio backslash!)
id DOMINIO\\administrator
getent passwd DOMINIO\\adminstrator
getent group "DOMINIO\\domain users"
===== Configurare gli share =====
Se tutto ha funzionato fino a qui, dovremmo essere in grado di aggiungere a smb.conf la definizione di uno o più share, e gestirli da Windows.