lunedì 15 marzo 2010

Acrobazie LDAP

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!

Nessun commento:

Posta un commento