Su Debian Lenny, questi i pacchetti installati:
Come preparare una directory LDAP per Samba. Istruzioni ricavate dai seguenti documenti:
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 LDAPNel 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).
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
.
Partendo con un database vuoto, è necessario creare diversi oggetti nella gerarchia LDAP. Nei paragrafi che seguono vedremo ciascun oggetto sotto forma di file .ldif.
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,,,
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
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
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'
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.
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.
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. |