Table of Contents

LDAP per Samba

Su Debian Lenny, questi i pacchetti installati:

Come preparare una directory LDAP per Samba. Istruzioni ricavate dai seguenti documenti:

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:

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:

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 (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ò 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.