====== 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. |