In questi giorni ho potuto apprezzare una volta di più la
flessibilità dei sistemi operativi basati su
linux (o unix in generale), specie quando devi compiere operazioni di
amministrazione di sistema un po’ fuori dal normale.
In questo caso sto gestendo la
migrazione degli utenti di un server che era basato su una vecchia versione di
Mandriva, e gestiva il database utenti su un server
LDAP utilizzando una serie di script (
smbldap) da tempo non supportati, migrando il tutto su un nuovo server con
openSUSE 11.2. L’obiettivo è continuare ad utilizzare un backend LDAP, ma rimappando la rappresentazione dei dati (il cosiddetto
schema LDAP) secondo quanto gestito nativamente dall’ottimo strumento di amministrazione
YaST proprio di openSUSE.
Durante la migrazione volevo anche cambiare il
login name di alcuni utenti (principalmente come blanda misura antispam) e cancellare altri utenti, non più necessari. Il tutto senza conoscere la password di nessuno, quindi dovevo preservare tutte le password presenti.
LDAP è una di quelle cose che devi affrontare
poco per volta, è un
directory server di cui la documentazione ti dice tutto ciò che ti server per creare dei fantasmagorici
schema personalizzati, e come interrogarli con query anche molto complesse. Ma nessuno ti dice chiaramente come le varie distribuzioni Linux memorizzano i dati degli
utenti al suo interno.
O meglio, le informazioni ci sono, anche se poco leggibili, nelle
RFC 2256 (A Summary of the X.500(96) User Schema for use with LDAPv3) e
RFC 2307 (An Approach for Using LDAP as a Network Information Service). Devi solo leggerle 3 volte, per capire che tutta l’informazione relativa ad un utente si può riassumere in:
dn: uid=loginname,ou=people,dc=cad,dc=polito,dc=it
objectClass: top
objectClass: inetOrgPerson
objectClass: posixAccount
cn: Nome Cognome
sn: Cognome
givenName: Nome
uid: loginname
uidNumber: 12345
gidNumber: 13254
homeDirectory: /home/loginname
loginShell: /bin/bash
userPassword:: e1NTS********dYUmw=
I campi in corsivo sono quelli relativi ad ogni singolo utente, e la userPassword ovviamente è stata modificata per motivi di sicurezza.
Non rimane che creare un bel file di
testo contenente esattamente queste informazioni, esportando dal server LDIF precedente quanto serviva, eliminare gli attributi non più utilizzati, rinominare gli attributi che venivano usati in modo diverso nei due
schema, ed infine eliminare gli utenti non più desiderati. Alla fine si importa tutto nel nuovo server LDIF, et voilà, login al primo colpo!
I vari passaggi seguiti non sono così interessanti da esser divulgati qui, ma voglio segnalare i principali
tool utilizzati:
- per esportare i dati da un server LDAP usiamo ldapsearch
ldapsearch -L -x -D 'cn=Administrator,dc=cad,dc=polito,dc=it' -W \
-b 'ou=Users,dc=cad,dc=polito,dc=it' '(objectclass=posixAccount)'
- per eliminare gli attributi non desiderati, niente di meglio di una serie di grep –v
ldapsearch -L -x -D 'cn=Administrator,dc=cad,dc=polito,dc=it' -W \
-b 'ou=Users,dc=cad,dc=polito,dc=it' '(objectclass=posixAccount)'
- per rinominare attributi o valori, un po’ di sed e di regular expression
sed 's/uid=\(.*\),ou=Users/uid=\1,ou=people/'
- infine, per i ritocchi manuali, il grande ldapvi
ldapvi -D cn=Administrator,dc=cad,dc=polito,dc=it
Provate a fare lo stesso su un sistema Windows!