====== LDAP per Samba ======
Su Debian Lenny, questi i pacchetti installati:
* slapd
* ldap-utils
* libnss-ldap
* smbldap-tools
* samba
* samba-doc
Come preparare una directory LDAP per Samba. Istruzioni ricavate dai seguenti documenti:
* [[http://aput.net/~jheiss/samba/ldap.shtml|Samba and LDAP]]
===== Configurare smbldap-tools =====
Le operazioni sul database LDAP possono essere fatte manualmente con le varie utility (es. ldapmodify), ma avere degli script dedicati alle operazioni più comuni (aggiunta utente, cambio password, ...) risulta molto più comodo. Con un solo comando si potrà aggiungere un utente o modificare una password, mantenendo allineati gli account Unix e Samba.
Due sono i file di configurazione per queste utility:
* **''/etc/smbldap-tools/smbldap_bind.conf''** credenziali per accedere al server LDAP
* **''/etc/smbldap-tools/smbldap.conf''** informazioni su come è strutturato il database LDAP
Nel file smbldap_bind.conf vanno messe le credenziali di un utente che abbia **permesso di scrittura** su tutti gli attributi **posixAccount** e **sambaSamAccount**, se il database LDAP non contiene altre informazioni si possono quindi usare le credenziali dell'amministratore LDAP. Il file va protetto con permessi opportuni (es. **chmod 0600**).
===== Schemi LDAP richiesti =====
Il database LDAP deve contenere gli account Unix e Samba, conviene utilizzare le well-known objectClass **posixAccount** e **sambaSamAccount** definite rispettivamente negli schemi:
* **''/etc/ldap/schema/nis.schema''**
* **''/etc/ldap/schema/samba.schema''** (accluso come esempio al pacchetto samba-doc)
Per usare tali schemi è sufficiente usare la direttiva **include** in **''/etc/ldap/slapd.conf''**.
===== File .ldif per popolare il database LDAP =====
Partendo con un database vuoto, è necessario creare diversi oggetti nella gerarchia LDAP. Nei paragrafi che seguono vedremo ciascun oggetto sotto forma di file .ldif.
==== Utenti Unix ====
Anzitutto si crea l'Organizational Unit chiamata **People**:
dn: ou=People,dc=soluzioni,dc=per
ou: People
objectClass: top
objectClass: organizationalUnit
objectClass: domainRelatedObject
associatedDomain: soluzioni.per
Quindi si può aggiungere un account:
dn: uid=niccolo,ou=People,dc=soluzioni,dc=per
uid: niccolo
cn: Niccolo Rigacci
objectClass: account
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
userPassword: {crypt}*K*
shadowLastChange: 13877
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: 1000
gidNumber: 1000
homeDirectory: /home/niccolo
gecos: Niccolo Rigacci,,,
==== Gruppi Unix ====
Anzitutto si crea l'Organizational Unit chiamata **Group**:
dn: ou=Group,dc=soluzioni,dc=per
ou: Group
objectClass: top
objectClass: organizationalUnit
Quindi si aggiungono i singoli gruppi:
dn: cn=niccolo,ou=Group,dc=soluzioni,dc=per
objectClass: posixGroup
objectClass: top
cn: niccolo
userPassword: {crypt}x
gidNumber: 1000
==== Account per demone Samba ====
Il demone Samba deve accedere al database LDAP tramite un account, ecco il file .ldif che lo definisce. L'hash della password si genera con **''slappasswd(8)''**:
dn: cn=samba_servers,ou=People,dc=soluzioni,dc=per
objectClass: person
objectClass: uidObject
uid: samba_servers
description: Account used by Samba servers to access user passwords
cn: samba_servers
sn: samba_servers
userPassword: {SSHA}Pv1gzUlBn1WMOUs3mWzqY562ofz4JuFA
Questo account deve avere i privilegi necessari per accedere alle password Samba, mentre per gli utenti normali tale accesso deve essere impedito, una situazione molto simile all'attributo **userPassword** già previsto in una ACL predefinita di **''/etc/ldap/slapd.conf''**.
Inoltre l'account deve avere accesso in scrittura ad altri attributi dello schema Samba. Per ottenere l'effetto desiderato dovrebbero bastare queste due ACL da mettere in **''/etc/ldap/slapd.conf''**. **Attenzione**: le ACL vengono processate in ordine, quindi l'ordine è importante. Vedere man **''slapd.access(5)''**.
# We store Samba password here, protect them as needed.
access to attrs=sambaLMPassword,sambaNTPassword,sambaPwdLastSet,sambaPwdMustChange,sambaPasswordHistory
by dn="cn=admin,dc=soluzioni,dc=per" write
by dn.exact="cn=samba_servers,ou=People,dc=soluzioni,dc=per" write
by anonymous auth
by self write
by * none
# Samba daemon needs write access to other object too.
access to attrs=sambaAcctFlags,sambaMaxPwdAge,sambaPwdHistoryLength
by dn.exact="cn=samba_servers,ou=People,dc=soluzioni,dc=per" write
by * break
==== Dominio ====
Il **dominio** stesso ha bisogno di una **entry nel database LDAP**. Conviene far generare automaticamente a Samba il **SID** ([[wp>Security_Identifier|Windows Security Identifier]]) per il dominio e poi aggiungere il record completo al database LDAP. Se Samba ha i permessi sufficienti provvede automaticamente ad aggiornare LDAP.
Samba - poco dopo che ''smbd'' è avviato - genera automaticamente un SID per il server (parametro **''netbios name''** di ''smb.conf'') e uno per il dominio (parametro **''workgroup''**), nel caso di un Primary Domain Controller i due SID coincidono. I due SID vengono memorizzati automaticamente in un database TDB contenuto nel file ''/var/lib/samba/secrets.tdb''; è possibile verificarlo con il comando **''tdbdump''**:
tdbdump /var/lib/samba/secrets.tdb
purtroppo in questo modo il SID viene visualizzato in formato binario, non in formato decimale come serve per l'inserimento in LDAP. In caso di bisogno si può [[..:tux:samba#manipolare_il_database_tdb|manipolare il contenuto del TDB]] con **''tdbtool''**.
Per fortuna esiste il comando **''net GETLOCALSID''** che via protocollo smb recupera il SID di host o di dominio:
net GETLOCALSID
net GETLOCALSID INTRANET
Determinato il SID è possibile aggiungere il record necessario in LDAP, ecco un esempio di file .ldif:
dn: sambaDomainName=INTRANET,dc=rigacci,dc=org
objectClass: sambaDomain
sambaDomainName: INTRANET
sambaSID: S-1-5-21-507755589-3346621370-1365447521
Se si desidera **modificare il SID di dominio** (ad esempio per riusare il vecchio SID durante una migrazione) bisogna **rimuovere il record ''sambaDomainName''** da LDAP, modificare il contenuto del TDB con il comando **''net''** e aggiungere nuovamente il record modificato in LDAP. Ecco la sintassi del comando ''net'':
net SETLOCALSID 'S-1-5-21-3078664134-1849280537-1714055725'
net SETDOMAINSID 'S-1-5-21-3078664134-1849280537-1714055725'
==== Utenti Samba ====
Questi sono gli attributi Samba necessari per completare un account Unix:
dn: uid=niccolo,ou=People,dc=soluzioni,dc=per
objectClass: sambaSamAccount
sambaAcctFlags: [U ]
sambaLMPassword: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
sambaNTPassword: yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
sambaSID: S-1-5-21-507755589-3346621370-1365447521-3000
La parte iniziale del **sambaSID** è il SID del dominio (vedi sopra), mentre la parte più a destra può essere calcolata con questa formula (usata dai tool ''smbldap-tools''): **UID * 2 + 1000**.
Per generare le password esisterebbe l'utility **''mkntpwd''** che però non è pacchettizzata Debian. Altrimenti si mette una password fittizia (come nell'esempio sopra) e si usa poi il comando **''smbldap-passwd''** per impostare le sole password Samba:
smbldap-passwd -s niccolo
Se Samba è configurato opportunamente si può anche usare il classico **''smbpasswd''** e questo modificherà la password direttamente sul database LDAP.
==== Host (computer) ====
===== Configurazione Samba =====
Si aggiunge la password per accedere al server LDAP al database TDB delle password di Samba (''/var/lib/samba/secrets.tdb''):
smbpasswd -w mySecret
Per vedere il contenuto del file TDB si usa **''tdbdump''** contenuto nel pacchetto **''tdb-tools''**:
tdbdump /var/lib/samba/secrets.tdb
Nei seguenti paragrafi l'elenco delle principali voci di configurazione da impostare in **''/etc/samba/smb.conf''**.
**''passdb backend''**
passdb backend = ldapsam:ldap://127.0.0.1/
**''ldap admin dn''**
ldap admin dn = cn=samba_servers,ou=People,dc=rigacci,dc=org
**''ldap suffix''**
**''ldap group suffix''**
**''ldap user suffix''**
**''ldap machine suffix''**
**''ldap passwd sync''**
Con questa opzione si configura la gestione delle password interna di Samba. A seguito di una richiesta di cambio password via Samba (ed esempio con il comando **''smbpasswd''**), il demone può comportarsi in tre modi diversi:
^ ldap passwd sync ^^
^ Yes | Modifica gli attributi **sambaLMPassword**, **sambaNTPassword**, **sambaPwdLastSet** e **userPassword**. |
^ No | Modifica gli attributi **sambaLMPassword**, **sambaNTPassword** e **sambaPwdLastSet**. |
^ Only | Non cambia gli attributi LDAP, bug? :?: |
**ATTENZIONE:** se l'utilizzo delle vecchie password LanManager è disabilitato (è l'impostazione di default: **''lanman auth = no''**), il demone Samba - quando si modifica un account nel database LDAP - provvede a rimuovere l'attributo **sambaLMPassword**! :!: Invece i **smbldap-tools** aggiungono sempre tale attributo.
==== LDAP samba.schema ====
^ sambaLMPassword | LanManager Password. Weak encryption: easily cracked sniffing the network. It is displayed as the 3rd field of the **''pdbedit -L -w''** output. |
^ sambaNTPassword | MD4 hash of the unicode password. The password is hashed without a salt, the encryption is weak (search for Rainbow Tables for brute force crack). It is displayed as the 4th field of the **''pdbedit -L -w''** output. |