OpenLdap System Guide HowTo

From ImoLUGPedia

Jump to: navigation, search

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
Personal tools
Navigation