====== Samba Active Directory ======
Come installare un host **Samba** con funzioni di **Active Directory Domain Controller **. Installazione testata su **Debian 10 Buster** con **Samba 4.9.5**.
===== Scelta del nome del dominio =====
Sembra una banalità, ma non lo è perché cambiare nome ad un dominio esistente è operazione molto complessa, inoltre vi sono delle restrizioni rispetto al nome dell'host e vi è interazione fra il realm Kerberos e il DNS. In generale si devono individuare i seguenti nomi:
^ Nome ^ Esempio ^ Funzione ^
| Domain | RIGACCI-DOM | È il nome del **dominio Active Directory**, generalmente maiuscolo. Deve essere diverso dal nome NetBIOS dell'host. |
| Nome NetBIOS | RIGACCI-AD | Si tratta del nome da assegnare all'host che avrà funzione di DC, si tratta del nome breve **NetBIOS** che generalmente è maiuscolo. Per comodità conviene assegnare lo stesso nome (però in minuscolo) anche come **hostname Unix**. |
| Realm Kerberos | RIGACCI-DOM.RIGACCI.ORG | Simile ad una zona DNS, è il **suffisso che raggruppa gli host appartenenti al dominio AD**. Eventualmente può avere radice uguale a un dominio DNS appartenente alla stessa organizzazione. In genere il realm si esprime in maiuscolo, mentre la zona DNS è in minuscolo. È consigliabile che il nome del realm non sia risolto a livello di DNS pubblico, mentre nel dominio la risoluzione dei nomi - se fallisce nel realm Kerberos - viene tentata sul DNS. |
| Server Kerberos | rigacci-ad.rigacci-dom.rigacci.org | È il **nome DNS dell'host** che fornisce il servizio **Kerberos**. Nel nostro caso è la stessa macchina Samba. |
===== Hostname e Resolv =====
Si imposta il nome Unix in **/etc/hostname** e una risoluzione statica dal nome all'indirizzo IP sulla LAN in **/etc/hosts**:
127.0.0.1 localhost.localdomain localhost
10.0.1.190 rigacci-ad.rigacci-dom.rigacci.org rigacci-ad
===== DNS server =====
Nella configurazione Active Directory Domain Controller, Samba si porrà in ascolto sulla porta 53 e fornirà il servizio di DNS, pertanto è necessario eventualmente fermare e disabilitare Bind:
systemctl stop bind9.service
systemctl disable bind9.service
Il file **/etc/resolv.conf** si imposta come segue (usando i resolver di Cloudflare e Google come fallback):
domain rigacci-dom.rigacci.org
nameserver 127.0.0.1
nameserver 1.1.1.1
nameserver 8.8.8.8
È opportuno anche creare una zona DNS reverse:
samba-tool dns zonecreate 10.0.1.190 1.0.10.in-addr.arpa --username='administrator'
Password for [RIGACCI-DOM\administrator]:
Zone 1.0.10.in-addr.arpa created successfully
===== Installazione pacchetti Debian =====
Si installano i seguenti pacchetti Debian:
apt-get install samba krb5-config winbind smbclient
Durante l'installazione viene configurato il sistema Kerberos, se è necessario si può ripetere la configurazione con **dpkg-reconfigure krb5-config**. Durante l'installazione vengono richieste tre informazioni (vedere la [[#scelta_del_nome_del_dominio|tabella sopra]]):
* Default Kerberos realm.
* Hostnames of Kerberos servers, nel nostro caso se ne indica uno solo.
* Hostname of the administrative (password changing) server, nel nostro caso coincide con l'unico Kerberos server.
La configurazione viene salvata in **/etc/krb5.conf**.
===== Creazione (provisioning) del dominio =====
Esiste il tool specifico per creare il dominio, si tratta di **samba-tool**. Prima di utilizzarlo è opportuno creare un ambiente "pulito" fermando i processi in esecuzione e cancellando ogni eventuale configurazione.
=== Fermare i processi ===
In genereale con questi comandi si verifica se ci sono processi in esecuzione e li si arresta:
ps ax | egrep "samba|smbd|nmbd|winbindd"
systemctl stop winbind smbd nmbd
=== Eliminare la configurazione preesistente ===
È possibile interrogare Samba per sapere quale è il file e le directory di configurazione:
smbd -b | grep "CONFIGFILE"
CONFIGFILE: /etc/samba/smb.conf
smbd -b | egrep "LOCKDIR|STATEDIR|CACHEDIR|PRIVATE_DIR"
LOCKDIR: /var/run/samba
STATEDIR: /var/lib/samba
CACHEDIR: /var/cache/samba
PRIVATE_DIR: /var/lib/samba/private
Quindi si rimuove ogni configurazione:
mv /etc/samba/smb.conf /etc/samba/smb.conf.dist
rm /var/run/samba/*.tdb
rm /var/run/samba/*.ldb
rm /var/lib/samba/*.tdb
rm /var/lib/samba/*.ldb
rm /var/cache/samba/*.tdb
rm /var/cache/samba/*.ldb
rm /var/lib/samba/private/*.tdb
rm /var/lib/samba/private/*.ldb
=== Creazione del dominio ===
Il comando **samba-tool domain provision** provvede a verificare la correttezza dei parametri e a creare i file di configurazione:
samba-tool domain provision \
--use-rfc2307 \
--realm=RIGACCI-DOM.RIGACCI.ORG \
--domain=RIGACCI-DOM \
--server-role=dc \
--dns-backend=SAMBA_INTERNAL \
--adminpass=MySuperS3cret \
--option="interfaces=lo eth0" \
--option="bind interfaces only=yes"
Vengono mostrate alcune informazioni di riepilogo:
Server Role: active directory domain controller
Hostname: rigacci-ad
NetBIOS Domain: RIGACCI-DOM
DNS Domain: rigacci-dom.rigacci.org
DOMAIN SID: S-1-5-21-473854151-3979321753-9043109535
Vengono creati diversi file:
* **/etc/samba/smb.conf**
* **%%/var/lib/samba/*.tdb%%**
* **%%/var/run/samba/*.tdb%%**
* **%%/var/cache/samba/*.tdb%%**
* **/var/lib/samba/private/krb5.conf**
Il file **/var/lib/samba/private/krb5.conf** deve essere travasato (merge) in quello di sistema **/etc/krb5.conf**.
Verificare in **/etc/samba/smb.conf** che siano stati indicati correttamente i DNS forwarder (dovrebbero essere stati dedotti da /etc/resolv.conf):
dns forwarder = 1.1.1.1 8.8.8.8
===== Abilitazione del servizio =====
L'installazione predefinita Debian imposta il serivizio Active Directory Domain Controller in modalità **masked**, cioè non attivo e impossibile da avviare da altri servizi (la unit è symlinkata a /dev/null):
systemctl -p LoadState --value show samba-ad-dc.service
masked
Si deve fermare e disabilitare i servizi Samba standard (quelli usati in modalità NON Active Directory), quindi avviare e abilitare Samba AD-DC:
systemctl stop smbd nmbd winbind
systemctl disable smbd nmbd winbind
systemctl unmask samba-ad-dc
systemctl start samba-ad-dc
systemctl enable samba-ad-dc
===== Verifica stato del servizio =====
Verificare che sia in esecuzione:
systemctl status samba-ad-dc
Devono risultare in esecuzione i processi
* /usr/sbin/winbindd
* /usr/sbin/smbd
Il comando **samba-tool** fornisce informazioni sulla configurazione del dominio (non sullo stato di attività):
samba-tool domain level show
Domain and forest function level for domain 'DC=rigacci-dom,DC=rigacci,DC=org'
Forest function level: (Windows) 2008 R2
Domain function level: (Windows) 2008 R2
Lowest function level of a DC: (Windows) 2008 R2
Con **smbclient** si dovrebbero ottenere queste informazioni:
smbclient -L localhost -U% -N
Sharename Type Comment
--------- ---- -------
netlogon Disk
sysvol Disk
IPC$ IPC IPC Service (Samba 4.9.5-Debian)
Reconnecting with SMB1 for workgroup listing.
Server Comment
--------- -------
Workgroup Master
--------- -------
WORKGROUP RIGACCI-AD
Gli share **netlogon** e **sysvol** sono stati creati durante il provisioning e devono esistere su un DC.
===== Verifica risoluzione DNS =====
Si deve verificare la risoluzione dei nomi da parte di Samba. La richiesta per il record **SRV _ldap** deve risolvere nel nome del Domain Controller. La richiesta per il record di tipo A deve ovviamente risolvere nell'IP:
host -t SRV _ldap._tcp.rigacci-dom.rigacci.org.
_ldap._tcp.rigacci-dom.rigacci.org has SRV record 0 100 389 rigacci-ad.rigacci-dom.rigacci.org.
host -t A rigacci-ad.rigacci-dom.rigacci.org.
rigacci-ad.rigacci-dom.rigacci.org has address 10.0.1.190
Anche la richiesta per il record **SRV _kerberos** deve puntare al DC:
host -t SRV _kerberos._udp.rigacci-dom.rigacci.org.
_kerberos._udp.rigacci-dom.rigacci.org has SRV record 0 100 88 rigacci-ad.rigacci-dom.rigacci.org.
Verificare che Samba si comporti anche come un resolver ricorsivo:
host www.rigacci.org
www.rigacci.org has address 176.9.39.130
www.rigacci.org has IPv6 address 2a01:4f8:150:5091::2
===== Porte firewall =====
Il Samba Domain Controller riceve dai client richieste per diversi servizi, che richiedono l'apertura di alcune porte sul firewall, in particolare conviene aprire:
^ Servizio ^ Porta ^
| domain | 53 tcp/udp |
| ldap | 389 tcp/udp |
| microsoft-ds | 445 tcp/udp |
| netbios-ssn | 139 tcp/udp |
| epmap | 135 tcp/udp |
===== Test logon come Administrator =====
È necessaria la password indicata durante il provisioning:
smbclient //localhost/netlogon -UAdministrator -c 'ls'
Enter KOSTELIA-DOM\Administrator's password:
. D 0 Fri Aug 20 17:33:05 2021
.. D 0 Fri Aug 20 17:33:08 2021
===== Creazione utente =====
samba-tool user create niccolo.rigacci
New Password: MySecret
L'utente NON viene aggiunto come utente Unix. Verificare che esista interrogando **pdbedit** e/o **wbinfo**:
pdbedit -L -w
wbinfo -i 'niccolo.rigacci'
Verificare che il logon funzioni:
smbclient -L //localhost/netlogon -Uniccolo.rigacci%MySecret
===== Gestione utenti e gruppi =====
Per elencare utenti e gruppi esistenti si può usare **samba-tool**:
samba-tool user list
samba-tool group list
oppure **wbinfo** (l'opzione relativa al domain è necessaria per mostrare sia i gruppi BUILTIN che quelli specifici, nel nostro caso il dominio RIGACCI-DOM):
wbinfo -u
wbinfo --domain='*' -g
Per aggiungere o togliere un utente al gruppo Administrators
samba-tool group addmembers "Administrators" niccolo.rigacci
samba-tool group removemembers "Administrators" niccolo.rigacci
Altri comandi utili:
samba-tool user delete username
samba-tool user setpassword username
samba-tool user setpassword username --newpassword="NewSecret"
samba-tool user setexpiry username --days=7
samba-tool user disable username
samba-tool user enable username
samba-tool group list
samba-tool group add 'Unix Admins'
samba-tool group listmembers 'Domain Admins'
samba-tool group listmembers 'Domain Users'
===== Accesso in Remote Desktop =====
Come impostazione predefinita solo gli utenti del gruppo **Domain Admins** possono accedere in dekstop remoto ad un host del dominio Active Directory; contrariamente a quanto ci si potrebbe aspettare **non è sufficiente** appartenere al gruppo **Remote Desktop Users**.
Per abilitare l'accesso al gruppo //Remote Desktop Users// è necessario sulla singola macchina eseguire **secpol.msc** e quindi seguire **Allow log on through Remote Desktop Services** => **Add Users or Group** e aggiungere il gruppo.
Solo dopo questa impostazione **da fare su ogni singola macchina** sarà sufficiente aggiungere l'utente del dominio al gruppo opportuno:
samba-tool group addmembers "Remote Desktop Users" niccolo.rigacci
===== Integrazione di utenti e gruppi Samba in Unix =====
Grazie al demone **winbindd** e con l'aggiunta della libreria contenuta nel pacchetto Debian **libnss-winbind** è possibile utilizzare in ambiente Unix gli utenti e i gruppi definiti nel dominio Samba. È sufficiente configurare opportunamente il **Name Service Switch** aggiungendo il service ''winbind'' a **/etc/nsswitch.conf**:
passwd: compat systemd winbind
group: compat systemd winbind
Diventa quindi possibile utilizzare ad esempio il comando **chown**:
chown niccolo.rigacci test-file
ls -l test-file
-rw-r--r-- 1 RIGACCI-DOM\niccolo.rigacci root 0 Aug 23 09:29 test-file
È possibile vedere lo UID Unix generato automaticamente da Winbind per ciascun utente utilizzando il comando:
root@kostelia-ad:~# wbinfo -i niccolo.rigacci
RIGACCI-DOM\niccolo.rigacci:*:3000019:100::/home/RIGACCI-DOM/niccolo.rigacci:/bin/false
===== Opzioni dominio =====
samba-tool domain passwordsettings show
Password informations for domain 'DC=rigacci-dom,DC=rigacci,DC=org'
Password complexity: on
Store plaintext passwords: off
Password history length: 24
Minimum password length: 7
Minimum password age (days): 1
Maximum password age (days): 42
Account lockout duration (mins): 30
Account lockout threshold (attempts): 0
Reset account lockout after (mins): 30
Con questo comando si disabilita l'opzione che impone password complesse:
samba-tool domain passwordsettings set --complexity=off
===== Windows 10 join a dominio =====
=== Impostare DNS ===
È necessario che la macchina Windows usi come server DNS il Samba Domain Controller, in modo che possa risolvere l'indirizzo IP del server LDAP, ecc.
* Pannello di controllo => Rete e Internet
* Centro connessioni di rete e condivisione => Modifica impostazioni scheda (a sx dello schermo)
* Scheda di rete => click destro => Proprietà => Protocollo TCP/IP v4 => Proprietà
* DNS => Impostare l'indirizzo IP del Samba AD-DC, nel nostro esempio **10.0.1.190**
=== Impostare suffisso DNS ===
* Pannello di controllo => Rete e Internet
* Centro connessioni di rete e condivisione => Modifica impostazioni scheda (a sx dello schermo)
* Scheda di rete => click destro => Proprietà => Protocollo TCP/IP v4 => Proprietà
* Avanzate
* DNS => Suffisso DNS: Dominio DNS, nel nostro esempio **rigacci.org**
=== Join dominio ===
* Pannello di controllo => Sistema e sicurezza => Sistema => Impostazioni di sistema avanzate
* Nome computer
* Per rinominare il computer oppure modificare il suo dominio... => Cambia
* Dominio: Nome del dominio, es. **RIGACCI-DOM**
=== Risuluzione problemi ===
Durante il join a dominio può essere utile verificare le richieste DNS che vengono fatte al Domain Controller (ad esempio con **tcpdump**). La procedura prevede di interrogare per diversi record di tipo SRV, uno dei problemi più frequenti è il suffisso DNS che viene aggiunto automaticamente in coda al record.
tcpdump -i eth0 -n 'port 53'
=== Verifica ===
Dopo aver fatto il join, sul Domain Controller Samba si può verificare che il PC risulti correttamente aggiunto con:
samba-tool computer list
===== Windows 10 logon a dominio =====
Alla schermata di avvio di Windows si utilizza la seguente sintassi **DOMINIO\username** per effettuare il logon a dominio, nel nostro esempio **RIGACCI-DOM\niccolo.rigacci**.
Per verificare le credenziali con cui si è fatto accesso: **Pulsante Windows** => **Impostazioni** => **Account** => **Le tue info**.
Per accedere invece con utente locale del PC si usa la sintassi **NOMEPC\username**.
===== Modifica record LDB di un utente =====
Le informazioni che riguardano gli utenti sono contenute in un database **LDB**. È è possibile utilizzare il comando **ldbedit** (fornito dal pacchetto Debian **ldb-tools**) per visualizzare e modificare direttamente il contenuto di un record:
ldbedit -H /var/lib/samba/private/sam.ldb 'sAMAccountName=niccolo.rigacci'
Viene lanciato l'editor (**$VISUAL** oppure **vi**) ed è possibile correggere o aggiungere campi. Ad esempio è possibile aggiungere il percorso per il profilo roaming (**senza slash finale**):
profilePath: \\server\profiles\niccolo.rigacci
===== Attivare i profili roaming =====
È necessario creare la directory che conterrà i profili utente e condividerla con uno share di nome **profiles**. Nel file **/etc/samba/smb.conf** aggiungere la sezione:
[profiles]
path = /home/samba/profiles
read only = no
La directory **/home/samba/profiles** deve avere **mode 2775** e appartenere a **root:users**. Non è necessario riavviare il servizio, la modifica al file viene riconosciuta al volo e resa attiva.
=== Attivazione per il singolo utente ===
Per attivare il profilo roaming per un **singolo utente** è sufficiente aggiungere l'attributo **profilePath** al record LDB di quell'utente. Sull'host Samba Active Directory si esegue:
ldbedit -H /var/lib/samba/private/sam.ldb 'sAMAccountName=niccolo.rigacci'
quindi si aggiunge l'attributo:
profilePath: \\server\profiles\niccolo.rigacci
Questa impostazione è sufficiente ad ottenere il profilo roaming, non è necessario alcuna modifica alla configurazione del singolo host. In alternativa alla riga di comando GNU/Linux si può utilizzare il programma Windows **Active Directory Users and Computers**.
=== Attivazione per tutti gli utenti di un computer ===
**ATTENZIONE**: Questa ricetta non attiva il profilo roaming per tutti gli utenti del dominio, ma per tutti gli utenti che si collegano **ad un certo computer**.
Per attivare il profilo roaming per **tutti gli utenti** del dominio si può utilizzare il programma Windows chiamato **Group Policy Management Console**, che ovviamente richiede i privilegi di Administrator. Seguendo il percorso //Computer Configuration// => //Policies// => //Administrative Templates// => //System// => **User Profiles** si arriva alla dialog box **Set roaming profile path for all users logging onto this computer**.
Nella versione italiana: si cerca **Modifica Criteri di gruppo**, viene trovato ed avviato l'**Editor Criteri di gruppo locali**, quindi => //Criteri Computer locale// => //Configurazione computer// => //Modelli amministrativi// => //Sistema//
=> //Profili utente// si arriva a **Imposta percorso profilo mobile per tutti gli utenti che accedono al computer**.
Nell'apposita edit box sarà sufficiente aggiungere qualcosa del tipo:
\\SERVER\PROFILES\%USERNAME%
===== Web References =====
* **[[https://www.server-world.info/en/note?os=Debian_10&p=samba&f=4|Configute Samba Active Directory Domain Controller]]**
* **[[https://wiki.samba.org/index.php/Setting_up_Samba_as_an_Active_Directory_Domain_Controller|Setting up Samba as an Active Directory Domain Controller]]**
* **[[https://wiki.samba.org/index.php/User_and_Group_management|User and Group management]]**