OpenLdap System Guide HowTo
From ImoLUGPedia
Io possiedo un vecchio Motorola RAZR v3 e da sempre mi sarebbe piaciuto avere da qualche parte una sorta di megarubrica con numeri di cellulare mail id per icq e via discorrendo: col lavoro che faccio se perdo i contatti posso benissimo pensare di cambiare mestiere... Per cui, approfittando di un periodo di influenza, mi sono messo a studiare!
Contents |
Software necessario
- Berkeley DB versione 4.7 che ora si scarica qui dal sito di Oracle
- Versione aggiornata e stabile: OpenLDAP 2.4.13
Configurazione
Berkeley DB
Come descritto nella mailing list di openldap per evitare problemi bisogna installare le patch per il berkeley db di oracle ed una per il db contenuta nell'openldap.
La patch nell'openldap si trova in build/db.4.7.25.patch del pacchetto, ma siccome mi pare che la patch contenuta nel pacchetto openldap sia analoga alla patch numero 2 ufficiale di oracle, non la applicherò.
Le patch del db sono tre allo stato attuale e riguardano l'uso delle sequence, la gestione dei lock e la gestione dei deadlock:
ldap:/srv/SRC/BDB/db-4.7.25 # patch -p0 < ../patch.4.7.25.1 (Stripping trailing CRs from patch.) patching file sequence/sequence.c ldap:/srv/SRC/BDB/db-4.7.25 # patch -p0 < ../patch.4.7.25.2 (Stripping trailing CRs from patch.) patching file lock/lock.c Hunk #1 succeeded at 1274 (offset -4 lines). Hunk #2 succeeded at 1469 (offset -3 lines). ldap:/srv/SRC/BDB/db-4.7.25 # patch -p0 < ../patch.4.7.25.3 (Stripping trailing CRs from patch.) patching file lock/lock_deadlock.c
ldap:/srv/SRC/BDB/db-4.7.25/build_unix # ../dist/configure ldap:/srv/SRC/BDB/db-4.7.25/build_unix # make ldap:/srv/SRC/BDB/db-4.7.25/build_unix # make install
aggiunta la libreria di installazione dentro ld.so.conf ed eseguito ldconfig
OpenLDAP
ldap:/srv/SRC/LDAP/openldap-2.4.13 # export CPPFLAGS="-I/usr/local/BerkeleyDB.4.7/include" ldap:/srv/SRC/LDAP/openldap-2.4.13 # export LDFLAGS="-rpath=/usr/lib:/usr/local/BerkeleyDB.4.7/lib -L/usr/local/BerkeleyDB.4.7/lib" ldap:/srv/SRC/LDAP/openldap-2.4.13 # ./configure --prefix=/srv/openldap ldap:/srv/SRC/LDAP/openldap-2.4.13 # make depend ldap:/srv/SRC/LDAP/openldap-2.4.13 # make ldap:/srv/SRC/LDAP/openldap-2.4.13 # make test ldap:/srv/SRC/LDAP/openldap-2.4.13 # make install
configurazione dell'ldap
ldap:/srv/openldap/var/openldap-data # cp DB_CONFIG.example DB_CONFIG
ldap:/srv/openldap/etc/openldap # cat slapd.conf
include /srv/openldap/etc/openldap/schema/core.schema
include /srv/openldap/etc/openldap/schema/cosine.schema
include /srv/openldap/etc/openldap/schema/inetorgperson.schema
pidfile /srv/openldap/var/run/slapd.pid
argsfile /srv/openldap/var/run/slapd.args
#Accesso a RootDSE
access to dn.base="" by * read
access to dn.base="cn=Subschema" by * read
access to *
by self write
by users read
by anonymous auth
#Protezione dell'attributo Password
access to attrs=userPassword
by anonymous auth
by self write
by * none
#Ciascuno modifica solo la sua roba
access to *
by self write
by * none
database hdb
suffix "dc=example,dc=it"
rootdn "cn=Manager,dc=exeample,dc=it"
rootpw {SSHA}UpqZsg7f6dfmT+Y3Y+vf0OG2b6naaUgk
directory /srv/openldap/var/openldap-data
index objectClass eq
database monitor
Tanto per darmi un tono costruisco una gerarchia che contenga la classe contatti per metterci tutte le mie vcard:
ldap:/srv/openldap/etc/openldap # cat initial-example.it.ldif
dn: dc=example,dc=it dc: exampleIT description: Per ora domino personale, ma sono fiducioso diventerà il mio impero commerciale. objectClass: dcObject objectClass: organization o: LisCO, snc dn: ou=contact, dc=example,dc=it ou: contact description: Tutti i contatti objectclass: organizationalunit
e la carico dentro il db. Nota che il DB è già stato precaricato con le strutture internal quando abbiamo eseguito il make test.
Le strutture interne create sono sostanzialmente quelle facenti parte del rootDSE:
- dn=""
- dn="Subschema"
ldap:/srv/openldap/etc/openldap # ../../sbin/slapadd -c -v -f ./slapd.conf -l initial-example.it.ldif
hdb_monitor_db_open: monitoring disabled; configure monitor database to enable added: "dc=example,dc=it" (00000001) added: "ou=contact,dc=example,dc=it" (00000002)
verifico
ldap:/srv/openldap/etc/openldap # ../../sbin/slapcat -f ./slapd.conf
dn: dc=example,dc=it dc: exampleIT dc: example description:: UGVyIG9yYSBkb21pbm8gcGVyc29uYWxlLCBtYSBzb25vIGZpZHVjaW9zb2RpdmVu dGVyw6AgaWwgbWlvIGltcGVybyBjb21tZXJjaWFsZS4= objectClass: dcObject objectClass: organization o: LisCO, snc structuralObjectClass: organization entryUUID: 1376ef08-6f5f-102d-9553-45940db94136 creatorsName: cn=Manager,dc=example,dc=it createTimestamp: 20090105102636Z entryCSN: 20090105102636.611619Z#000000#000#000000 modifiersName: cn=Manager,dc=example,dc=it modifyTimestamp: 20090105102636Z dn: ou=contact,dc=example,dc=it ou: contact description: Tutti i contatti objectClass: organizationalUnit structuralObjectClass: organizationalUnit entryUUID: 1386c46e-6f5f-102d-9554-45940db94136 creatorsName: cn=Manager,dc=example,dc=it createTimestamp: 20090105102636Z entryCSN: 20090105102636.715482Z#000000#000#000000 modifiersName: cn=Manager,dc=example,dc=it modifyTimestamp: 20090105102636Z
Sicurezza e Connessioni client
Sicurezza
Configuro la sicurezza per l'accesso del Manager
ldap:/srv/openldap/etc/openldap # ../../sbin/slappasswd
inserisco due volte la password desiderata e viene generata una stringa come
{SSHA}UpqZsg7f6dfmT+Y3Y+vf0OG2b6naaUgk
che poi andrò ad inserire nella direttiva rootpw di slapd.conf
Client
Modifico la configurazione del client locale:
ldap:/srv/openldap/etc/openldap # cat ldap.conf
URI ldap://localhost BASE dc=example,dc=it BINDDN cn=Manager,dc=example,dc=it
SIZELIMIT 0 TIMELIMIT 0
e provo ad interrogare il server
ldap:/srv/openldap/etc/openldap # ldapsearch -v -L -x -D 'cn=Manager,dc=example,dc=it' -W -b 'dc=example,dc=it'
mi chiede la password di Manager e tutto va liscio
Accesso via WEB
Sulla macchina con la sezione di hosting installo PHPLDAPADMIN 0.9.8.5
www:/srv/www/htdocs/example.it # mkdir phpldapadmin
e ci copio il contenuto del pacchetto. Poi vado a personalizzare l'applicazione:
www:/srv/www/htdocs/example.it/phpldapadmin/config # cat config.php
...
$ldapservers->SetValue($i,'server','name','LDAP 01');
$ldapservers->SetValue($i,'server','host','ldap');
$ldapservers->SetValue($i,'server','port','389');
$ldapservers->SetValue($i,'server','tls',false);
$ldapservers->SetValue($i,'server','auth_type','session');
$ldapservers->SetValue($i,'login','dn','cn=Manager,dc=example,dc=it');
$ldapservers->SetValue($i,'server','base',array('dc=example,dc=it'));
$ldapservers->SetValue($i,'login','anon_bind',false);
$ldapservers->SetValue($i,'appearance','password_hash','ssha');
...
il servizio risponde con solerzia all'uri http://www.example.it/phpldapadmin/
Configurare il sistema per accedere in LDAPS
Ancora da provare.
VCARD e OpenLDAP
Rendiamo utile questa installazione, supponiamo di voler inserire il salvataggio del phonebook del vostro cellulare nella ou=Contact
VCARD
Il phonebook che ho è esportato in formato VCARD Magari prima o poi ci scrivo un altro HowTo, ma per estrarre tutti i contatti ho usato Kmobiletool integrato sulla kde di OpenSuse.
BEGIN:VCARD N:;;;; NICKNAME:nomeecognome TEL;TYPE=CELL:00000000000 UID:KMobileTools-ME-247 VERSION:3.0 END:VCARD
quindi stiamo usando RFC2426 ma è un unico file.
LDIF
Diciamo che vogliamo riempire una struttura fatta così:
dn: cn=pvb265, ou=Contact, dc=example, dc=it objectClass: top objectClass: person objectClass: organizationalPerson objectClass: inetOrgPerson cn: pvb265 gn: nomedipvb265 sn: cognomedipvb265 mail: blabla@gmail.com physicalDeliveryOfficeName: persona pericolosissima postalAddress: via Blabla 41 Granarolo ou: Contact st: it postalCode: 41118 telephoneNumber: +03900000000 mobile: +03900000000
Normalizzazione
Chiedo aiuto al Perl e creo una serie di ldif mono-persona
#!/usr/bin/perl -w
my $in=shift; #file con le vcard
my $out="/srv/openldap/etc/openldap/ldif/vcard"; #directory di salvataggio degli ldif
my %vcard; #la chiave sarà il numero contatto
my $N=""; #RFC2426
my $NICKNAME=""; #RFC2426
my $TEL=""; #RFC2426
my $UID=""; #RFC2426
my $d; my $line;
open(IN,"<$in");
my @lines = <IN>;
close IN;
foreach $line (@lines) {
chomp($line);
$line =~ s/\r//g;
if ( $line =~ /^NICKNAME:/ ) {
($d,$NICKNAME)=split(':',$line);
}
elsif ( $line =~ /^N:/ ) {
($d,$N)=split(':',$line);
}
elsif ( $line =~ /^TEL;/ ) {
($d,$TEL)=split(':',$line);
}
elsif ( $line =~ /^UID:/ ) {
($d,$d,$UID)=split('-',$line);
$UID =~ s/ //g;
}
elsif ( $line =~ /^END:/ ) {
$vcard{$UID}="$UID,$NICKNAME,$TEL";
$N=""; $NICKNAME=""; $UID=""; $TEL="";
}
}
for $key (sort keys %vcard) {
my @tmp=split(',',$vcard{$key});
my $namenoblanc = $tmp[1]; $namenoblanc =~ s/ /-/g;
my $filename="$out/$key.$namenoblanc.ldif";
my ($gn,$sn)=split(' ',$tmp[1]);
print "$filename\n";
open(OUT,">$filename");
print OUT "dn: cn=$tmp[1], ou=Contact, dc=lisco, dc=it\n";
print OUT "objectClass: top\nobjectClass: person\nobjectClass: organizationalPerson\nobjectClass: inetOrgPerson\n";
print OUT "cn: $tmp[1]\n";
print OUT "gn: $gn\n";
if ($sn !~ /^$/ ) { print OUT "sn: $sn\n"; }
print OUT "ou: Contact\n";
print OUT "mobile: $tmp[2]\n\n";
close OUT;
}
sulla machina ldap, in maniera da avere una copia in formato ldif dei contatti.
ldap:/srv/openldap # mkdir -p scripts/in ldap:/srv/openldap # mkdir etc/openldap/ldif/vcard
Attenzine ai dn doppi: nelle vcard chi conta è l'UID, ma nell'ldap la chiave unica deve essere il dn E' abbastanza probabile che abbiate più numeri per la stessa persona su vcard distinte. Prima di procedere date una controllatina agli ldif prodotti: suggerisco di raddoppiare le entrate per l'attributo mobile nel caso si volesse aggiungere un altro numero di telefono.
ed ora carico i contatti:
spengo slapd ovviamente
cd /srv/openldap/etc/openldap/ldif/vcard for i in `ls` do /srv/openldap/sbin/slapadd -c -v -f /srv/openldap/etc/openldap/slapd.conf -l $i done
