IMPORTANT: Per accedir als fitxer de subversion: http://acacha.org/svn (sense password). Poc a poc s'aniran migrant els enllaços. Encara però funciona el subversion de la farga però no se sap fins quan... (usuari: prova i la paraula de pas 123456)

Alert.png Aquesta wiki forma part dels materials d'un curs
Curs: SambasobreLDAP, LinuxAdministracioAvancada
Fitxers: Ldap1.pdf, Ldap2.pdf, AutenticacioiAutoritzacionsLinux.pdf
Repositori SVN: https://anonymous@svn.projectes.lafarga.cat/svn/iceupc/SambaSobreLDAP
Usuari: anonymous
Paraula de pas: sense paraula de pas
Autors: Sergi Tur Badenas, Lluís Pérez Vidal

Lightweight Directory Access Protocol (LDAP) és un protocol de xarxa que permet l'accés a un servei de directori per tal de compartir informació en una xarxa. LDAP és un protocol d'accés a un tipus de bases de dades molt especifiques: els directoris. Els directoris és poden considerar una base de dades tot i que el seu sistema d'emmagatzemament (estructura jeràrquica) difereix força de l'estructura relacional (taules i registres) de les bases de dades "tradicionals".

Habitualment s'utilitza per emmagatzemar la informació dels usuaris d'un domini (entre altre informació l'usuari i la contrasenya). El seu objectiu principal és permetrà l'autenticació en xarxa als recursos de xarxa. També es possible emmagatzemar altre informació com les dades de contacte dels usuaris (directori d'una empresa ) o també s'utilitza sovint per inventariar recursos (inventari de màquines, impressores, servidors, i altres recursos de xarxa).

Contingut

Plantilla

Usos de Ldap

Aplicacions clients que suporten Ldap

La següent és una llista (no completa) d'aplicacions client que suporten Ldap:

NOTA: La majoria d'elements de la llista han estat provats o es coneix en major o menor grau el seu correcte funcionament

El directori LDAP

Una part important del protocol LDAP és el directori. El directori és la "base de dades" de LDAP. Té una estructura jerarquitzada, en forma d'arbre (similar als arbres dels sistemes de fitxers). Hi ha un node arrel, i a partir d'aquí l'estructura s'organitza en subarbres. Cada node de l'arbre, és un objecte LDAP i poden o no contenir altres objectes. Cada objecte ve definit per un esquema, schema en anglès, (ve a ser com la estructura d'una taula en una base de dades) que defineix els. Els objectes poden heretar característiques d'altres objectes (pares) o proporcionar característiques a altres objectes (fills).

L'esquema defineix els parells d'atributs-valors que pot tenir un objecte, i unes normes bàsiques referents als atributs (P. ex. si és obligatori o opcional)

La tendència actual dels directoris LDAP és tendir a utilitzar DNS en els seus nivells més alts del directori. Així per exemple la upc tindria els següents nivells principals:

  • edu
    • upc

i més enlla d'aquí la organització es per departaments, grups de persones, recursos (), etc:

  • edu
    • upc
      • lsi
      • professors
      • alumnes
      • servidors
      • impressores

Glossari

ldapsearch -h myServer -p 5201 -D cn=admin,cn=Administrators,cn=config -w - \
-b "" -s base "(objectclass=*)"

TODO:

A Directory Information Tree (DIT) is data represented in a hierarchical tree-like structure consisting of the Distinguished Names (DNs) of directory service entries.

Both the X.500 protocols and the Lightweight Directory Access Protocol (LDAP) use the DIT as their fundamental data structure.

Typically, an X.500 or LDAP deployment for a single organization will have a DIT which consists of two parts:

   * a top level name structure for the name of the organization itself
   * a representation of the data model structure within the organization

DIT

Exemple de DIT

Operational attributtes

Són?:

  • createTimeStamp
  • creatorsName
  • entryFlags
  • federationBoundary
  • localEntryID
  • modifiersName
  • modifyTimeStamp
  • structuralObjectClass
  • subordinateCount
  • subschemaSubentry

No apareix per defecte a la llista de camps que es mostren a una cerca. El podeu mostrar indicat el camp al final. Per exemple:

$ ldapsearch -D cn=admin,o=novell -W -b o=novell cn=fred createtimestamp creatorsname entryflags localentryid modifytimestamp

o

$ ldapsearch -x -h localhost -b dc=iesebre,dc=com modifytimestamp



Recursos

Data types

TODO

Bases de dades (backends)

NOTA: Vegeu també Notes sobre els fitxers de configuració de slapd

Un servidor Ldap pot proporcionar accés a múltiples bases de dades. És a dir a través de Ldap, podem accedir a diferents bases de dades que poden estar totes a un mateix servidor físic. Per exemple, des de les noves versions de Ldap (--acacha 04:40, 2 set 2010 (UTC)) normalment tenim com a mínim dos bases de dades:

  • config: Conté la configuració del servidor Ldap
  • /var/lib/ldap: És la típica base de dades per defecte, normalment en format bdb

Si utilitzem syncrepl per tenir rèpliques d'un servidor Ldap, al servidor proveïdor (master) també tindreu una tercera base de dades:

  • /var/lib/ldap/accesslog: Registre d'accés al servidor proveïdor des les repliques (consumidors)

La configuració de la base de dades es fa amb olcDatabase. Aquest paràmetre el trobareu a la base de dades de configuració. Per exemple la base de dades de configuració:

dn: olcDatabase={0}config,cn=config
objectClass: olcDatabaseConfig
olcDatabase: {0}config
olcRootDN: cn=admin,cn=config
olcRootPW: {MD5}/4P8el5RQj#4ghCdURF/H7A==

Servidor LDAP

Hi han múltiples implementacions del protocol LDAP (com Active Directory) però en aquest article ens centrarem en la implementació lliure OpenLdap. Per aquesta implementació el servidor és anomenat slapd

Instal·lació

Instal·lació Ubuntu 12.04

 $ sudo apt-get install slapd ldap-utils

Si voleu tornar a configurar:

$ sudo dpkg-reconfigure slapd

Instal·lació Ubuntu 11.10

Per fer l'instal·lació:

$ sudo apt-get install slapd ldap-utils
...
S'està configurant slapd (2.4.25-1.1ubuntu4)…
 Creating new user openldap... done.
 Creating initial configuration... done.
 Creating LDAP directory... done.
* Starting OpenLDAP slapd                                                                                            [ OK ] 
S'estan processant els activadors per a libc-bin…
ldconfig deferred processing now taking place
$ sudo dpkg-reconfigure slapd
* Stopping OpenLDAP slapd                                                                                            [ OK ] 
 Moving old database directory to /var/backups:
 There are leftover files in /var/lib/ldap. This will probably break 
 creating the initial directory. If that's the case please move away
 stuff in there and retry the configuration.
 Creating initial configuration... done.
 Creating LDAP directory... done.
* Starting OpenLDAP slapd                                    
...

Instal·lació Ubuntu 11.04

IMPORTANT: No cal seguir tots els passos de configuració manuals de les versions anteriors. El paquet a tornar a recuperar l'antic configurador que us configurarà la part bàsica del servidor Ldap. Per configurar el paquet executeu


$ sudo apt-get install slapd ldap-utils
$ sudo rm -r /etc/ldap/slapd.d
$ sudo dpkg-reconfigure slapd
$ sudo dpkg-reconfigure slapd

TODO

Instal·lació Ubuntu 10.10

La instal·lació no presenta cap diferencia important respecte a les versions anteriors.

Instal·lació Ubuntu 10.4

Consulteu: http://www.iesebre.com/manteniment/index.php/LDAP#Instal.C2.B7laci.C3.B3

Karmic Koala, Ubuntu 9.10

NOTA: Aquest procediment es pot seguir també en versions més modernes d'Ubuntu, concretament fins a la versió 10.10 (comprovat).--acacha 07:32, 12 maig 2011 (UTC). Actualitzacíó: La versió 11.04 sembla que torna a tenir un assistent (dpgk-reconfigure) que estalvia gran part de les passes indicades en aquesta web. --acacha 08:49, 30 maig 2011 (UTC)

$ sudo apt-get install slapd ldap-utils

IMPORTANT: NO UTILITZEU dpkg-reconfigure per configurar el servidor Ldap (slapd) ja que no només no us configurarà res si no que a més us esborrarà la configuració de Ldap que ja tingueu feta!

NOTA: Consulteu la web notes sobre els fitxers de configuració de slapd i l'explicació dels passos que anem a realitzar

Anem a fer una configuració bàsica. Creeu una carpeta per guardar els fitxers que necessitarem per tal de fer aquesta configuració:

$ sudo su
# cd /etc/ldap
# mkdir configuracioInicial
# cd configuracioInicial

Només l'esquema core està afegit a la configuració per defecte. Afegiu altres esquemes amb:

# ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/cosine.ldif
# ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/inetorgperson.ldif
# ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/nis.ldif

NOTA: Si heu d'instal·lar altres esquemes aprofiteu per fer-ho ara.

Ens caldrà crear dos usuaris/objectes administradors de Ldap i aquests usuaris hauràn de tenir una paraula de pas. Aquesta paraula de pas s'ha de guardar xifrada a la base de dades Ldap, per a aconseguir la paraula de pas xifrada amb MD5 executeu:

$ slappasswd -h {MD5}
New password: 
Re-enter new password: 
{MD5}sac43R48I+13VCvWpQribA==

NOTA: Poseu la vostra paraula de pas i l'ordre un retornarà aquesta paraula de pas xifrada amb MD5! No poseu el valor que apareix a l'exemple!

Ara cal crear la base del repositori (backend) ldap. Creeu un fitxer amb el següent codi ldif:

# joe db.ldif

NOTA: Tingueu en compte que l'exemple està pensat per al domini iesebre.com. Canvieu les dades en negreta pel que correspongui al vostre cas

###########################################################
# DATABASE SETUP
########################################################### 

# Load modules for database type
dn: cn=module{0},cn=config
objectClass: olcModuleList
cn: module{0}
olcModulePath: /usr/lib/ldap
olcModuleLoad: {0}back_hdb

# Create directory database
dn: olcDatabase={1}hdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcHdbConfig
olcDatabase: {1}hdb
olcDbDirectory: /var/lib/ldap
olcSuffix: dc=iesebre,dc=com
olcRootDN: cn=admin,dc=iesebre,dc=com
olcRootPW: PARAULA DE PAS
olcDbConfig: {0}set_cachesize 0 2097152 0
olcDbConfig: {1}set_lk_max_objects 1500  
olcDbConfig: {2}set_lk_max_locks 1500    
olcDbConfig: {3}set_lk_max_lockers 1500  
olcLastMod: TRUE
olcDbCheckpoint: 512 30
olcDbIndex: uid pres,eq
olcDbIndex: cn,sn,mail pres,eq,approx,sub
olcDbIndex: objectClass eq

I ara:

# ldapadd -Y EXTERNAL -H ldapi:/// -f db.ldif

IMPORTANT: Fins aquest moment la base de dades de Ldap estava buida (la carpeta /var/lib/ldap estava buida), ara ja tindreu fitxers binaris amb les dades del backend Ldap

IMPORTANT: Si us dona algun error al executar alguna de les ordres ldapadd o ldapmodify d'aquest exemple, tingueu en compte que si la torneu a executar poden haver-hi parts del fitxer (objectes Ldap) que s'hagin executat correctament! Al tornar a executar us donarà un error conforme ja heu executat aquella part i per tant l'objecte ja existeix. Cada objecte Ldap als fitxers ldiff està separat per un línia en blanc, podeu tornar a executar les ordres si elimineu o millor comenteu (posar # al principi de la línia) aquells objectes que ja s'ha executat correctament

Ara cal crear l'arrel del servidor LDAP i l'usuari admin. Creeu un altre fitxer LDIF:

$ sudo joe base.ldif
dn: dc=iesebre,dc=com
objectClass: dcObject
objectclass: organization
o: iesebre.com
dc: iesebre
description: Arrel LDAP

dn: cn=admin,dc=iesebre,dc=com
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
userPassword: PARAULA DE PAS EN MD5

NOTA: Observeu que heu de posar la paraula de pas obtinguda a l'última línia

Executeu:

# ldapadd -Y EXTERNAL -H ldapi:/// -f base.ldif 
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry "dc=iesebre,dc=com"  

adding new entry "cn=admin,dc=iesebre,dc=com"

Ara cal crear el backend de la configuració del servidor Ldap:

# joe config.ldif  
dn: cn=config
changetype: modify

dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootDN
olcRootDN: cn=admin,cn=config

dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootPW
olcRootPW: Paraula de pas en MD5

dn: olcDatabase={0}config,cn=config
changetype: modify
delete: olcAccess

NOTA: Canvieu olcRootPW per la vostra paraula de pas en MD5

I executeu:

# ldapadd -Y EXTERNAL -H ldapi:/// -f config.ldif 
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "cn=config"  

modifying entry "olcDatabase={0}config,cn=config"  

modifying entry "olcDatabase={0}config,cn=config" 

modifying entry "olcDatabase={0}config,cn=config"

NOTA: Apunts sobre un possible error

IMPORTANT: A partir d'aquest moment ja no podeu utilitzar ldapi:/// per tal de fer modificacions a l'arbre ldap!! (us donarà un error d'insuficient accés Observeu que si no esborreu la línia olcAccess podeu mantenir l'accés ldapi!)

I ara creeu un altre fitxer:

# joe acl.ldif 
dn: olcDatabase={1}hdb,cn=config
add: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange by dn="cn=admin,dc=iesebre,dc=com" write by anonymous auth by self write by * none
olcAccess: {1}to dn.base="" by * read
olcAccess: {2}to * by dn="cn=admin,dc=iesebre,dc=com" write by * read
$ ldapmodify -x -D cn=admin,cn=config -W -f acl.ldif

I finalment:

$ sudo /etc/init.d/slapd restart

Ara ja teniu un servidor LDAP tal i com es tenia a la versió Jaunty Jackalope.

Desinstal·lació completa del servidor Ldap

IMPORTANT: No executeu el següent procediment a un servidor amb dades sense fer abans una copia de seguretat

$ sudo apt-get remove --purge slapd
$ sudo rm -rf /var/lib/ldap
$ sudo rm -rf /etc/ldap/slapd.d

Instal·lació abans de Karmic

Per instal·lar slapd hem d'executar:

$ sudo apt-get install slapd

Durant la instal·lació ens preguntara el password de l'administrador Ldap.

Slapd.png

Slapd1.png

Tal i com suggereix apt-get, també és recomanable disposar dels paquets db4.2-util i libsasl2-modules.

$ sudo apt-get install db4.2-util libsasl2-modules

Podem consultar els fitxers que instal·la slapd amb la comanda:

$ dpkg -L slapd

Tenim les següents comandes/aplicacions/servidors:

$ dpkg -L slap | grep bin
/usr/sbin
/usr/sbin/slapd
/usr/sbin/slurpd
/usr/sbin/slapadd
/usr/sbin/slapcat
/usr/sbin/slapdn
/usr/sbin/slapindex
/usr/sbin/slappasswd
/usr/sbin/slaptest

Entre les comandes hi ha el servidor principal (slapd), el servidor de replica (slurpd) i les diferents comandes necessàries per mantenir la base de dades del servidor (slapadd,slappasswd,etc...)

I els següents fitxers de configuració:

$ dpkg -L slapd | grep etc
/etc
/etc/ldap
/etc/ldap/schema
/etc/ldap/schema/README
/etc/ldap/schema/corba.schema
/etc/ldap/schema/core.schema
/etc/ldap/schema/cosine.schema
/etc/ldap/schema/dyngroup.schema
/etc/ldap/schema/inetorgperson.schema
/etc/ldap/schema/java.schema
/etc/ldap/schema/misc.schema
/etc/ldap/schema/nis.schema
/etc/ldap/schema/openldap.schema
/etc/default
/etc/default/slapd
/etc/init.d
/etc/init.d/slapd

La resta de fitxers són manuals i documentació (carpeta /usr/share/doc) i la base de dades (carpetes /var/lib). De la documentació cal destacar el fitxer README:

$ nano /usr/share/doc/slapd/README.Debian

Script d'instal·lació

Executeu:

$ cd
$ wget -N --http-user=anonymous --http-password= http://anonymous@svn.projectes.lafarga.cat/svn/iceupc/SambaSobreLDAP/SLAPDinstall.sh
$ sudo chmod +x SLAPDinstall.sh
$ ./SLAPDinstall.sh

Com s'ha creat l'script:

Creeu un fitxer SLAPDinstall.sh:

$ sudo joe SLAPDinstall.sh

Amb el contingut:

#!/bin/bash
sudo apt-get install -y --force-yes slapd ldap-utils
echo "*****************************************";
echo "Poseu com a paraula de pas: ice"
echo "*****************************************";
wget -N --http-user=anonymous --http-password= http://svn.projectes.lafarga.cat/svn/iceupc/SambaSobreLDAP/slapd.conf
echo "Fent una còpia de seguretat de ldap a data `date "+%Y%m%d"`..."
sudo cp -r /etc/ldap /etc/ldap.old.`date "+%Y%m%d"`
echo "Copiant slapd.conf a /etc/ldap..."
sudo cp slapd.conf /etc/ldap
sudo /etc/init.d/slapd restart
echo "Afegint els usuaris de proves del fitxer assistents.ldif..."
wget -N --http-user=anonymous --http-password= http://svn.projectes.lafarga.cat/svn/iceupc/SambaSobreLDAP/moodle/sessio2/ldap/assistents.ldif
ldapadd -x -f assistents.ldif -H "ldap://localhost" -D "cn=admin,dc=Aulalinux,dc=ice,dc=upc,dc=edu" -W


NOTA: Recordeu que per evitar problemes posem tots la mateixa paraula de pas: ice

La configuració del servidor és la següent:

$ cat /etc/ldap/slapd.conf
# This is the main slapd configuration file. See slapd.conf(5) for more
# info on the configuration options.

#######################################################################
# Global Directives:

# Features to permit
#allow bind_v2

# Schema and objectClass definitions
include         /etc/ldap/schema/core.schema
include         /etc/ldap/schema/cosine.schema
include         /etc/ldap/schema/nis.schema
include         /etc/ldap/schema/inetorgperson.schema

# Where the pid file is put. The init.d script
# will not stop the server if you change this.
pidfile         /var/run/slapd/slapd.pid

# List of arguments that were passed to the server
argsfile        /var/run/slapd/slapd.args

# Read slapd.conf(5) for possible values
loglevel        none

# Where the dynamically loaded modules are stored
modulepath	/usr/lib/ldap
 moduleload	back_hdb

# The maximum number of entries that is returned for a search operation
sizelimit 500

# The tool-threads parameter sets the actual amount of cpu's that is used
# for indexing.
tool-threads 1

#######################################################################
# Specific Backend Directives for hdb:
# Backend specific directives apply to this backend until another
# 'backend' directive occurs
backend		hdb

#######################################################################
# Specific Backend Directives for 'other':
# Backend specific directives apply to this backend until another
# 'backend' directive occurs
#backend		<other>

#######################################################################
# Specific Directives for database #1, of type hdb:
# Database specific directives apply to this databasse until another
# 'database' directive occurs
database        hdb

# The base of your directory in database #1
suffix          "dc=Aulalinux,dc=ice,dc=upc,dc=edu"

# rootdn directive for specifying a superuser on the database. This is needed
# for syncrepl.
# rootdn          "cn=admin,dc=Aulalinux,dc=ice,dc=upc,dc=edu" 

# Where the database file are physically stored for database #1
directory       "/var/lib/ldap"

# The dbconfig settings are used to generate a DB_CONFIG file the first
# time slapd starts.  They do NOT override existing an existing DB_CONFIG
# file.  You should therefore change these settings in DB_CONFIG directly
# or remove DB_CONFIG and restart slapd for changes to take effect.

# For the Debian package we use 2MB as default but be sure to update this
# value if you have plenty of RAM
dbconfig set_cachesize 0 2097152 0

# Sven Hartge reported that he had to set this value incredibly high
# to get slapd running at all. See http://bugs.debian.org/303057 for more
# information.

# Number of objects that can be locked at the same time.
 dbconfig set_lk_max_objects 1500
# Number of locks (both requested and granted)
dbconfig set_lk_max_locks 1500
# Number of lockers
dbconfig set_lk_max_lockers 1500

# Indexing options for database #1
index           objectClass eq

# Save the time that the entry gets modified, for database #1
lastmod         on

# Checkpoint the BerkeleyDB database periodically in case of system
# failure and to speed slapd shutdown.
 checkpoint      512 30

# Where to store the replica logs for database #1
# replogfile	/var/lib/ldap/replog

# The userPassword by default can be changed
# by the entry owning it if they are authenticated.
# Others should not be able to see it, except the
# admin entry below
# These access lines apply to database #1 only
access to attrs=userPassword,shadowLastChange
        by dn="cn=admin,dc=Aulalinux,dc=ice,dc=upc,dc=edu" write
        by anonymous auth
        by self write
        by * none

# Ensure read access to the base for things like
# supportedSASLMechanisms.  Without this you may
# have problems with SASL not knowing what
# mechanisms are available and the like.
# Note that this is covered by the 'access to *'
# ACL below too but if you change that as people
# are wont to do you'll still need this if you
# want SASL (and possible other things) to work 
# happily.
access to dn.base="" by * read

# The admin dn has full write access, everyone else
# can read everything.
access to *
        by dn="cn=admin,dc=Aulalinux,dc=ice,dc=upc,dc=edu" write
        by * read

# For Netscape Roaming support, each user gets a roaming
# profile for which they have write access to
#access to dn=".*,ou=Roaming,o=morsnet"
#        by dn="cn=admin,dc=Aulalinux,dc=ice,dc=upc,dc=edu" write
#        by dnattr=owner write 

#######################################################################
# Specific Directives for database #2, of type 'other' (can be hdb too):
# Database specific directives apply to this databasse until another
# 'database' directive occurs
#database        <other>

# The base of your directory for database #2
#suffix		"dc=debian,dc=org"

Control del servei slapd. Execució, parada, status i reconfiguració de OpenLdap

Seguint els estàndards de Debian GNU/Linux (basat en el sistema d'scripts d'inicialització SystemV (http://en.wikipedia.org/wiki/System_V)) l'script de control del dimoni bind és:

/etc/init.d/slapd

Les accions que podem fer amb el servei són start|stop|restart|force-reload.

Cada cop que fem un canvi a la configuració de bind haurem de fer un restart:

$ sudo /etc/init.d/slapd restart

Tal com podem veure executant:

$ sudo updatedb
/etc/rc0.d/K80slapd
/etc/rc1.d/K80slapd
/etc/rc2.d/S19slapd
/etc/rc3.d/S19slapd
/etc/rc4.d/S19slapd
/etc/rc5.d/S19slapd
/etc/rc6.d/K80slapd
/var/cache/apt/archives/slapd_2.2.26-5ubuntu3.1_i386.deb

El serveis slapd s'executa a partir del nivell 1 (cal destacar que no està disponible al nivell SINGLE USER MODE rcS.d).

Podeu trobar més informació a l'article Configuració de serveis en Linux

Configuració de slapd

IMPORTANT: A openLdap 2.3 i posteriots la configuració ja no es fa a partir d'un fitxer de configuració estàtic, sinó que és la pròpia base de dades ("backend") de LDAP que incorpora la configuració. Això permet que es puguin fer canvis al servidors LDAP de forma dinàmica sense necessitat de recarregar el servidor. Consulteu http://www.openldap.org/doc/admin24/slapdconf2.html

Configuració estàtica (antigues versions). Fitxer slapd.conf

Els fitxers de configuració del dimoni slapd (seguint els estàndards de Debian GNU/Linux) es troben a la carpeta /etc/ldap. Com en el cas d'altres sistemes servidors, tant la configuració del servidor com la del client es fan a la mateixa carpeta

El fitxer principal de configuració és el fitxer /etc/ldap/slapd.conf.

IMPORTANT: De la versió 9.04 d'Ubuntu a la 10.10 no es configura correctament el servidor Ldap amb l'ordre dpkg-reconfigure! De fet cal evitar-la ja que us pot esborrar la base de dades Ldap que tingueu instal·lada!

Normalment tindrem prou amb executar:

$ sudo dpkg-reconfigure slapd

per tal de configurar o reconfigurar un servidor LDAP. A l'executar dpkg-reconfigure amb slapd cal fixar-se que al final no hi hagi cap problema. Les següents línies mostren una sortida de dpkg-reconfigure correcta:

$ sudo dpkg-reconfigure slapd
Stopping OpenLDAP: slapd.
Creating initial slapd configuration... done.
Creating initial LDAP directory... done.
Starting OpenLDAP: running BDB recovery, slapd.

Les següents captures de pantalla mostren els passos a seguir per tal de configurar un servidor LDAP amb el sufix:

  • AulaLinux.ice.upc.edu

SlapdConfiguration.jpg

SlapdConfiguration1.jpg

SlapdConfiguration2.jpg

SlapdConfiguration3.jpg

SlapdConfiguration4.jpg

SlapdConfiguration5.jpg

SlapdConfiguration6.jpg

SlapdConfiguration7.jpg

Cal tenir en compte que si modifiquem la base de dades eliminarem els continguts que hi hagin actualment al directori. El configurador ens permet fet una còpia de seguretat que es guarda a la carpeta:

/var/backups

Amb un nom similar a:

/var/backups/unknown-2.3.35-1ubuntu0.1.ldapdb

Tal i com s'indica al final de la configuració:

$ sudo dpkg-reconfigure slapd
Stopping OpenLDAP: slapd.
 Moving old database directory to /var/backups:

Si la còpia ja existeix no es farà el backup:

 Backup path /var/backups/unknown-2.3.35-1ubuntu0.1.ldapdb exists.Giving up...

Configuració dinàmica cn=admin,cn=config. Ubuntu 9.10

Podeu trobar info sobre el nou sistema de configuració de Ldap a:

http://linux.die.net/man/5/slapd-config

Inicialment es fa amb:

ldapadd -Y EXTERNAL -H ldapi:// -f file

Després amb:

ldapadd -x -Y EXTERNAL -H ldapi:// -D cn=admin,cn=config -W -f file

Exemple de configuració inicial. Ubuntu 10.10

Acabat d'instal·lar un servidor Ldap (paquet slapd) a una Ubuntu Server, tenim a la carpeta /etc/ldap/slapd.d/cn=config:

$ sudo su
# cd /etc/ldap/slapd.d/cn=config

La següent configuració inicial:

# ls -la
total 24
drwxr-x--- 3 openldap openldap 4096 2011-06-09 13:49 .
drwxr-x--- 3 openldap openldap 4096 2011-06-09 13:49 ..
drwxr-x--- 2 openldap openldap 4096 2011-06-09 13:49 cn=schema
-rw-r----- 1 openldap openldap  307 2011-06-09 13:49 cn=schema.ldif
-rw-r----- 1 openldap openldap  442 2011-06-09 13:49 olcDatabase={0}config.ldif
-rw-r----- 1 openldap openldap  585 2011-06-09 13:49 olcDatabase={-1}frontend.ldif

Només hi ha un esquema instal·lat (core):

# ls cn\=schema
cn={0}core.ldif

I la següent configuració inicial, primer el frontend:

# cat olcDatabase\=\{-1\}frontend.ldif 
dn: olcDatabase={-1}frontend
objectClass: olcDatabaseConfig
objectClass: olcFrontendConfig
olcDatabase: {-1}frontend
olcAccess: {0}to * by dn.exact=gidNumber=0+uidNumber=0,cn=peercred,cn=external
,cn=auth manage by * break
olcAccess: {1}to dn.base="" by * read
olcAccess: {2}to dn.base="cn=subschema" by * read
olcSizeLimit: 500
structuralObjectClass: olcDatabaseConfig
entryUUID: 392b7d88-26da-1030-9c98-e3eecd15d5db
creatorsName: cn=config
createTimestamp: 20110609114906Z
entryCSN: 20110609114906.098888Z#000000#000#000000
modifiersName: cn=config
modifyTimestamp: 20110609114906Z

I la "base de dades" Ldap:

# cat olcDatabase\=\{0\}config.ldif 
dn: olcDatabase={0}config
objectClass: olcDatabaseConfig
olcDatabase: {0}config
olcAccess: {0}to * by dn.exact=gidNumber=0+uidNumber=0,cn=peercred,cn=external
 ,cn=auth manage by * break
structuralObjectClass: olcDatabaseConfig
entryUUID: 392b8f44-26da-1030-9c99-e3eecd15d5db
creatorsName: cn=config
createTimestamp: 20110609114906Z
entryCSN: 20110609114906.099342Z#000000#000#000000
modifiersName: cn=config
modifyTimestamp: 20110609114906Z

El més important és el control d'accés (paràmetres olcAccess):

olcAccess: {0}to * by dn.exact=gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth manage by * break

El usuari de Unix amb UID i GID zero (0) te tots els permisos, és a dir el root sempre i quan accedeixi a la base de dades utilitzant l'autenticació SASL externa amb LDAPI. Per exemplpe podem afegir esquemes utilitzant:

# ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/cosine.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry "cn=cosine,cn=schema,cn=config"

Si ho proveu amb un altre usuari (a l'exemple té el UID 1002):

# exit
$ ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/inetorgperson.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=1002+uidNumber=1002,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry "cn=inetorgperson,cn=schema,cn=config"
ldap_add: Insufficient access (50)

També podeu utilitzar l'ordre ldapwhoami:

# sudo su
# ldapwhoami -Y EXTERNAL -H ldapi://
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
dn:gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth

Si ho proveu amb un altre usuari:

# exit
$ ldapwhoami -Y EXTERNAL -H ldapi://
SASL/EXTERNAL authentication started
SASL username: gidNumber=1002+uidNumber=1002,cn=peercred,cn=external,cn=auth
SASL SSF: 0
dn:gidNumber=1002+uidNumber=1002,cn=peercred,cn=external,cn=auth

També us autentica però no teniu privilegis.

DIT del config

OpenLDAPConfiguracioDinamicaDIT.png

Passar un fitxer slapd.conf al nou format

Es pot fer amb l'ordre slaptest

$ sudo slaptest -f /etc/ldap/slapd.conf -F /etc/ldap/slapd.d

A vegades només es vol convertir un schema. Per exemple imagineu-vos que voleu importar l'esquema iris.schema:

$ joe schema_convert1.conf

Aquí poseu els includes dels esquemes, cal posar l'esquema iris.schema i els esquemes dels que depèn:

include /etc/ldap/schema/core.schema
include /etc/ldap/schema/cosine.schema
include /etc/ldap/schema/nis.schema
include /etc/ldap/schema/iris.schema

Guardarem els resultats a una carpeta concreta. A l'exemple ldif_result1:

$ mkdir ldif_result1

Ara fem la conversió

$ slaptest -f schema_convert1.conf -F ldif_result1

Per instal·lar l'esquema, cal posar-lo a la carpeta:

/etc/ldap/slapd.d/cn=config/cn=schema

amb un número que no xoqui amb els existents, en el meu cas el primer número lliure és el 16:

$ sudo -s
# cp cn\=\{3\}iris.ldif /etc/ldap/slapd.d/cn\=config/cn\=schema/cn\=\{16\}iris.ldif
# chown openldap:openldap /etc/ldap/slapd.d/cn\=config/cn\=schema/cn\=\{16\}iris.ldif
# /etc/init.d/slapd restart

Si teniu algun problema al tornar a iniciar slapd, executeu-lo en mode depuració per obtenir més informació:

# slapd -d 16383  -h 'ldap:/// ldapi:///' -g openldap -u openldap -F /etc/ldap/slapd.d/

Consultar la configuració

Ho podeu fer amb:

$ sudo ldapsearch -Y EXTERNAL -H ldapi:/// -b cn=config

També podeu mostrar la base de dades amb:

# Show the current data in the directory as anonymous user:
ldapsearch -x -h localhost -b dc=edu,dc=example,dc=org

I volcar-la a ldif amb:

# Dump the database with metadata:
sudo slapcat

Fitxer de configuració /etc/ldap/slapd.conf

Aquest és el fitxer de configuració del servidor i és utilitzat per totes les comandes del servidor. (slapd, slurpd, slpaacl,slapcat,etc.).

L'inici del fitxer conté les configuracions globals del servidor ldap. Un servidor ldap pot tenir més d'una base de dades (backend). Després dels paràmetres globals comencen els paràmetres de configuració de les bases de dades (ha dhaver-hi com a mínim un backend).

Propietats

  • Les opcions són case-insensitive
  • Els comentaris es fan amb una línia que comença per #
  • Les definicions de base de dades comencen amb la línia:
database <backend 1 type>

Fins a la següent línia database (si n'hi ha) totes les opcions són per a una base de dades específica.

  • Les opcions globals poden ser sobreescrites per les opcions de base de dades
  • Si un línia comença per un o més espais es considera una continuació de la línia anterior

Per consultar les opcions del vostre fitxer slapd.conf però sense comentaris podeu executar:

$ sudo cat /etc/ldap/slapd.conf | grep -v '#'
 
 

include         /etc/ldap/schema/core.schema
include         /etc/ldap/schema/cosine.schema
include         /etc/ldap/schema/nis.schema
include         /etc/ldap/schema/inetorgperson.schema
 
pidfile         /var/run/slapd/slapd.pid  
argsfile        /var/run/slapd/slapd.args 
loglevel        0
modulepath      /usr/lib/ldap
moduleload      back_bdb
sizelimit 500
tool-threads 1

backend         bdb
checkpoint 512 30
database        bdb
suffix          "dc=dyndns,dc=org"
rootdn          "cn=admin,dc=dyndns,dc=org"
directory       "/var/lib/ldap"
dbconfig set_cachesize 0 2097152 0
dbconfig set_lk_max_objects 1500
dbconfig set_lk_max_locks 1500
dbconfig set_lk_max_lockers 1500
index           objectClass eq
lastmod         on

access to attrs=userPassword,shadowLastChange
        by dn="cn=admin,dc=dyndns,dc=org" write
        by anonymous auth
        by self write
        by * none

access to dn.base="" by * read

access to *
        by dn="cn=admin,dc=dyndns,dc=org" write
        by * read 

dbconfig set_lk_max_objects 1500


Recursos:

Establir o canviar la paraula de pas de l'usuari administrador (olc)

La paraula de pas es pot establir al fitxer de configuració:

$ cat /etc/ldap/slapd.conf
...
rootdn "cn=admin,dc=example,dc=com" 
rootpw PARAULA_DE_PAS
...

Es pot posar directament (text) o xifrada. L'altre opció es no posar la línia:

rootpw PARAULA_DE_PAS

I crear un objecte d'usuari a ldap amb el DN cn=admin,dc=example,dc=com amb el següent contingut:

dn: cn=admin,dc=iesebre,dc=com
objectClass: organizationalRole
objectClass: simpleSecurityObject
cn: admin
userPassword:: e01ENX0vNFA4ZWw1TiFqL2RnQ2RVU1EvSDdBPT0=
description: LDAP administrator

La paraula de pas com veieu pot anar xifrada. L'avantatge de fer-ho d'aquesta manera es que podeu canviar la paraula de pas amb les eines client (ldap-utils) o amb eines gràfiques com Apache Directory Studio ja que l'usuari administrador és un usuari més de la base de dades ldap.

Si teniu la nova configuració el camp és:

olcRootDN: cn=admin,dc=example,dc=com 
olcRootPW: PARAULA_DE_PAS

I pasa el mateix si no poseu el camp:

olcRootPW: PARAULA_DE_PAS

Aleshores cal posar-lo al usuari cn=admin,dc=example,dc=com.

Comandes

Les comandes del servidor són les següents:

$ dpkg -L slapd | grep bin
/usr/sbin
/usr/sbin/slapd
/usr/sbin/slurpd
/usr/sbin/slaptest
/usr/sbin/slappasswd
/usr/sbin/slapindex
/usr/sbin/slapdn
/usr/sbin/slapcat
/usr/sbin/slapauth
/usr/sbin/slapadd
/usr/sbin/slapacl

Les comandes slpad i slurpd són els servidors Ldap. La resta de comandes s'expliquen en aquest apartat.

slaptest

Aquesta comanda és molt útil per tal de comprovar si el fitxer de configuració del servidor és correcte (slapd.conf):

$ sudo slaptest
/etc/ldap/slapd.conf: line 100: rootdn is always granted unlimited privileges.
/etc/ldap/slapd.conf: line 117: rootdn is always granted unlimited privileges.
config file testing succeeded

També s'utilitza per convertir esquemes del format tradicional a ldif. Consulteu:

Convertir esquemes a LDIF per tal de treballar amb el nou format configuració

Recursos:

slappasswd

Amb aquesta utilitat podem generar contrasenyes vàlides per al fitxer de configuració o per a comandes com ldapmodify:

$ sudo slappasswd
New password: 
Re-enter new password: 
{SSHA}Htu7njUuLtBAgM5ytqBzNXx+I+6YVqBe

Recursos:

slapindex

Serveix per a crear index.

Vegeu també: Ldap#Rendiment.

Del manual: ( man slapindex ), per reindexar tot el backend Ldap:

IMPORTANT: El servidor Ldap ha d'estar aturat

$ sudo /usr/sbin/slapindex

WARNING!
Runnig as root!
There's a fair chance slapd will fail to start.
Check file permissions!

Després de crear els index és important tornar a posar els permisos correctament:

$ sudo chown openldap:openldap -R /var/lib/ldap


Només per a un atribut:

$ sudo /usr/sbin/slapindex uid

NOTA: TODO: Amb la nova configuració és automàtic? Cal slapindex? Crec que sí.--acacha 16:11, 9 maig 2011 (UTC)

Recursos:

slapdn

Serveix per comprovar si una entrada de l'arbre segueix les normes dels esquemes definits:

$ sudo /usr/sbin/slapdn -v ou=proves,dc=dyndns,dc=org 
/etc/ldap/slapd.conf: line 100: rootdn is always granted unlimited privileges.
/etc/ldap/slapd.conf: line 117: rootdn is always granted unlimited privileges.
DN: <ou=proves,dc=dyndns,dc=org> check succeeded
normalized: <ou=proves,dc=dyndns,dc=org>
pretty:     <ou=proves,dc=dyndns,dc=org>

Recursos:

slapcat

Aquesta comanda fa un volcatge de tota la base de dades Ldap en format ldiff:

$ sudo slapcat | more
/etc/ldap/slapd.conf: line 100: rootdn is always granted unlimited privileges.
/etc/ldap/slapd.conf: line 117: rootdn is always granted unlimited privileges.
dn: dc=dyndns,dc=org
objectClass: top
objectClass: dcObject
objectClass: organization
o: dyndns.org
dc: dyndns
structuralObjectClass: organization
entryUUID: 423babea-6fff-102c-9952-3bbe055658ac
creatorsName:
modifiersName:
createTimestamp: 20080215104816Z
modifyTimestamp: 20080215104816Z
entryCSN: 20080215104816Z#000000#00#000000 

dn: cn=admin,dc=dyndns,dc=org
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator
structuralObjectClass: organizationalRole
entryUUID: 423c455a-6fff-102c-9953-3bbe055658ac
creatorsName:
createTimestamp: 20080215104816Z
userPassword:: 
entryCSN: 20080215104914Z#000000#00#000000
modifiersName: cn=admin,dc=dyndns,dc=org
modifyTimestamp: 20080215104914Z

...

Es pot fer una còpia de seguretat:

$ sudo slapcat > basedadesldap_2010_20_07.ldif

Per restaurar la copia de seguretat utilitzeu slapadd:

$ sudo slapadd

Recursos:

slapauth

TODO

Recursos:

slapadd

Permet afegir entrades a un servidor Ldap:

$ sudo slapadd -l ldif

IMPORTANT: És recomanable que el servidor estigui apagat per evitar inconsistències

Sovint es combina amb slapcat per fer còpies de seguretat i restaurar-les.

Si sabeu que hi ha entrades que ja existeixen o podeu tolerar certs errors que us apareixeran utilitzeu l'opció continue on errors (-c)

$ sudo slapadd -c -l ldif

IMPORTANT: Per tal de poder copiar una base de dades Ldap d'un servidor Ldap origen a un altre servidor Ldap de destinació, és molt important que tots dos tinguin una configuració molt similar, almenys, els esquemes han de ser els mateixos a l'origen i destinació (o millor dit els objectes que apareguin al fitxer copia han de tenir l'esquema corresponent al servidor Ldap de destinació)

Recursos:

slapacl

Permet comprovar l'accés a una sèrie d'atributs.

Consulteu: Ldap#ACLs_i_usuaris

Recursos:

Característiques del servidor ldap a skolelinux

Consulteu la secció Ldap de l'article SkoleLinux.

Múltiples bases de dades

Recursos:

Monitorització (monitoring)

El servidor Ldap slapd té una interfície opcional que permet obtenir informació sobre l'estat actual del servidor Ldap. Per exemple, amb aquesta interfície es pot obtenir el número de clients que hi ha connectats.

La informació de monitortizació es proporcionada per un backend especial, el monitor backend. Quan el backend monitor està actiu genera i proporciona de forma dinàmica objectes quan es pregunta per l'arbre Ldap:

cn=Monitor

Cada objecte d'aquest arbre conté informació de diferents aspectes del servidor.

Per activar el monitoring cal primer comprovar que el nostre ldap ho suporta, ha d'estar compilat (aka suport estàtic ) amb:

--enable-monitor=yes

O tenir un mòdul:

--enable-monitor=mod

I aleshores cal carregar aquest mòdul Ldap. Per comprovar si és te suport integrat o cal afegir un mòdul executeu:

$ slapd -VVVV
@(#) $OpenLDAP: slapd  (Jul 26 2012 00:09:02) $
	buildd@allspice:/build/buildd/openldap-2.4.28/debian/build/servers/slapd

Included static backends:
   config
   ldif

A l'exemple no tenim suport, aleshores cal afegir un mòdul.

La configuració és la següent, primer cal afegir el mòdul:

back_monitor

Monitorització. Configuració amb cn=config

Cal primer crear un fitxer que anomenarem add_monitor.ldif:

$ cd
$ joe add_monitor.ldif
dn: cn=module{0},cn=config
changetype: modify
add: olcModuleLoad
olcModuleload: back_monitor.la

Després un altre fitxer per configurar l'accés que anomenarem configure_monitor.ldif :

$ joe configure_monitor.ldif
dn: olcDatabase=monitor,cn=config
objectClass: olcDatabaseConfig
olcDatabase: monitor
olcAccess: to dn.subtree=cn=monitor
  by users read

IMPORTANT: Respecteu els espais a l'inici de línia de l'última línia

I ara executem:

$ sudo ldapmodify -Q -Y EXTERNAL -H ldapi:/// -f add_monitor.ldif
$ sudo ldapadd -Q -Y EXTERNAL -H ldapi:/// -f configure_monitor.ldif

Si us diu:

...
ldap_modify: Insufficient access (50)

és que ja no teniu la configuració per defecte de cn=config i cal autenticar-se per a fer-hi modificacions (vegeu Ldap#Configuraci.C3.B3_din.C3.A0mica_cn.3Dadmin.2Ccn.3Dconfig._Ubuntu_9.10), aleshores cal:

$ ldapmodify -x -D cn=admin,cn=config -W -f add_monitor.ldif
$ ldapadd -x -D cn=admin,cn=config -W -f configure_monitor.ldif

Cal saber la paraula de pas que us la preguntarà.

Per provar-lo podem utilitzar el plugin de Cacti openldap_operations.pl, cal tenir instal·lat Perl i el mòdul Ldap:

$ sudo apt-get install perl
$ sudo cpan -i Net::LDAP
$ wget http://tools.ltb-project.org/attachments/download/151/ltb-project-cacti-plugins-0.3.tar.gz
$ tar xvzf ltb-project-cacti-plugins-0.3.tar.gz
$ cd ltb-project-cacti-plugins-0.3
$ perl openldap_operations.pl -h localhost -D 'cn=admin' -W 'Password'
bind-initiated:3929 bind-completed:3929 unbind-initiated:2511 unbind-completed:2511 search-initiated:4700 search-com
...

On cal indicar l'usuari rootdn i el password o qualsevol altre que tingui permisos per accedir.

Un altre exemple amb ldapsearch:;

$ ldapsearch -x -D 'cn=admin,dc=edificiseminari,dc=com' -w PASSWORD -b 'cn=Entries,cn=Statistics,cn=Monitor' '(objectClass=*)' '*' '+'
# extended LDIF
#
# LDAPv3
# base <cn=Entries,cn=Statistics,cn=Monitor> with scope subtree
# filter: (objectClass=*)
# requesting: * + 
#

# Entries, Statistics, Monitor
dn: cn=Entries,cn=Statistics,cn=Monitor
objectClass: monitorCounterObject
structuralObjectClass: monitorCounterObject
cn: Entries
creatorsName:
modifiersName:
createTimestamp: 20130414155725Z
modifyTimestamp: 20130414155725Z
monitorCounter: 246
entryDN: cn=Entries,cn=Statistics,cn=Monitor
subschemaSubentry: cn=Subschema
hasSubordinates: FALSE

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1 

Una sortida més directe:

$ ldapsearch -x -LLLL -D 'cn=admin,dc=edificiseminari,dc=com' -w PASSWORD -b 'cn=Entries,cn=Statistics,cn=Monitor' 'monitorCounter'
dn: cn=Entries,cn=Statistics,cn=Monitor
monitorCounter: 251

Més informació del que es pot monitoritzar a:

http://www.openldap.org/doc/admin24/monitoringslapd.html#Monitor%20configuration%20via%20cn=config%285%29

IMPORTANT: Cal tenir en compte l'ús de + al final de la consulta, a Monitor la majoria d'atributs són operacionals i no es mostre a no ser que es digui específicament amb aquesta opció. Amb Apache Directory Studio cal posar botó dret Fetch Operational Attributes

Vegeu també el plugin de Cacti:

Cacti Plugin Ldap i/o Cacti i Ldap

Recursos:

Configuració amb cn=config segon mètode

No recordo si em fa funcionar ;-) Crec que no

Amb cn=config, aneu a:

 cn=module{0},cn=config

I afegiu el mòdul a la posició que us toqui (en el meu cas tocava la 3):

dn: cn=module{0},cn=config
objectClass: olcModuleList
cn: module{0}
olcModuleLoad: {0}back_hdb
olcModuleLoad: {1}syncprov
olcModuleLoad: {2}accesslog
olcModuleLoad: {3}back_monitor
olcModulePath: /usr/lib/ldap

Podeu afegir aquestes entrades utilitzant alguna eina gràfica com ADS o per línia de comandes:

$ joe module_monitor.ldif
dn: cn=module{0},cn=config
changetype: modify
add: olcModuleLoad
olcModuleLoad: {3}back_monitor

IMPORTANT: Canvieu el {3} pel número de mòdul que us pertoqui, els podeu consultar amb:

$ sudo ldapsearch -Y EXTERNAL -H ldapi:/// -b "cn=module{0},cn=config"

Un cop tingueu clar el número de mòdul, executeu:

$ sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f module_monitor.ldif

Ara cal crear la base de dades de monitortizació (cn=Monitor) i controlar l'accés a la mateixa.

En aquest punt tenim dos opcions, controlar l'accés amb usuari i paraula de pas o per adreça IP d'origen de la connexió.

Si voleu un usuari executeu:

$ slapdpasswd -s <monitor password>
{SSHA}HF3/T4VdTBr4X0dtzyR33bD7dUgHjsEb

Ara creeu el fitxer:

$ joe cn_monitor.ldif
dn: cn=monitor
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: monitor
description: LDAP monitor
userPassword:{SSHA}HF3/T4VdTBr4X0dtzyR33bD7dUgHjsEb

I l'afegiu amb:

$ sudo ldapadd -x -D cn=admin,dc=iesmontsia,dc=org -w <admins password> -f cn_monitor.ldif

Ara configurem la base de dades, sense usuari però amb control d'adreça IP d'origen el fitxer serà:

$ joe database_monitor.ldif
dn: olcDatabase={2}Monitor,cn=config
objectClass: olcDatabaseConfig
objectClass: olcMonitorConfig
olcDatabase: {2}Monitor
olcAccess: {0}to * by peername.ip=127.0.0.1 read by * none

Sense cap mena d'usuari (accés anònim):

$ joe database_monitor.ldif
dn: olcDatabase={2}Monitor,cn=config
objectClass: olcDatabaseConfig
objectClass: olcMonitorConfig
olcDatabase: {2}Monitor
olcAccess: {0}to * by * read

Si abans heu creat un usuari el LDIF serà:

$ joe database_monitor.ldif
dn: olcDatabase={2}Monitor,cn=config
objectClass: olcDatabaseConfig
objectClass: olcMonitorConfig
olcDatabase: {2}Monitor
olcAccess: {0}to dn.subtree="cn=Monitor" by dn.base="cn=monitor,dc=rekmp,dc=net" read by * none

IMPORTANT: Canvieu el número {2} pel que pertoqui

$ sudo ldapadd -Y EXTERNAL -H ldapi:/// -f database_monitor.ldif

Un exemple de consulta Ldap per a monitoritzar:

$ ldapsearch -x -D cn=monitor,dc=iesmontsia,dc=org -w <monitor password> -b cn=Uptime,cn=Time,cn=Monitor -s base '(objectClass=*)' '*' '+'

NOTA: Cal tenir en compte que es requereix l'esquema core.schema per tal de fer funcionar Slapd Monitoring

Servidor de replica (esclaus)

slurpd

Configuració del master

La configuració del master és la que escaigui més la configuració de la replica. El primer que cal fer és indicar el fitxer de log a la configuració del servidor ldap (fitxer /etc/ldap/slapd.conf):

NOTA: Tots els paràmetres es posen a la secció de base de dades (després del paràmetre database)
replogfile /var/lib/ldap/openldap-master-replog

I cal indicar el servidor esclau (la replica):

replica host=IP_DEL_SERVIDOR_LDAP_REPLICA:389
suffix="dc=aulalinux,dc=ice,dc=upc,dc=edu"
binddn="cn=admin,dc=aulalinux,dc=ice,dc=upc,dc=edu"
credentials=parauladepas
bindmethod=simple
tls=yes


A la rèplica (fitxer slapd.conf del servidor rèplica) cal configurar el servidor Ldap com s'escaigui i afegir:

updatedn cn=admin,dc=aulalinux,dc=ice,dc=upc,dc=edu
updateref ldap://IP_SERVIDOR_MASTER

Al master cal iniciar slurpd. Slurpd és el dimoni que s'encarrega d'enviar les modificacions dels master als esclaus. Amb Debian podem controlar l'execució d'aquest dimoni al fitxer:

/etc/default/slapd

Amb el paràmetre:

SLURPD_START

El valor per defecte és:

# Configure if the slurpd daemon should be started. Possible values: 
# - yes:   Always start slurpd
# - no:    Never start slurpd
# - auto:  Start slurpd if a replica option is found in slapd.conf (default)
SLURPD_START=auto

Com podeu veure s'executa automàticament si al fitxer slapd.conf hi ha una paràmetre rèplica.

Per iniciar la replica val la pena tenir tots dos servidors (master i esclau) parats. Obtenim un còpia del master:

$ sudo slapcat -l /tmp/master.ldif

Copiem el fitxer master a l'esclau. Podem utilitzar SSH.

A l'esclau (amb el servidor apagat executem):

$ sudo slapadd -c -f master.ldif

I ara ja podem iniciar tots dos servidors.


Recursos:

syncrepl

En versions actuals (--acacha 20:48, 12 jul 2010 (UTC)) d'OpenLdap substitueix slurpd. De totes maneres, slurpd encara es pot utilitzar en aquestes versions. La terminologia utilitzada per referir-se als servidors masters i esclaus és:

  • Consumidor (consumer): Servidors esclaus o rèplica
  • Proveïdor (provider): Servidors master

Configuració del proveïdor:

No necessita cap configuració especial.

Configuració del consumidor:

syncrepl rid=123
provider=ldap://provider.example.com:389
type=refreshOnly
interval=01:00:00:00
searchbase="dc=example,dc=com"
filter="(objectClass=organizationalPerson)"
scope=sub
attrs="cn,sn,ou,telephoneNumber,title,l"
schemachecking=off
updatedn="cn=replica,dc=example,dc=com"
bindmethod=simple
binddn="cn=syncuser,dc=example,dc=com"
credentials=secret

IMPORTANT: Si voleu utilitzar SSL cal configurar el servidor i crear certificats. Per defecte al crear el certificat li doneu un FQDN que ha de coincidir amb el que utilitzeu per a per la connexió amb syncrepl. Podeu utilitzar: tls_reqcert never per que no comprovi el FQDN

Syncrepl és més configurable. En aquest exemple el consumidor obté les dades del proveïdor (ldap://provider.example.com:389) una vegada al dia (interval=01:00:00:00)

Per a més informació consulteu el paràmetre syncrepl del manual del fitxer de configuració:

$ man slapd.conf

syncrepl rid=<replica  ID>  provider=ldap[s]://<hostname>[:port]  searchbase=<base  DN>  [type=refreshOnly|refreshAndPersist]   
[interval=dd:hh:mm:ss]  [retry=[<retry interval>  <#  of  retries>]+]  [filter=<filter  str>]  [scope=sub|one|base|subord]  [attrs=<attr  list>]  [attrsonly] [sizelimit= 
<limit>] [timelimit=<limit>] [schemachecking=on|off]  [network-timeout=<seconds>]  [timeout=<seconds>]  [bindmethod=simple|sasl]   [binddn=<dn>]   [saslmech= 
<mech>]   [authcid=<identity>] [authzid=<identity>]    [credentials=<passwd>]    [realm=<realm>]    [secprops=<properties>]    [starttls=yes|critical]   [tls_cert=
<file>]   [tls_key=<file>] [tls_cacert=<file>] [tls_cacertdir=<path>] [tls_reqcert=never|allow|try|demand] [tls_ciphersuite=<ciphers>]  
[tls_crlcheck=none|peer|all]  [logbase=<base  DN>] [logfilter=<filter str>] [syncdata=default|accesslog|changelog]

             Specify the current database as a replica which is kept up-to-date with the master content by establishing the current slapd(8) as a replication consumer site
             running a syncrepl replication engine.  The replica content is kept synchronized to the master content using the LDAP Content  

Synchronization protocol.  Refer to the "OpenLDAP Administrator's Guide" for detailed information on setting up a replicated slapd directory service using the syncrepl 
replication engine. rid  identifies  the  current  syncrepl  directive within the replication consumer site.  It is a non-negative integer not greater 
than 4095 (limited to three hexadecimal digits).

Provider specifies the replication provider site containing the master content as an LDAP URI. If <port> is not given, the standard 
LDAP port number  (389  or 636) is used.

The  content  of  the syncrepl replica is defined using a search specification as its result set. The consumer slapd will send search 
requests to the provider slapd according to the search specification. The search  specification  includes  searchbase,  scope,  filter,  attrs,  attrsonly,  
sizelimit,  and  timelimit parameters  as  in  the normal search specification.  The scope defaults to sub, the filter defaults to (objectclass=*), while there is 
no default searchbase.

The attrs list defaults to "*,+" to return all user and operational attributes, and attrsonly is unset by default.  The sizelimit and   
timelimit  only  accept "unlimited"  and  positive  integers,  and  both default to "unlimited".  The sizelimit and timelimit parameters define a consumer 
requested limitation on the number of entries that can be returned by the LDAP Content Synchronization operation; as such, it is intended to implement partial  
replication  based  on  the size  of  the  replicated database and on the time required by the synchronization.  Note, however, that any provider-side limits for 
the replication identity will be enforced by the provider regardless of the limits requested by the LDAP Content Synchronization operation, much like for any 
other search operation.

The LDAP Content Synchronization protocol has two operation types.  In the refreshOnly operation, the next synchronization search operation  is  periodically
rescheduled  at  an interval time (specified by interval parameter; 1 day by default) after each synchronization operation finishes. In the refreshAndPersist
operation, a synchronization search remains persistent in the provider slapd.  Further updates to the master replica will generate   
searchResultEntry  to  the consumer slapd as the search responses to the persistent synchronization search.
 
If an error occurs during replication, the consumer will attempt to reconnect according to the retry parameter which is a list of the  <retry interval> and <#
of retries> pairs.  For example, retry="60 10 300 3" lets the consumer retry every 60 seconds for the first 10 times and then retry  every 300 seconds for  the
next 3 times before stop retrying. The `+' in <# of retries> means indefinite number of retries until success.  If no retry was specified, by default syncrepl retries every 
hour forever.

The schema checking can be enforced at the LDAP Sync consumer site by turning on the schemachecking parameter. The default is off.  
Schema checking  on  means that  replicated  entries  must  have a structural objectClass, must obey to objectClass requirements in terms of required/allowed 
attributes, and that naming attributes and distinguished values must be present.  As a consequence, schema checking should be off when partial replication is used.

The network-timeout parameter sets how long the consumer will wait to establish a network connection to the provider. Once a 
connection  is  established,  the timeout  parameter  determines  how  long  the  consumer  will  wait  for  the  initial  Bind request to complete. The defaults for  
these parameters come from ldap.conf(5).

A bindmethod of simple requires the options binddn and credentials and should only be used when adequate security services (e.g. TLS or  IPSEC) are  in  place.
REMEMBER:  simple  bind  credentials  must be in cleartext!  A bindmethod of sasl requires the option saslmech.  Depending on the  
mechanism, an authentication identity and/or credentials can be specified using authcid and credentials.  The authzid parameter may be used to specify an 
authorization identity.  Specific security  properties  (as  with the sasl-secprops keyword above) for a SASL bind can be set with the secprops option. A non default 
SASL realm can be set with the realm option.  The identity used for synchronization by the consumer should be allowed to receive an unlimited number of entries in 
response to  a  search request.  The provider, other than allow authentication of the syncrepl identity, should grant that identity appropriate access 
privileges to the data that is being replicated (access directive), and appropriate time and size limits.  This can be accomplished by either allowing unlimited 
sizelimit and timelimit,  or by setting an appropriate limits statement in the consumer's configuration (see sizelimit and limits for details).

The starttls parameter specifies use of the StartTLS extended operation to establish a TLS session before Binding to the provider. If the critical argument is
supplied, the session will be aborted if the StartTLS request fails. Otherwise the syncrepl session continues without TLS. The tls_reqcert setting defaults to "demand" and 
the other TLS settings default to the same as the main slapd TLS settings. Rather than replicating whole entries, the consumer can query logs of data modifications. This 
mode of operation is referred to as delta syncrepl. In addition to the above parameters, the logbase and logfilter parameters must be set appropriately for the log that 
will be used. The syncdata parameter must be  set  to either  "accesslog"  if  the  log  conforms  to the slapo-accesslog(5) log format, or "changelog" if the log conforms 
to the obsolete changelog format. If the syncdata parameter is omitted or set to "default" then the log parameters are ignored.

Recursos:

Configuració amb cn=config

NOTA: Només s'aplica a configuracions amb cn config, per exemple Ubuntu 11.10 o superior

Canvis al master (proveïdor):

Creeu una carpeta on guardar els fitxers necessaris per fer la configuració:

$ sudo mkdir /etc/ldap/configuracioInicial/ && cd /etc/ldap/configuracioInicial/

Creeu un fitxer LDIF:

$ sudo joe provider_sync.ldif

Afegiu:

# Add indexes to the frontend db.
dn: olcDatabase={1}hdb,cn=config
changetype: modify
add: olcDbIndex
olcDbIndex: entryCSN eq
-
add: olcDbIndex
olcDbIndex: entryUUID eq

#Load the syncprov and accesslog modules.
dn: cn=module{0},cn=config
changetype: modify
add: olcModuleLoad
olcModuleLoad: syncprov
-
add: olcModuleLoad
olcModuleLoad: accesslog

# Accesslog database definitions
dn: olcDatabase={2}hdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcHdbConfig
olcDatabase: {2}hdb
olcDbDirectory: /var/lib/ldap/accesslog
olcSuffix: cn=accesslog
olcRootDN: cn=admin,dc=example,dc=com
olcDbIndex: default eq
olcDbIndex: entryCSN,objectClass,reqEnd,reqResult,reqStart

# Accesslog db syncprov.
dn: olcOverlay=syncprov,olcDatabase={2}hdb,cn=config
changetype: add
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: syncprov
olcSpNoPresent: TRUE
olcSpReloadHint: TRUE

# syncrepl Provider for primary db
dn: olcOverlay=syncprov,olcDatabase={1}hdb,cn=config
changetype: add
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: syncprov
olcSpNoPresent: TRUE

# accesslog overlay definitions for primary db
dn: olcOverlay=accesslog,olcDatabase={1}hdb,cn=config
objectClass: olcOverlayConfig
objectClass: olcAccessLogConfig
olcOverlay: accesslog
olcAccessLogDB: cn=accesslog
olcAccessLogOps: writes
olcAccessLogSuccess: TRUE
# scan the accesslog DB every day, and purge entries older than 7 days
olcAccessLogPurge: 07+00:00 01+00:00

IMPORTANT: Fixeu-vos que heu de canviar la línia olcRootDN: cn=admin,dc=example,dc=com i adaptar-la al root dn del vostre servidor Ldap

Ara creeu la carpeta /var/lib/ldap/accesslog/:

$ sudo -u openldap mkdir /var/lib/ldap/accesslog
$ sudo -u openldap cp /var/lib/ldap/DB_CONFIG /var/lib/ldap/accesslog/

També cal modificar la configuració de Apparmor:

$ sudo joe /etc/apparmor.d/usr.sbin.slapd

Afegiu les línies:

/var/lib/ldap/accesslog/ r,
/var/lib/ldap/accesslog/** rwk,

Al final del fitxer (abans però del }).

Torneu a iniciar Apparmor:

$ sudo /etc/init.d/apparmor reload

Ara executeu:

$ sudo ldapadd -Y EXTERNAL -H ldapi:/// -f provider_sync.ldif

O si ja teniu establerta una paraula de pas per tal de poder modificar la configuració de Ldap:

$ sudo ldapadd -x -D cn=admin,cn=config -W -f provider_sync.ldif

Canvis al slave (consumer):

El servidor Ldap esclau (en terminologia de syncrepl el consumidor) cal configurar-lo de la mateixa manera que el servidor Master (proveïdor). Seguiu doncs les passes de:

 Instal·lació de Ldap

NOTA: Tingueu en compte que amb el nou instal·lador del servidor Ldap de les versions d'Ubuntu 11.10 o superiors no es crea un usuari d'accés a la base de dades cn config. Consulteu Afegir usuari i paraula de pas per accedir a cn=config

Només les opcions referents a syncrepl seran diferents. Creeu un fitxer anomenat consumer_sync.ldif a:

$ sudo mkdir /etc/ldap/configuracioInicial/ && cd /etc/ldap/configuracioInicial/

amb el següent contingut:

$ sudo joe consumer_sync.ldif
#Load the syncprov module.
dn: cn=module{0},cn=config
changetype: modify
add: olcModuleLoad
olcModuleLoad: syncprov

# syncrepl specific indices
dn: olcDatabase={1}hdb,cn=config
changetype: modify
add: olcDbIndex
olcDbIndex: entryUUID eq
-
add: olcSyncRepl
olcSyncRepl: rid=0 provider=ldap://ldap01.example.com bindmethod=simple binddn="cn=admin,dc=example,dc=com" 
 credentials=secret searchbase="dc=example,dc=com" logbase="cn=accesslog" 
 logfilter="(&(objectClass=auditWriteObject)(reqResult=0))" schemachecking=on 
 type=refreshAndPersist retry="60 +" syncdata=accesslog
-
add: olcUpdateRef
olcUpdateRef: ldap://ldap01.example.com

IMPORTANT - canviar:

  • AdreçaProviderLDAP- per l'adreça o la IP del profeidor ldap com per exemple: ldap.domini.com o 192.168.0.1 ( IP del sistema mestre)
  • DOMINI - canviar-lo pel domini que tinguessim instal.lat.
  • ParaulaPasAdminProvider - paraula de pàs de cn=admin,cn=config del proveïdor.

NOTA: Per a un accés segur les URL són ldaps i el bindmethod és SASL (a part de configurar correctament els certificats)

NOTA: Heu de canviar els paràmetres que estan en negreta per tal d'adaptar-los a la vostra configuració.

Un exemple més concret:

{0}rid=0 provider=ldap://ldap.iesebre.com bindmethod=simple starttls=critical  binddn="cn=admin,dc=iesebre,dc=com" credentials=PASSWORD 
searchbase="dc=iesebre,dc=com" logbase="cn=accesslog" logfilter="(&(objectClass=auditWriteObject)(reqResult=0))" schemachecking=off 
type=refreshAndPersist retry="60 +" syncdata=accesslog

Assegureu-vos que teniu el client Ldap instal·lat

$ sudo apt-get install ldap-utils

Un cop tingueu el fitxer salvat:

$ sudo ldapadd -c -Y EXTERNAL -H ldapi:/// -f consumer_sync.ldif

Si us dona l'error:

additional info: modify/add: olcModuleLoad: value #0 already exists

És possible que ja tingueu el mòdul carregat! Això pot passar per exemple si es decideix partir no pas d'una instal·lació del servidor Ldap de replica des de zero sinó d'una còpia del master (al master ja vam configurar aquest mòdul). Per replicar un servidor Ldap només cal copiar les carpetes /var/lib/ldap i /etc/ldap (important! Cal mantindrà els permisos i haver instal·lat prèviament el paquet slapd)

I si us dona l'error:

modifying entry "olcDatabase={1}hdb,cn=config"
ldap_modify: Other (e.g., implementation specific) error (80)
	additional info: Base DN "accesslog" is not within the database naming context

Es tracta un altre cop de que partiu de un ldap no acabat d'instal·lar sinó d'una còpia del master. El fitxer només hauria de tenir:

# syncrepl specific indices
dn: olcDatabase={1}hdb,cn=config
changetype: modify
add: olcSyncRepl
olcSyncRepl: rid=0 provider=ldap://ldap.tortosa.guifi.net bindmethod=simple binddn="cn=admin,dc=augute,dc=org" 
 credentials=PASSWORD searchbase="dc=augute,dc=org" logbase="cn=accesslog" 
 logfilter="(&(objectClass=auditWriteObject)(reqResult=0))" schemachecking=off 
 type=refreshAndPersist retry="60 +" syncdata=accesslog
-
add: olcUpdateRef
olcUpdateRef: ldap://ldap.tortosa.guifi.net

O si heu canviat els permisos per accedir al config:

$ sudo ldapadd -x -D cn=admin,cn=config -W -f consumer_sync.ldif 

Ara, un dels requisits que han d'haver entre l'esclau i el mestre, és que han de tindre els mateixos esquemes, per això copiarem els esquemes del servidor Master a un lloc del servidor Esclau.

  • A l'equip MASTER:
sudo -s
cd /etc/ldap/slapd.d/cn=config
scp -r cn=schema AdreçaIPEsclau:/tmp
exit
  • A l'equip ESCLAU:
sudo -s
cd /tmp/slapd.d/cn=config
cp -r /tmp/slapd.d/cn=config/cn=schema /etc/ldap/slapd.d/cn\=config/
chown -R openldap:openldap /etc/ldap/slapd.d/cn\=config/cn=schema
exit

Reinciem el servei ldap

sudo service slapd restart

Hauria de donar tot OK.

Comprovar el funcionament de la replicació. Fitxers de log

Per defecte Ldap mostra els missatges de replicació a /var/log/syslog:

$ sudo tail -f /var/log/syslog

Podeu filtrar els missatges amb:

$ sudo cat /var/log/syslog | grep slapd

IMPORTANT: Cal establir el nivell de log del servidor Ldap amb el paràmetre logLevel. El valor per a syncrepl és 16384 o també es pot posar -1 per mostrar tots els missatges

Per exemple podeu veure errors com:

Jan 19 07:44:20 linux slapd[20398]: syncrepl_message_to_op: rid=000 mods check (objectClass: value #5 invalid per syntax)
Jan 19 07:44:20 linux slapd[20398]: do_syncrepl: rid=000 rc 21 retrying

Normalment aquest tipus d'errors són deguts a que el master i l'esclau no tenen els mateixos esquemes instal·lats.

Amb el loglevel per defecte no sortiran gaires detalls. Si poseu el loglevel a tope (-1) podreu veure més detalls. Alguns exemples:

$ sudo tail -f /var/log/syslog | grep syncrep
Com s'eliminen objectes:
Jan 19 11:19:59 linux slapd[24433]: syncrepl_message_to_op: rid=000 be_add uid=cadpc06$,ou=Computers,ou=CAD,ou=Planta1,ou=alumnat,ou=Computers,ou=All,dc=iesebre,dc=com (0)
Jan 19 11:19:59 linux slapd[24433]: do_syncrep2: rid=000 cookie=rid=000,csn=20110113122436.487866Z#000000#000#000000
...

NOTA: El loglevel és un atribut de l'objecte cn=config

$ sudo tail -f /var/log/syslog | grep syncrep
Com s'afegeixen objectes:
Jan 19 11:39:52 linux slapd[24649]: syncrepl_entry: rid=000 LDAP_RES_SEARCH_ENTRY(LDAP_SYNC_ADD)
Jan 19 11:39:52 linux slapd[24649]: syncrepl_entry: rid=000 inserted UUID 04fde648-1495-102f-90e2-0b4495093458
Jan 19 11:39:52 linux slapd[24649]: syncrepl_entry: rid=000 be_search (0)
Jan 19 11:39:52 linux slapd[24649]: syncrepl_entry: rid=000 cn=ireneruiz,ou=groups,ou=Curs 2,ou=Dietètica,ou=Sanitat,ou=Alumnes,ou=All,dc=iesebre,dc=com
Jan 19 11:39:52 linux slapd[24649]: syncrepl_entry: rid=000 be_add cn=ireneruiz,ou=groups,ou=Curs 2,ou=Dietètica,ou=Sanitat,ou=Alumnes,ou=All,dc=iesebre,dc=com (0)
Jan 19 11:39:52 linux slapd[24649]: syncrepl_entry: rid=000 LDAP_RES_SEARCH_ENTRY(LDAP_SYNC_ADD)
Jan 19 11:39:52 linux slapd[24649]: syncrepl_entry: rid=000 inserted UUID 521d8c62-1495-102f-90ec-0b4495093458
Jan 19 11:39:52 linux slapd[24649]: syncrepl_entry: rid=000 be_search (0)
Jan 19 11:39:52 linux slapd[24649]: syncrepl_entry: rid=000 cn=Vilaplana Pla Joan Miquel,ou=people,ou=Grup A,ou=Curs  
2,ou=Dietètica,ou=Sanitat,ou=Alumnes,ou=All,dc=iesebre,dc=com
Jan 19 11:39:52 linux slapd[24649]: syncrepl_entry: rid=000 be_add cn=Vilaplana Pla Joan Miquel,ou=people,ou=Grup A,ou=Curs  
2,ou=Dietètica,ou=Sanitat,ou=Alumnes,ou=All,dc=iesebre,dc=com (0)
Jan 19 11:39:52 linux slapd[24649]: syncrepl_entry: rid=000 LDAP_RES_SEARCH_ENTRY(LDAP_SYNC_ADD)
Jan 19 11:39:52 linux slapd[24649]: syncrepl_entry: rid=000 inserted UUID 52516e4c-1495-102f-90f0-0b4495093458
Jan 19 11:39:52 linux slapd[24649]: syncrepl_entry: rid=000 be_search (0)
Jan 19 11:39:52 linux slapd[24649]: syncrepl_entry: rid=000 cn=joanvilaplana,ou=groups,ou=Curs 2,ou=Dietètica,ou=Sanitat,ou=Alumnes,ou=All,dc=iesebre,dc=com
Jan 19 11:39:52 linux slapd[24649]: syncrepl_entry: rid=000 be_add cn=joanvilaplana,ou=groups,ou=Curs 2,ou=Dietètica,ou=Sanitat,ou=Alumnes,ou=All,dc=iesebre,dc=com (0)
Jan 19 11:39:52 linux slapd[24649]: syncrepl_entry: rid=000 LDAP_RES_SEARCH_ENTRY(LDAP_SYNC_ADD)
Jan 19 11:39:52 linux slapd[24649]: syncrepl_entry: rid=000 inserted UUID 9870a046-1495-102f-90fa-0b4495093458
Jan 19 11:39:52 linux slapd[24649]: syncrepl_entry: rid=000 be_search (0)
Jan 19 11:39:52 linux slapd[24649]: syncrepl_entry: rid=000 cn=Lleixà Ferrando Paula,ou=people,ou=Grup A,ou=Curs 2,ou=Integració Social,ou=Serveis  socioculturals,ou=Alumnes,ou=All,dc=iesebre,dc=com
Jan 19 11:39:52 linux slapd[24649]: syncrepl_entry: rid=000 be_add cn=Lleixà Ferrando Paula,ou=people,ou=Grup A,ou=Curs 2,ou=Integració Social,ou=Serveis  socioculturals,ou=Alumnes,ou=All,dc=iesebre,dc=com (0)
Jan 19 11:39:52 linux slapd[24649]: syncrepl_entry: rid=000 LDAP_RES_SEARCH_ENTRY(LDAP_SYNC_ADD)
Jan 19 11:39:52 linux slapd[24649]: syncrepl_entry: rid=000 inserted UUID 98978292-1495-102f-90fe-0b4495093458
Jan 19 11:39:52 linux slapd[24649]: syncrepl_entry: rid=000 be_search (0)
Jan 19 11:39:52 linux slapd[24649]: syncrepl_entry: rid=000 cn=paulalleixa,ou=groups,ou=All,dc=iesebre,dc=com
...

FAQ

Resolució de problemes

Desactivar una replica per que no sincronitzi més però mantingui les dades

Consulteu #S'esborra tota la replica menys l'objecte principal

Tornar a crear tota una replica Ldap

Consulteu #S'esborra tota la replica menys l'objecte principal

S'esborra tota la replica menys l'objecte principal

Si tenim que restaurar una copia completa del servidor ldap principal, els esclaus detectaran que tots els objectes han canviat i primer intentaran esborrar-ho tot i després tornar a crear tots els objectes. Si pel que sigui no pot esborrar l'arrel aleshores semblarà que s'ha buidat tota la replica.

En el meu cas el que vaig fer és eliminar a mà l'arrel de la replica (connectant-me amb ADS). Per poder-ho fer abans vaig haver de treure la configuració de replica, és a dir esborrar l'atribut olcSyncrepl de l'objecte olcDatabase={1}hdb,cn=config, però primer fent una copia per tornar-ho a posar després:

olcSyncrepl: {0}rid=0 provider=ldap://ldap.iesebre.com bindmethod=simple sta
rttls=critical  binddn="cn=admin,dc=iesebre,dc=com" credentials=password
Ig searchbase="dc=iesebre,dc=com" logbase="cn=accesslog" logfilter="(&(obje
ctClass=auditWriteObject)(reqResult=0))" schemachecking=off type=refreshAnd
Persist retry="60 +" syncdata=accesslog

Un cop esborrada l'arrel i tornat a posar l'objecte olcSyncrepl, veureu que no es replica tot l'arbre, només els objectes nous!

Cal arrancar el servidor amb una opció especial que indiqui la cookie de sincronització a 0 per forçar un reload complet.

$ sudo joe /etc/default/slapd
...
SLAPD_OPTIONS="-c rid=0,csn=0"
#SLAPD_OPTIONS=""

Al log veurem missatges de com s'estan afegint les màquines. Quan hagiu acabat la resincronització torneu a editar /etc/default/slapd per deixar-lo com estava abans.

syncrepl_message_to_entry: rid=000 mods check (objectClass: value #0 invalid per syntax)

Si el fitxer de log us diu:

$ sudo tail -f /var/log/syslog
Jun 22 19:58:08 professorat slapd[9657]: syncrepl_message_to_entry: rid=000 mods check (objectClass: value #0 invalid per syntax)
Jun 22 19:58:08 professorat slapd[9657]: do_syncrepl: rid=000 rc 21 retrying

Possiblement (al menys en el meu cas) el problema és que no teniu els mateixos esquemes de Ldap al consumer (slave) i al proveïdor (master). Al posar els mateixos esquemes. De fet copiant la carpeta /etc/ldap/slapd.d/cn=config/cn\=schema del master al esclau i posant bé els propietaris dels fitxers:

$ cd /etc/ldap/slapd.d/cn\=config/
$ sudo scp -r root@192.168.0.108:/etc/ldap/slapd.d/cn=config/cn\=schema .
$ sudo chown -R openldap:openldap *
$ sudo /etc/init.d/slapd restart

La configuració que ha funcionat:

olcSyncrepl:

Sense TLS:

{0}rid=0 provider=ldap://192.168.0.108 bindmethod=simple binddn="cn=admin,dc=iesebre,dc=com" credentials=paraula_de_pas 
searchbase="dc=iesebre,dc=com" logbase="cn=accesslog" logfilter="(&(objectClass=auditWriteObject)(reqResult=0))" schemachecking=on 
type=refreshAndPersist retry="60 +" syncdata=accesslog

Amb TLS:

{0}rid=0 provider=ldap://192.168.0.108 bindmethod=simple starttls=critical binddn="cn=admin,dc=iesebre,dc=com" credentials=ie76pNCgxC3Ig 
searchbase="dc=iesebre,dc=com" logbase="cn=accesslog" logfilter="(&(objectClass=auditWriteObject)(reqResult=0))" schemachecking=on 
type=refreshAndPersist retry="60 +" syncdata=accesslog

NOTA: Per tal que funcioni TLS cal instal·lar els certificats client

slap_client_connect: ldap_sasl_interactive_bind_s failed (49)
$ sudo tail -f /var/log/syslog
Jun 22 19:33:18 professorat slapd[9657]: slap_client_connect: URI=ldap://192.168.0.108 ldap_sasl_interactive_bind_s failed (49)
Jun 22 19:33:18 professorat slapd[9657]: do_syncrepl: rid=000 rc 49 retrying

Normalment aquest error és degut a que ens intentem connectar a un servidor amb TLS i no ho hem indicat correctament. La configuració del paràmetre olcSyncRepl (l'àntic SyncRepl):

rid=0 provider=ldap://ldap01.example.com bindmethod=simple binddn="cn=admin,dc=example,dc=com" 
credentials=secret searchbase="dc=example,dc=com" logbase="cn=accesslog" 
logfilter="(&(objectClass=auditWriteObject)(reqResult=0))" schemachecking=on 
type=refreshAndPersist retry="60 +" syncdata=accesslog

Cal posar per exemle:

rid=0 provider=ldap://192.168.0.108 bindmethod=simple starttls=critical binddn="cn=admin,dc=iesebre,dc=com" credentials=parauladepas 
searchbase="dc=iesebre,dc=com" logbase="cn=accesslog" logfilter="(&(objectClass=auditWriteObject)(reqResult=0))" schemachecking=on 
type=refreshAndPersist retry="60 +" syncdata=accesslog

Més informació

Monitorització. Nagios

Syncrepl i Nagios

El projecte ltb (http://ltb-project.org/wiki/) proporciona un script per comprovar les repliques, vegeu la web:

http://ltb-project.org/wiki/documentation/nagios-plugins/check_ldap_syncrepl_status

Els executables els trobareu a:

http://ltb-project.org/wiki/download#monitoring

NOTA: També hi ha un plugin per a Cacti

Com a requeriments necessita els scripts de Perl:

Getopt::Long
File::Basename
POSIX
Net::LDAP
Date::Manip

Per instal·lar l'script:

$ cd
$ mkdir nagios_plugins && cd nagios_plugins
$ wget http://tools.ltb-project.org/attachments/download/488/ltb-project-nagios-plugins-0.4.tar.gz
$ tar zxf ltb-project-nagios-plugins-0.4.tar.gz
$ sudo cp ltb-project-nagios-plugins-0.4.tar.gz/check_ldap_syncrepl_status.pl /usr/lib/nagios/plugins
$ chmod +x /usr/lib/nagios/pluginscheck_ldap_syncrepl_status.pl

L'script s'utilitza amb:

check_ldap_syncrepl_status.pl -H <hostname> [-h] [-v] [-V]

Vegeu també Nagios

Recursos

Client LDAP

Instal·lació

El paquet amb les eines client és ldap-utils.Per instal·lar:

$ sudo apt-get install ldap-utils

Podem consultar els fitxers que instal·la ldap-utils amb la comanda:

$ dpkg -L ldap-utils

Lpap-utils ens proporciona les següents comandes:

$ dpkg -L ldap-utils | grep bin
/usr/bin
/usr/bin/ldapsearch
/usr/bin/ldapmodify
/usr/bin/ldapdelete
/usr/bin/ldapmodrdn
/usr/bin/ldappasswd
/usr/bin/ldapwhoami
/usr/bin/ldapcompare
/usr/bin/ldapadd

La resta de fitxers són manuals i documentació (carpeta /usr/share/doc).

Configuració del client

IMPORTANT: Tan client com servidor comparteixen carpeta de configuració /etc/ldap però no pas fitxers. Consulteu també Ldap#Configuraci.C3.B3_de_slapd

Els clients poden utilitzar dos tipus de fitxers de configuració:

Els fitxers de configuració s'utilitzen per configurar paràmetres per defecte

El fitxer de configuració del client és ldap.conf:

$ cat /etc/ldap/ldap.conf 

# $OpenLDAP: pkg/ldap/libraries/libldap/ldap.conf,v 1.9 2000/09/04 19:57:01 kurt Exp $
#
# LDAP Defaults
# 

# See ldap.conf(5) for details
# This file should be world readable but not world writable.

#BASE   dc=example, dc=com
#URI    ldap://ldap.example.com ldap://ldap-master.example.com:666 

#SIZELIMIT      12
#TIMELIMIT      15
#DEREF          never

Un exemple de configuració:

$ cat /etc/ldap/ldap.conf
... 

#BASE   dc=example, dc=com
#URI    ldap://ldap.example.com ldap://ldap-master.example.com:666
URI ldap://localhost
...

Les configuracions també es poden fer a nivell d'usuari utilitzant el fitxer:

~/.ldaprc

Recursos

Format LDIF

Problema dels salts de línia del fitxer ldif: Ldap#Problemes_amb_dn_llargs_i_sortida_de_l.27ordre_ldapsearch

LDIF són les inicials de LDAP Data Interchange Format i és un format de text que s'utilitza per representar les entrades d'un arbre Ldap en format text. També permet indicar modificacions dels registres ldap. Les eines ldap com ldapsearch o ldapadd/ldapmodify poden leegir i crear fitxers LDIF.

Els caràcters vàlids en un fitxer Ldif són segons el RFC (http://tools.ietf.org/html/draft-ietf-asid-ldif-02):

safe                 = <ASCII values 040 - 0377 octal (32 - 255 decimal)>
safe-initval         = <ASCII values 040 - 0377 octal (32 - 255 decimal),
                         excluding colon (":", ASCII 58 decimal), SPACE, and
                         less-than ("<" , ASCII 60 decimal)>

Vegeu també l'ordre [ascii]].

Tots els caràcters que no estiguin dins del rang indicat cal codificar-los en base64 per tal de poder utilitzar-los en un ldif.

Del manual:

$ man ldif

ENTRY RECORDS

Els registres d'entrada LDIF s'utilitzen per representar entrades del directori. La forma bàsica d'un registre d'entrada és:

dn: <distinguished name>
<attrdesc>: <attrvalue>
<attrdesc>: <attrvalue>
<attrdesc>:: <base64-encoded-value>
<attrdesc>:< <URL>
...

Com podeu veure els valors poden ser valors de text simples (en UTF-8), binaris representats amb el format de text base64 o URLs. En el cas de les URL representen la localització on es pot trobar el valor (p.ex. file://tmp/fitxer.jpeg)

Cada registre està separat per una línia en blanc. Una línia pot continuar l'anterior simplement començant la línia amb un espai en blanc o tabulador:

dn: cn=Barbara J Jensen,dc=exam
 ple,dc=com

Les línies que comencen amb el coixinet (#) són comentaris i són ignorades.

Es poden especificar múltiples valors per als atributs en línies separades:

cn: Barbara J Jensen
cn: Babs Jensen

Si un valor conté un caràcter no imprimible o comença per un espai o dos punts ":" (colon en anglès) el <attrtype> aleshores té doble colon i el valor està codificat en base64. Per exemple el valor " begins with a space" es codifica:

cn:: IGJlZ2lucyB3aXRoIGEgc3BhY2U=

Si el valor es troba a un fitxer aleshores s'utilitza ":<" i seguit d'una URI. Per exemple:

cn:< file:///tmp/value

Vegem un exemple amb totes les combinacions:

           dn: cn=Barbara J Jensen,dc=example,dc=com
           cn: Barbara J Jensen
           cn: Babs Jensen
           objectclass: person
           description:< file:///tmp/babs
           sn: Jensen
           dn: cn=Bjorn J Jensen,dc=example,dc=com
           cn: Bjorn J Jensen
           cn: Bjorn Jensen
           objectclass: person
           sn: Jensen
           dn: cn=Jennifer J Jensen,dc=example,dc=com
           cn: Jennifer J Jensen
           cn: Jennifer Jensen
           objectclass: person
           sn: Jensen
           jpegPhoto:: /9j/4AAQSkZJRgABAAAAAQABAAD/2wBDABALD
            A4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQ
            ERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVG
           ...

CHANGE RECORDS:

Els registres de canvi de LDIF s'utilitzen per tal de representar canvis al directori. Cada registre de canvi comença amb una línia que indica el distinguished name (dn) de la entrada que es vol modificar i el canvi que es vol realitzar:

dn: <distinguishedname>

changetype: <[modify|add|delete|modrdn]>

I seguidament es mostra la informació del canvi que és vol realitzar. El format depèn del tipus de canvi que es vol realitzar:

Modificació:

Opció 1. Afegir:

add: <attributetype>
<attrdesc>: <value1>
<attrdesc>: <value2>
...
-

NOTA: Com podeu veure es poden canviar múltiples atributs al mateix temps. En aquest cas (afegir) es respecten els valors existents. L'última línia acabada en "-" és important ja que permet que en un mateix registre puguem convidar modificacions, afegir o esborrar.

Opció 2. Reemplaçar:

replace: <attributetype>
<attrdesc>: <value1>
<attrdesc>: <value2>
...
-

Opció 3. Esborrar:

delete: <attributetype>
<attrdesc>: <value1>
<attrdesc>: <value2>
...
-

Si no s'especifica tipus d'atribut al fer un delete, l'atribut sencer és esborrat.

Un exemple:

           dn: cn=Babs Jensen,dc=example,dc=com
           changetype: add
           objectclass: person
           objectclass: extensibleObject
           cn: babs
           cn: babs jensen
           sn: jensen
           dn: cn=Babs Jensen,dc=example,dc=com
           changetype: modify
           add: givenName
           givenName: Barbara
           givenName: babs
           -
           replace: description
           description: the fabulous babs
           -
           delete: sn
           sn: jensen
           -
           dn: cn=Babs Jensen,dc=example,dc=com
           changetype: modrdn
           newrdn: cn=Barbara J Jensen
           deleteoldrdn: 0
           newsuperior: ou=People,dc=example,dc=com
           dn: cn=Barbara J Jensen,ou=People,dc=example,dc=com
           changetype: delete

Finalment cal saber que hi ha la possibilitat d'utilitzar un fitxer extern amb include:

include: file:///tmp/example.com.ldif


csv2ldif

És un script de Perl que permet passar dades de format CSV (es poden obtenir com exportacions de full de càlcul d'OpenOffice o Office).

Podeu obtenir l'script amb:

$ cd
$ mkdir csv2ldif & cd csv2ldif
$ wget http://heanet.dl.sourceforge.net/project/csv2ldif2/cvs2ldif2/1.0.1/csv2ldif-1.0.1.tar.gz
$ tar xvzf csv2ldif-1.0.1.tar.gz

Per tal que funcioni cal tenir Perl instal·lat i els mòduls:

$ sudo cpan -i Jcode MIME::Base64 Getopt::Std

Un exemple, amb el fitxer CSV:

$ cat data.csv
cn,attr1,attr_mv,attr_mv
foo,test,mv1,mv2
bar,test2,some_mv1,some_other_mv
foo,test,mv3,mv4
sergitur,Sergi Tur,Informàtica,hey

Si executeu:

$ cat data.csv | perl csv2ldif2.pl -b "ou=example,dc=com"
dn: cn=bar,ou=example,dc=com
cn: bar
attr1: test2
attr_mv: some_mv1
attr_mv: some_other_mv 

dn: cn=foo,ou=example,dc=com
cn: foo
attr1: test
attr_mv: mv1
attr_mv: mv2
attr_mv: mv3
attr_mv: mv4

dn: cn=sergitur,ou=example,dc=com
cn: sergitur
attr1: Sergi Tur
attr_mv:: SW5mb3Jtw4PCoHRpY2E=
attr_mv: hey

IMPORTANT: Observeu com codifica en base64 els caràcters "estranys" com els accents

Ldif i base64

Cal tenir en compte diferents temes relacionats amb Ldif i caràcters que no siguin ASCII com per exemple les vocals amb accent o altres caràcters especials com la ç. També cal dir que línies molt llarges. Per exemple el següents fitxers es carrega correctament:

$ cat prova.ldif
dn: ou=çgaroupsAmbAccentsIMOLTLLARGINFORMÀTICAinformàtica,ou=maninfo,ou=Personal,ou=All,dc=iesmontsia,dc=org
objectClass: organizationalUnit
ou: groups
structuralObjectClass: organizationalUnit


Consulteu també base64.

Accés a un servidor Ldap. Usuaris

A diferència de altres sistemes gestors de bases de dades com el relacional MySQL, no existeix una base de dades específica on es guardin els usuaris que tenen accés a la base de dades. Els usuaris es guarden a la mateixa base de dades Ldap.

Així per exemple l'usuari:

cn=Tur Badenas Sergi,ou=people,ou=Informàtica,ou=Profes,ou=All,dc=iesebre,dc=com

Al tractar-se d'un objecte posixAccount i amb paraula de pas, pot utilitzar aquest paraula de pas, conjuntament amb el seu nom d'usuari (important: tot el DN).. El que pugui fer aquest usuari està determinat per les ACL. Una ACL típica de configuració del servidor és:

dn: olcDatabase={1}hdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcHdbConfig
olcDatabase: {1}hdb
olcDbDirectory: /var/lib/ldap
olcAccess: {0}to attrs=userPassword,shadowLastChange,carLicense,email,facsim
ileTelephoneNumber,sambaNTPassword,sambaLMPassword,roomNumber,telephoneNumb
er,st,irisPersonalUniqueId,mobile,postalCode by dn="cn=admin,dc=iesebre,dc=
com" write by dn="cn=webfaltes,ou=people,ou=acls,dc=iesebre,dc=com" read by
 dn="cn=adminGoSA,dc=iesebre,dc=com" by anonymous auth by self write by * n
one
olcAccess: {1}to * by * read
olcAccess: {2}to dn.subtree="" by * read
...

Cal tenir en compte que a l'usuari rootDN no se li apliquen les ACL.

Comandes

Podem trobar alguns exemples a:

Paràmetres comuns. Autenticació

Totes les comandes que requereixin d'autenticació serà necessari especificar l'usuari, la paraula de pas, la màquina i alguna altre opció.

Exemple:

ldapadd -x -H "ldaps://localhost" -D "cn=admin" -W -f exemple.ldif

Màquina:

-H "ldaps://localhost"

especificant una URL o:

-h localhost

especificant un nom de màquina

Usuari (Binddn):

És el nom distintiu del usuari (identificació única del node on esta l'usuari bindn dins de l'arbre ldap):

-D "cn=admin"

Paraula de pas:

-W

i ens pregunta per línia de comandes la paraula de pas. També es pot especificar amb:

-w password

Si no posem aquest paràmetre obtenim errors com:

ldapadd -H "ldaps://localhost" -D "cn=admin" -W -f exemple.ldif
Enter LDAP Password:
ldap_sasl_interactive_bind_s: No such attribute (16)

Finalment la opció -x és per utilitzar autentificació simple en comptes de SASL.

ldapsearch

Podem executar la següent comanda per comprovar si està instal·lat el servidor ldap:

$ ldapsearch -x -b  -s base '(objectclass=*)' namingContexts

On:

  • -x: Utilitzar l'autenticació normal en comptes de SASL
  • -b: La cerca és fa des de la base del directori ldap.
  • -s base '(objectclass=*): Fem la cerca a partir d'un objecte base. A l'utilitzar '(objectclass=*) mostrem tots els objectes

Això és si executem la comanda des de el mateix servidor ldap. Per provar-ho desde un altre màquina:

$ ldapsearch -h "10.0.2.2" -x -b  -s base '(objectclass=*)' namingContexts

Un altre exemple:

$ldapsearch -x -b 'uid=tester,ou=People,dc=pinux,dc=info'

Per comprovar que funciona TLS, es fa amb -ZZ:

$ ldapsearch -x -h ldap.edu.example.org -ZZ -b dc=edu,dc=example,dc=org

Exemples de cerca:

  • (mail=*) Totes les entrades que tinguin mail
  • (mail=*@*) Totes les entrades que tinguin mail vàlid
  • (sn=smith) Busqueda exacte per nom
  • (sn=s*) Entrades amb cognom començant per s o S
  • (cn=*a*i*) Entrades amb una a o una i en qualsevol lloc
  • (telephonenumber=*555)
  • (objectclass=person) Buscar objectes person

Els resultats de la cerca es mostren en format ldif amb comentaris i una capçalera. Per mostrar només el camp buscat utilitzeu -LLL:

$ ldapsearch -h localhost -D "cn=admin,dc=iesebre,dc=com" -w secret -x -b dc=iesebre,dc=com  -LLL '(irisPersonalUniqueID=15369003K)' dn

Els camps en contingut binari es mostren en codi base64:

$ ldapsearch -h localhost -D "cn=admin,dc=iesebre,dc=com" -w secret  -x -b dc=iesebre,dc=com -u -LLL '(irisPersonalUniqueID=47823452V)' jpegPhoto | more
dn:: Y249RGVsbGEgVmlkaWVsbGEgTm9lbWksb3U9cGVvcGxlLG91PUN1cmVzIGF1eGlsaWFycyBk4
oCZaW5mZXJtZXJpYSxvdT1TYW5pdGF0LG91PUFsdW1uZXMsb3U9QWxsLGRjPWllc2VicmUsZGM9Y2
9t
ufn: Pim Pam Noemi, people, Cures auxiliars d\E2\80\99infermeria, Sanit
at, Alumnes, All, iesebre.com
jpegPhoto:: /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBQgMFBofBgYHCg0dHhwHBwgMFB0jHA
cJCw8aLCgfCQsTHCI3NCcMEhwgKTQ5LhkgJyw0PTwzJC4wMTgyNDL/2wBDAQkJDBgyMjIyCQsNITI
yMjIMDRwyMjIyMhghMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAFp
APoDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAHwEAAwEBAQEBA
QEBAQAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhBy
JxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmN
kZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJ
ytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEB
SExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSE
lKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba
3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAI
...

Es pot aconseguir el fitxer binari amb l'opció -t:

$ ldapsearch -h localhost -D "cn=admin,dc=iesebre,dc=com" -w secret  -x -b dc=iesebre,dc=com -u -t -LLL '(irisPersonalUniqueID=47823472V)' jpegPhoto
dn:: Y249RGVsbGEgVmlkaWVsbGEgTm9lbWksb3U9cGVvcGxlLG91PUN1cmVzIGF1eGlsaWFycyBk4
 oCZaW5mZXJtZXJpYSxvdT1TYW5pdGF0LG91PUFsdW1uZXMsb3U9QWxsLGRjPWllc2VicmUsZGM9Y29t
ufn: Della Vidiella Noemi, people, Cures auxiliars d\E2\80\99infermeria, Sanit
 at, Alumnes, All, iesebre.com
jpegPhoto:< file:///tmp/ldapsearch-jpegPhoto-BLwie0

El fitxer resultat es guarda temporalment a la carpeta temporal del sistema, en aquesta cas el podeu trobar a:

/tmp/ldapsearch-jpegPhoto-BLwie0

Podeu trobar exemples de com fer cerques complexes a:


Recursos:

ldapdsearch i base64

Consulteu base64.

Filtres. Exemples i operadors

Search filter Description
(objectClass=*) Tots els objectes
(&(objectCategory=person)(objectClass=user)(!cn=andy)) Tots els objectes user de categoria persona però que no siguin andy
(sn=sm*) Tots els objectes amb un cognom que comenci per sm
(sn=Smith)(sn=Johnson)))" Tots els contactes amb un cognom igual a Smith o Johnson

El format és:

<filter>=(<attribute><operator><value>)

or

(<operator><filter1><filter2>)

Els operadors són:

Logical operator	Description
=	                Equal to
~=	                Approximately equal to
<=	                Lexicographically less than or equal to
>=	                Lexicographically greater than or equal to
&	                AND
|	                OR
!	                NOT
Utilitzar ldapsearch amb una paraula de pas guardada a un fitxer

Exemple:

/usr/bin/ldapsearch -H ldap://localhost -x -L -b dc=santabarbara,dc=com -D cn=admin,dc=santabarbara,dc=com -y /etc/backup.d/.password.ldap


TODO

ldapadd

NOTA: ldapadd és un hardlink a ldapmodify (és equivalent a ldapmodify -a)

La manera més "còmoda" per afegir registres és utilitzar el format ldif. Per això cal tenir un fitxer com:

# Entry 1: uid=abenitez,ou=People,dc=skole,dc=skolelinux,dc=no

dn:uid=abenitez,ou=People,dc=skole,dc=skolelinux,dc=no
cn:: QW5hbGlhIEVsaXNhYmV0aCBCZW7Dg8KtdGV6IFJvbWVybw==
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: top
objectClass: phpgwContactEtic
objectClass: posixAccount
objectClass: shadowAccount
 
phpgwContactTypeId: n
phpgwContactOwner: 14
phpgwContactAccess: public
phpgwContactCatId: 18
 
uid: abenitez
uidNumber: 10053 

gidNumber: 10053
homeDirectory: /skole/tjener/home0/abenitez
mailMessageStore: /var/lib/maildirs/abenitez
userPassword: {crypt}
loginShell: /bin/bash

Suposem que el fitxer s'anomena exemple.ldif.Si volem afegir aquesta entrada a ldap executem:

$ ldapadd -f exemple.ldif

Si no indiquem fitxer aleshores és llegeix de l'entrada estàndard. Podem utilitzar heredoc

$ ldapadd <<EOF
...
contingut LDIF
...
EOF

Això és si ja ens hem autenticat. Si no:

$ ldapadd -x -D 'cn=admin,dc=elmeudomini,dc=com' -w password -f exemple.ldif

Podeu trobar un exemple de fitxer ldiff a http://xarxantoni.net:8080/mediawiki/images/2/22/Assistents_complet.ldif.txt.

Cal tenir en compte que s'ha de complir els esquemes, no es poden insertar dos nodes amb el mateix identificador, etc. i per tant poden haver-hi errors.

Recursos:

Resol·lució de problemes

ldapadd no fa res i no dona cap error

En el nostres cas el problema era que al ldif no havíem posat el dn dels objectes!! (estàvem posant cn).

ldapmodify

Consulteu també ldapadd. Oco amb la sintaxi. Un exemple:

$ joe prova.ldif

dn: dc=todo,dc=openfpnet,dc=guifi,dc=net
changetype: modify
add: objectClass
objectClass: gosaAcl
objectClass: gosaDepartment
-
add: description
description: todo
-
add: gosaAclEntry
gosaAclEntry: 0:psub:Y249U3lzdGVtIEFkbWluaXN0cmF0b3ItYWRtaW4sb3U9cGVvcGxlLGRjPXRvZG8sZGM9b3BlbmZwbmV0LGRjPWd1aWZpLGRjPW5ldAo=:all/all;cmdrw
-
add: ou
ou: todo

Per executar la modificació:

$ ldapmodify -x -D 'cn=admin,dc=todo,dc=openfpnet,dc=guifi,dc=net' -w EpU7VLPREJ9WyA -f prova.ldif

Un altre exemple, en aquest cas de modificació d'una paraula de pas:

/usr/bin/ldapmodify -x -D "${ROOTDN}" -w ${ROOTDN_PASSWORD} <<EOT2
dn: cn=System Administrator-admin,ou=people,${INSTITUTION_BASE_DN}
changetype: modify
replace: userPassword
userPassword:: ${ENCRIPTED_ROOTDN_PASSWORD2}
EOT2

Com "pujar" fotos a Ldap

Amb l'opció -b:

-b

Handle binary files: the ldapmodify tool will scan every attribute value in the input to determine whether it is a valid file reference, and if so, it will use the contents 
of the file as the attribute’s value. This option is used to input binary data for an attribute, such as a JPEG image. For example, the corresponding LDIF input would be:

    * jpegPhoto: /tmp/photo.jpg (on a UNIX platform)
    * jpegPhoto: c:\tmp\photo.jpg (on Windows)

The ldapmodify tool also supports the LDIF : < URL notation for directly including file contents. For example:

    * jpegPhoto: < file:///tmp/photo.jpg (on all platforms)

If all of your input entries use this notation, you do not need to specify the -b option. This option also allows you to process entries from the output files of the  
ldapsearch tool when it uses the -t option.

Per exemple amb el següent fitxer ldif (/tmp/modifyPhotos):

dn: cn=Modify Me, o=University of Michigan, c=US 
changetype: modify 
- 
add: jpegPhoto 
jpegPhoto: /tmp/modme.jpeg 
- 

L'ordre:

$ ldapmodify -b -r -f /tmp/modif_entrada

Modificarà la foto de l'entrada del arbre ldap amb dn: cn=Modify Me, o=University of Michigan, c=US


ldapdelete

Podem esborrar nodes ldap amb la següent comanda:

$ ldapdelete -x -D 'cn=admin,dc=elmeudomini,dc=com' -w contrasenya 'cn=usuari1,ou=People,dc=elmeudomini,dc=com'

NOTA: Per poder esborrar un objecte abans cal esborrar tot els objectes fills si no apareixerà l'error:

ldap_delete: Operation not allowed on non-leaf (66)
	additional info: subordinate objects must be deleted first

Recursos:

es pot utilitzar l'opció -r (recursive) per a esborrar l'objecte i tots els subojectes.

ldapwhoami

Similar a la comanda whoami. Permet saber amb quin usuari estem treballant:

$ sudo dpkg -L ldap-utils
/usr/bin/ldapdelete
...
/usr/bin/ldapwhoami

També ens permet comprovar l'accés al sistema o el que és el mateix, comprovar els usuaris i paraules de pas:

Error

$ ldapwhoami -x -D "cn=admin,dc=aulalinux,dc=ice,dc=upc,dc=edu" -W
Enter LDAP Password:
ldap_bind: Invalid credentials (49)

Correcte

$ ldapwhoami -x -D "cn=admin,dc=aulalinux,dc=ice,dc=upc,dc=edu" -W
Enter LDAP Password:
dn:cn=admin,dc=dyndns,dc=org
Result: Success (0)

ldappasswd

Ordre que us permet canviar la paraula de pas:

$ ldappasswd -S -x -D "cn=admin,dc=dyndns,dc=org" -W "cn=admin,dc=dyndns,dc=org"

On:

  • Per poder canviar la paraula de pas d'un usuari abans us heu de connectar (operació bind) com aquell usuari utilitzant:
  • -D: Distinguished name de l'usuari
  • -W: Pregunta per la paraula de pas (l'altre opció menys segura és -w paraula_de_pas)
  • -S: Indica que us ha de preguntar per la nova paraula de pas. L'altre opció és especificar-la per línia d'ordres amb l'opció -s password_nou

Exemples

Comprovar la connexió a ldap des de la mateixa màquina

$ ldapwhoami -H ldap://localhost -D "cn=admin,dc=dominiescollit,dc=com" -X

Comprovar la connexió a un servidor ldap remot

$ ldapwhoami -H ldap://ipremota -D "cn=admin,dc=dominiescollit,dc=com" -X

Ldap. Seguretat

Desactivar accés anònim

Es pot desactivar l'accés anònim amb l'opció:

disallow bind_anon

Que s'ha de posar al fitxer slapd.conf.

Afegir camps a la llista de camps que no es poden ensenyar amb una connexió anònima

Per exemple, si emmagatzemem usuaris Samba ens interessara no mostrar els hash de Windows:

Cal canviar el access a:

to attrs=userPassword,shadowLastChange,sambaNTPassword,sambaLMPassword by dn="cn=admin,dc=iesebre,dc=com" write by 
dn="cn=adminGoSA,dc=iesebre,dc=com" write by anonymous auth by self write by * none

Amb la nova convfiguració és oldAccess:

{0}to attrs=userPassword,shadowLastChange,carLicense,email,facsimileTelephoneNumber,sambaNTPassword,sambaLMPassword by dn="cn=admin,dc=iesebre,dc=com" write by 
dn="cn=adminGoSA,dc=iesebre,dc=com" write by anonymous auth by self write by * none

L'he modificat a olcDatabase{1}hdb,cn=config

SSL a LDAP

Hi han dos mètodes per accedir amb una connexió segura al servidor Ldap:

  • Transport Layer Security (TLS) / Secure Socket Layer (SSL): TLS és el nom estàndard per a SSL. Aquest noms s'utilitzen indistintament.
  • Ldap over SSL o Ldap Secured (LDAPS): És el sistema antic de connexió segura per Ldap. A la versió 2 de Ldap només havia aquest sistema. Actualment es considera obsolet. En aquest cas l'accés a Ldap és fa per un port diferent i s'utilitza l'esquema ldaps://.

El mètode TLS s'inicia amb una crida a TODO. No és necessita un port diferents per iniciar una connexió segura amb aquest mètode.

Per tant:

  • ldap:// + StartTLS s'ha de fer sobre el port normal de ldap (389) i no s'ha de fer sobre el port de l'esquema ldaps:// (636)
  • ldaps:// és l'accés a LDAPS i és fa la crida a un port especial (636).
$ cat /etc/services | grep ldap
ldap            389/tcp                 # Lightweight Directory Access Protocol
ldap            389/udp
ldaps           636/tcp                         # LDAP over SSL
ldaps           636/udp


Creació del certificat
$ sudo apt-get install openssl
$ sudo mkdir -p /etc/ldap/ssl
$ cd /etc/ldap/ssl
$ sudo openssl req -new -x509 -nodes -out server.pem -keyout server.pem -days 365

Si us fixeu estem generant un certificat (fitxer server.pem) autosignat (ell mateix és la clau amb la que signem).

Configuració amb el nou sistema de configuració (OpenLdap 2.3>) I

There are various tutorials around the net telling how to make self-signed certificates using openssl. Googling reveals quite a few problems with using self-signed certificates created with openssl with debian’s and ubuntu’s slapd that uses gnutls. For this example I’ll use the certtool that comes with the gnutls-bin.

The goal here is to create CA (ca.edu.example.org) and sign the server key with the CA. The client can then use the CA certificate to check the validity of the server key (ldap.edu.example.org) that is used by the slapd daemon.

Instal·lació de gnutls-bin:

$ sudo apt-get install gnutls-bin

Creem una carpeta per tal de guardar els certificats temporalment:

$ cd
$ mkdir certificatstmp
$ cd certificatstmp

Utilitzem l'eina certool per crear una clau i l'autosignem:

$ certtool --generate-privkey --outfile slapd-ca-key.pem
$ certtool --generate-self-signed --load-privkey slapd-ca-key.pem --outfile slapd-ca-cert.pem

Poseu dades similars a:

Common name: ca.edu.example.org
The certificate will expire in (days): 3650                <--- 10 anys
Does the certificate belong to an authority? (y/N): y
Path length constraint (decimal, -1 for no constraint): -1
Will the certificate be used to sign other certificates? (y/N): y

Un exemple complet:

Generating a self signed certificate...
Please enter the details of the certificate's distinguished name. Just press enter to ignore a field.
Country name (2 chars): ES
Organization name: Institut de l'Ebre
Organizational unit name: Manteniment d'Informàtica
Locality name: Tortosa
State or province name: Tarragona
Common name: ca.iesebre.com
UID: 
This field should not be used in new certificates.
E-mail: 
Enter the certificate's serial number in decimal (default: 1275569434): 
Activation/Expiration time.
3650
Extensions.
Does the certificate belong to an authority? (y/N): y
Path length constraint (decimal, -1 for no constraint): 
Is this a TLS web client certificate? (y/N): 
Is this also a TLS web server certificate? (y/N): 
Enter the e-mail of the subject of the certificate: 
Will the certificate be used to sign other certificates? (y/N): y
Will the certificate be used to sign CRLs? (y/N): 
Will the certificate be used to sign code? (y/N): 
Will the certificate be used to sign OCSP requests? (y/N): 
Will the certificate be used for time stamping? (y/N): 
Enter the URI of the CRL distribution point: 
X.509 Certificate Information:

Ara cal crear la clau del servidor i el certificat:

$ certtool --generate-privkey --outfile slapd-server.key
$ certtool --generate-certificate --load-privkey slapd-server.key --outfile slapd-server.crt --load-ca-certificate slapd-ca-cert.pem \
--load-ca-privkey slapd-ca-key.pem

El common name ha de ser ldap.edu.example.org per al certificat de slapd, o el que és el mateix ha de coincidi el nom de màquina que utilitzeu per fer la connexió amb el que apareix al certificat:

Common name: ldap.edu.example.org
The certificate will expire in (days): 3650
Will the certificate be used for signing (required for TLS)? (y/N): y
Will the certificate be used for encryption (not required for TLS)? (y/N): y

Els fitxers slapd-ca-cert.pem i slapd-server.{crt|key} els copiem a /etc/ssl/certs/:

$ sudo install -D -o openldap -g openldap -m 600 slapd-server.crt /etc/ssl/certs/slapd-server.crt
$ sudo install -D -o openldap -g openldap -m 600 slapd-server.key /etc/ssl/certs/slapd-server.key

Ara cal crear un fitxer ldif amb la configuració per a cn=config:

$ sudo joe configLdapTLS.ssh

El contingut del fitxer ha de ser:

#!/bin/sh

ldapmodify -Y EXTERNAL -H ldapi:/// << EOF
dn: cn=config
add: olcTLSCACertificateFile
olcTLSCACertificateFile: /etc/ssl/certs/slapd-ca-cert.pem
-
add: olcTLSCertificateFile
olcTLSCertificateFile: /etc/ssl/certs/slapd-server.crt
-
add: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/ssl/certs/slapd-server.key 
EOF

Feu-lo executable i executeu-lo:

$ sudo chmod +x configLdapTLS.ssh
$ sudo ./configLdapTLS.ssh

Al client copieu el fitxer ca-cert.pem a /etc/ldap/ssl:

$ sudo install -o root -g root -m 644 slapd-ca-cert.pem /etc/ssl/certs/slapd-ca-cert.pem

I afegiu el següent a /etc/ldap/ldap.conf:

URI ldap://ldap.edu.example.org/
TLS_CACERT /etc/ssl/certs/slapd-ca-cert.pem

Per comprovar que funciona el TLS executeu:

ldapsearch -x -h ldap.edu.example.org -ZZ -b dc=edu,dc=example,dc=org

On -ZZ segons el manual és qui indica que la connexió ha de ser segura:

-Z[Z]  Issue StartTLS (Transport Layer Security) extended operation. If you use -ZZ, the command will require the operation to be successful.

Un exemple de connexió correcta:

$ sudo ldapsearch -x -H ldap://ldap.iesebre.com -ZZ -b dc=iesebre,dc=com
# extended LDIF
#
# LDAPv3
# base <dc=iesebre,dc=com> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#

# iesebre.com
dn: dc=iesebre,dc=com
objectClass: dcObject
objectClass: organization
o: iesebre.com
dc: iesebre
description: Arrel LDAP

En canvi:

$ sudo ldapsearch -x -H ldap://localhost -ZZ -b dc=iesebre,dc=com
ldap_start_tls: Connect error (-11)
	additional info: TLS: hostname does not match CN in peer certificate

Tot i que al fitxer /etc/hosts de la màquina on s'executa l'ordre (client LDAP i servidor al mateix temps):

$ cat /etc/hosts
127.0.0.1	localhost
127.0.1.1	alumnat.iesebre.com	alumnat
127.0.1.1       ldap.iesebre.com     ldap
...

També és pot evitar l'error amb:

TLS_REQCERT never

Al fitxer /etc/ldap/ldap.conf.

Recursos:

Configuració amb el nou sistema de configuració (OpenLdap 2.3>) II

Consulteu la secció TLS ans SSL de:

https://help.ubuntu.com/9.10/serverguide/C/openldap-server.html

Per tal que les comunicacions siguin xifrades hem d'utilitzar TLS i SSL.

Primer creeu o obtingueu els certificats. Consulteu l'apartat anterior.

Abans posàvem al fitxer de configuració:

TLSCACertificateFile /etc/ldap/ssl/server.pem
TLSCertificateFile /etc/ldap/ssl/server.pem
TLSCertificateKeyFile /etc/ldap/ssl/server.pem

Ara cal canviar el DIT de configuració, on els paràmetres es diuen igual afegint olc com a prefix:

$ sudo joe ssl.ldif
dn: cn=config
#add: olcTLSCACertificateFile
#olcTLSCACertificateFile: /etc/ldap/ssl/server.pem 

add: olcTLSCertificateFile
olcTLSCertificateFile: /etc/ldap/ssl/server.pem 

add: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/ldap/ssl/server.pem

IMPORTANT: Si teniu un certificat autosignat no afegiu olcTLSCACertificateFile ja que provoca que GnuTLS falli... Fixeu-vos que està comentat!

Per canviar la configuració executeu:

$ sudo ldapmodify -x -D cn=admin,cn=config -W < ssl.ldif
Enter LDAP Password:
modifying entry "cn=config"

On els path són els que corresponen al vostre cas, segons on hàgiu guardat el certificat.

Ara cal editar el fitxer /etc/default/slapd:

$ sudo joe /etc/default/slapd

I descomentar SLAPD_SERVICES i posar:

SLAPD_SERVICES="ldap:/// ldapi:/// ldaps:///"

Cal assegurar-se que l'usuari que corre el servidor (openldap) té accés al certificat:

Comprovar!!!

$ sudo adduser openldap ssl-cert
$ sudo chgrp ssl-cert /etc/ssl/private/server.key
$ sudo chmod g+r /etc/ssl/private/server.key

Finalment cal tornar a inicar slapd:

$ sudo /etc/init.d/slapd restart

Configuració amb el nou sistema de configuració (OpenLdap 2.3>)

Configurem el servidor Ldap

$ sudo joe /etc/ldap/slapd.conf

afegint les línies:

TLSCACertificateFile /etc/ldap/ssl/server.pem
TLSCertificateFile /etc/ldap/ssl/server.pem
TLSCertificateKeyFile /etc/ldap/ssl/server.pem

Com que es tracta d'un certificat autosignat els paràmetres TLSCACertificateFile,TLSCertificateFile i TLSCertificateKeyFile coincideixen.

Tornem a iniciar el servidor de ldap:

$ sudo /etc/init.d/slapd restart

Cal tenir en compte el paràmetre:

TLSVerifyClient

Que ens permet indicar si volem que els clients s'identifiquin o no amb certificats.

per comprovar que funciona podeu executar:

$ sudo openssl s_client -connect localhost:636 -showcerts

o

$ ldapwhoami -H ldaps://localhost -x -ZZ -W 

També podeu comprovar la connexió amb Apache Directory Studio.

Si teniu errors als connectar comproveu si teniu el paràmetre TLS_REQCERT never al fitxer de configuració del client:

$ sudo joe /etc/ldap/ldap.conf 
...
TLS_REQCERT never


Recursos:

Activar el port 636

Es pot fer utilitzar opcions al executar el servidor Ldap. Editeu el fitxer /etc/default/slapd:

$ sudo joe /etc/default/slapd

I descomenteu la línia:

#SLAPD_SERVICES="ldap://127.0.0.1:389/ ldaps:/// ldapi:///"

i poseu

SLAPD_SERVICES="ldap:/// ldaps:///"

I reinicieu el servidor:

$ sudo /etc/init.d/slapd restart

Pode comprovar que funcionen els dos ports:

$ sudo nmap localhost | grep ldap
389/tcp  open  ldap
636/tcp  open  ldapssl

I provar connexions amb els dos mètodes:

Port 389:

$ ldapwhoami -H ldap://localhost -x -W
Enter LDAP Password: 
dn:cn=admin,dc=dyndns,dc=org
Result: Success (0)

o

Port 636:

$ ldapwhoami -H ldaps://localhost -x -W
Enter LDAP Password: 
dn:cn=admin,dc=dyndns,dc=org
Result: Success (0)

Connexió a Ldap amb connexió encriptada

Per consultar el certificat de ldaps:

$ openssl s_client -connect localhost:636 -showcerts

El port com es pot veure és el 636.

Si en canvi volem consultar el port del Ldap + TLS (versió 3):

$ openssl s_client -connect localhost:389 -showcerts

Per utilitzar segur es pot utilitzar -H (només si el servidor utilitza Ldaps - port 636):

ldapadd -H ldaps://10.0.2.2 -x -D "cn=admin,ou=People,dc=skole,dc=skolelinux,dc=no" -W -f ./wong.ldif

Per a fer la connexió amb ldap + TLS cal utilitzar la opció -ZZ:

$ sudo ldapwhoami -x -ZZ
anonymous
Result: Success (0)

Errors amb SSL

Certificate verify failed

Si obtenim un error com:

$ ldapsearch -x -b "" -s base -LLL -ZZ supportedSASLMechanisms
ldap_start_tls: Connect error (-11)
       additional info: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

Aquest error succeïx per que es fa una comprovació estricta del certificat (el certificat i la URL han de coincidir). Per evitar-ho podem afegir al fitxer ldap.conf:

TLS_REQCERT never

o

TLS_REQCERT allow

Recursos:

SASL

Podem comprovar el suport de SASL del nostre servidor Ldap amb la comanda:

$ ldapsearch -h localhost -p 389 -x -b "" -s base -LLL supportedSASLMechanisms

Resol·lució de problemes

main: TLS init def ctx failed: -1

Integració de Moodle amb ldap

Consulteu l'article sobre Moodle l'apartat http://acacha.dyndns.org/mediawiki/index.php/Moodle#Integraci.C3.B3_amb_ldap_.28skolelinux.29.

Enable Logging

IMPORTANT: Compte al activar el loglevel sobretot les opcions més verbose! Afecta de forma molt important al rendiment del servidor Ldap provocant per exemple problemes d'autenticació si s'utilitza autenticació Ldap. Consulteu slow sudo

Al fitxer /etc/ldap/slapd.conf hi ha un paràmetre loglevel (olcLogLevel amb configuració cn=config) que defineix el nivell de log. es pot obtenir info sobre aquesta paràmetre amb:

$ man slapd.conf

Per defecte, ldap volca els logs al fitxer /var/log/syslog. podem consultar els logs que cprresponen a ldap amb:

$ sudo tail -f /var/log/syslog | grep slapd

O es pot configurar el fitxer /etc/syslog per volcar els logs de ldap a un fitxer específic.

Log level cn=config

IMPORTANT: Compte al activar el loglevel sobretot les opcions més verbose! Afecta de forma molt important al rendiment del servidor Ldap provocant per exemple problemes d'autenticació si s'utilitza autenticació Ldap. Consulteu slow sudo

Podeu consultar quin loglevel tenim amb:

$ ldapsearch -x -H ldap://localhost -b 'cn=config' -D 'cn=admin,cn=config' -s base -LLL -W olcLoglevel  
Enter LDAP Password: 
dn: cn=config
olcLogLevel: none

A l'exemple cap. Fixeu-vos que amb la nova configuració (cn=config) el antic paràmetre loglevel passa a ser olcLogLevel. Els valors que hi podeu posar són els mateixos que podíeu posar a loglevel

fixeu-vos que l'objecte on 'sha de canviar el loglevel és:

cn=config

Segons l'esquema Ldap, l'atribut olcLogLevel és MAY de l'objecte olcGlobal

El log serà el fitxer principal de log de syslog (a no ser que canvieu la configuració per defecte de syslog):

$ sudo tail -f /var/log/syslog

NOTA: Es diferent augmentar el nivell de missatges que sortiran pel fitxer de log syslog que executar el servidor en mode debug. Consulteu: Ldap#Com_depurar.2C_executar_el_servidor_LDAP_a_m.C3.A0_en_mode_debug

loglevel

Els valors possibles són (igual per a olcLogLevel)

-1 	0xFFFF 		enable all logging
0 	0x0000 	- 	logging inhibited - no logging occurs including critical errors. Not recommended.
1 	0x1 	acl 	trace function calls
2 	0x2 	packets 	debug packet handling
4 	0x4 	args 	heavy trace debugging
8 	0x8 	conns 	connection management
16 	0x10 	BER 	print out packets sent and received
32 	0x20 	filter 	search filter processing
64 	0x40 	config 	configuration file processing
128 	0x80 	ACL 	access control list processing
256 	0x100 	stats 	stats log connections/operations/results
512 	0x200 	stats2 	stats log entries sent
1024 	0x400 	shell 	print communication with shell backends
2048 	0x800 	parse 	print entry parsing debugging
4096 	0x1000 	cache 	caching (unused)g
8192 	0x2000 	index 	indexing (unused)
16384 	0x4000 	sync 	print syncrepl (replica) logging
32768 	0x8000 	none 	A misnomer - it will log message that are not categorized including curial messages

Per a canviar aquest valor a cn=config cal anar al fitxer:

/etc/ldap/slapd.d/cn\=config.ldif

I modificar la línia:

olcLogLevel: none

a

olcLogLevel: -1

I reiniciar slapd

$ sudo service slapd restart

Esquemes

Alguns dels esquemes més habituals són:

  • core.schema: Aquest és l'únic que s'instal·la per defecte amb el servidor slapd.
  • cosine.schema: The COSINE and Internet X.500 Schema
  • nis.schema: An Approach for Using LDAP as a Network Information Service

Altres esquemes, consulteu:

$ dpkg -L slapd | grep schema

El propi servidor slapd ja porta alguns esquemes:

IMPORTANT: Que aquests esquemes estiguin al sistema no vol dir que instiguin instal·lats. Amb el nou format de configuració ldif cal afegir els esquemes al backend Ldap cn=config

$ dpkg -L slapd | grep schema
/usr/share/man/man8/slapschema.8.gz
/etc/ldap/schema
/etc/ldap/schema/README
/etc/ldap/schema/core.ldif
/etc/ldap/schema/cosine.ldif
/etc/ldap/schema/inetorgperson.ldif
/etc/ldap/schema/misc.ldif
/etc/ldap/schema/nis.ldif
/etc/ldap/schema/openldap.ldif
/etc/ldap/schema/collective.schema
/etc/ldap/schema/corba.schema
/etc/ldap/schema/core.schema
/etc/ldap/schema/cosine.schema
/etc/ldap/schema/duaconf.schema
/etc/ldap/schema/dyngroup.schema
/etc/ldap/schema/inetorgperson.schema
/etc/ldap/schema/java.schema
/etc/ldap/schema/misc.schema
/etc/ldap/schema/nis.schema
/etc/ldap/schema/openldap.schema
/etc/ldap/schema/pmi.schema
/etc/ldap/schema/ppolicy.schema
$ cat /etc/ldap/schema/README | more
This directory contains user application schema definitions for use
with slapd(8).

File                    Description
----                    -----------
collective.schema       Collective attributes (experimental)
corba.schema            Corba Object
core.schema             OpenLDAP "core"
cosine.schema           COSINE Pilot
duaconf.schema          Client Configuration (work in progress)
dyngroup.schema			Dynamic Group (experimental)
inetorgperson.schema    InetOrgPerson
java.schema             Java Object
misc.schema             Miscellaneous Schema (experimental)
nadf.schema             North American Directory Forum (obsolete)
nis.schema              Network Information Service (experimental)
openldap.schema         OpenLDAP Project (FYI)
ppolicy.schema          Password Policy Schema (work in progress)


Podeu descarregar-vos un tar.gz amb múltiples esquemes en format ldif a:

http://acacha.org/~sergi/gosa/gosa-2.7-ldifs.tar.gz

Vegeu també Gosa schemas.

Atributs Ldap

IMPORTANT: Vegeu també: SNMP#SNMP_OIDS

Al definir un atribut Ldap cal indicar a l'esquema:

  • El nom de l'atribut
  • Descripció
  • El Identificador de Objeto del atributo, o número OID
  • Sintaxi utilitzada per a comprovar el tipus i la coincidència de patrons
  • Si es permet o no més d'un valor de l'atribut per entrada (depèn de la implementació )

Nom d'un atribut

El nombre de tu atributo es directo en concepto, pero hay algunas directrices estilísticas que querras utilizar para crear los tuyos propios.

Para principiantes, antes de crear un atributo nuevo escribe lo que quieres para comprobar si hay un atributo estándar designado para ese proposito.

Enlaces a sites listando atributos bien definidos y clases de objetos (object classes) se pueden encontrar en:

http://www.ldapman.org/schema-references

Asumiendo que un atributo existente no existía ya, necesitarás añadirlo tú mismo. Para empezar, cada atributo necesita un nombre. Tu nombre de atributo debería ser elegido para que se eviten potenciales conflictos con atributos que puedan ser "oficialmente designados" en el futuro. Puedes querer utilizar tu nombre de empresa u organización para comenzar tu nombre de atributo. Por ejemplo, en Gizmo, Inc., registran los ID de pases de parking dados a cada empleado. Cuando define su esquema, el administrador LDAP de Gizmo puede elegir el nombre de atributo "gizmoNumeroDePaseDeParking". Puede ser razonablemente cierto que estos atributos nunca entraran en conflicto con los "oficialmente designados" utilizados en un momento posterior.

Nótese que las mayúsculas en "gizmoNumeroDePaseDeParking". Esto es puramente estético, pero verás los atributos (y las clases de objetos -object classes-) típicamente listados en este formato. La primera palabra está siempre en minúsculas, y la primera inicial de cada palabra siguiente está en mayúsculas. Tu nombre de atributo debería ser bastante largo para ser razonablemente autodescriptivo, y puede ser compuesrta de letras a-z, números 0-9, y el caracter guión (dash). (El carácter inicial debe ser una letra.) Los espacios, subrayados, y carácteres especiales no están permitidos.


Descripció

Breu descripció de l'atribut.

OID

Es pot demanar un OID a:

PEN Private Enterprise Number:  http://pen.iana.org/pen/PenApplication.page

L'adreça de contacte: iana-pen@iana.org. Per l'Institut de l'Ebre he demanat un OID... (Ticket [REQUEST-43981].) T'envien un correu similar a:

Dear Sergi Tur Badenas,

We have received your application for a Private Enterprise Number (PEN).
Your ticket number is [Request-43981].

Please verify your submission by clicking on the link below: 

http://pen.iana.org/pen/app?page=ConfirmRequestDetail&service=external&sp=XXXXXXXXXXX

You can make corrections to the application you are submitting through the link.  This link will be accessible for 60 days from [2011-03-13], the 
date  you submitted the application. If your confirmation link has expired, you must start a new application process. 

Best regards, 

IANA - Internet Assigned Numbers Authority

PEN ASSIGNAT:

PEN Assignment

The Private Enterprise Number 37589 has been assigned to your organization. An email with this number has also been sent to the email address provided.

This ticket [Request-43981] is now considered resolved.

If you have any questions, please send an email message to iana-pen@iana.org 

Thank you. 

Podeu veure el PEN assignat a:

http://www.iana.org/assignments/enterprise-numbers

Amb el número 37589:

37589
 Institut de l'Ebre
   Sergi Tur Badenas
     stur&iesebre.com

Per tant ens correspon el OID:

1.3.6.1.4.1.37589

On segons el document:

http://www.iana.org/assignments/enterprise-numbers

El prèfix:

 1.3.6.1.4.1.37589

o

iso.org.dod.internet.private.enterprise

Correspon a:

SMI Network Management Private Enterprise Codes:
Prefix: iso.org.dod.internet.private.enterprise (1.3.6.1.4.1)
This file is http://www.iana.org/assignments/enterprise-numbers

Los Identificadores de Objeto (Object Identifiers), o OIDs, son los números de referencia numérica utilizados por el mecanismo interno de base de datos del directorio LDAP . Los nombres de atributos están ahí para tí y para mí, pero los ordenadores son más eficientes cuando tratan con números. Si estás familiarizado con DNS, el concepto es bastante similar -- la mayoría de nosotros utilizamos nombres de máquinas como www.sendmail.net, pero los ordenadores traducen el nombre "amigable para el humano" en direcciones IP antes de tragarse el trabajo.

Cuando la gente en Gizmo especifica un nombre de atributo de "gizmoNumeroDePaseDeParking", el ordenador convierte el nombre en el correspondiente número OID para almacenar y recuperar, en este ejemplo el número OID podría ser 1.3.6.1.4.1.1234.

¿ Necesitas registrar por ti mismo número OID antes de que puedas crear atributos personalizados y clases de objetos (object classes) ? La respuesta depende de tu servidor de Directorio. Muchos de los servidores de directorios que disponibles solamente te permiten especificar un nombre alfanumérico para un número oid. Si Gizmo no había registrado un OID, ellos pueden tener asignado al atributo "gizmoNumeroDePaseDeParking" un OID de "gizmoNumeroDePaseDeParking-oid". Todavía es único, y de ese modo aún sirve para cumplir su proposito.

Puede que no necesites registrar tu propio OID, pero no obstante es una buena idea. Los atributos LDAP, las definiciones de sintáxis y las clases de objetos, todos utilizan OIDs. Así lo hacen SNMP y otros protocolos que soportan el esquema de identificación unificado ANSI.

Obtener tu propio OID es bastante fácil. Puedes ir a ANSI (American National Standards Institute) y pagar $1000 por un número, o puedes obtener un gratis de la Autoridad de Internet Asigadora de Números (IANA) en: http://www.iana.org/

Sintaxi

TODO

Cuando configuras cada atributo, parte de la especificación incluye la sintaxis que deseas utilizar. Las sintaxis más comunes se listan aquí:

codigo nombre sintáctico Descripción dn Distinguished Name Permite cualquier cadena alfanumérica. La coincidencia de patrones de campos de tipo DN está normalizada para equivalencia DN. Por ejemplo, "uid=ratboy,ou=accounts,dc=ldapman,dc=com" es equivalente a "uid=Ratboy, ou=Accounts, dc=LDAPman, dc=com" cis Case Ignore String Permite cualquier cadena alfanumérica. La información almacenada utilizando cis es guardada preservando las mayúsculas, pero las coincidencias se ejecutan ignorando las mayúsculas. Este es el uso comunmente más utilizado de escritura de sintáxis a causa de su versatilidad. ces Case Exact String Permite cadenas alfanuméricas. Las coincidencias contra los atributos de formato cis distinguen entre mayúsculas y minúsculas. Utilizado para atributos como contraseñas, dónde sólo desees coincidencia exacta de cadenas. int Integer Solo se permite almacenar enteros en este atributo. tel Telephone Number Como cis, pero cuando buscamos contra atributos de este tipo, la coincidencia ignora los espacios y los guiones. Esto permite que "510-555-1212" coincida con "510 555 1212". bin binary Utilizado para almacenar datos binarios en un formato estandarizado.

Algunos directorios LDAP te permiten añadir sintáxis personalizadas al almacenamiento del directorio. Mientras que los detalles acerca de cómo hacer esto, están más allá del alcance de este articulo, mencionaré de paso cuando habras querido hacer esto. Cuando creas tu propia sintáxis, puedes programar el servidor de directorio para permitir solo ciertos caracteres en este atributo y puedes especificar como casa contra el atributo contra en el que es ejecutado.

Digamos que quieres almacenar códigos hexadecimales en tu directorio, y no quieres preocuparte demasiado del formato con que los códigos son almacenados. (Alguien puede introducir "00 A2 34 FF" mientras que otros pueden introducir "00a234ff", y una tercera persona puede introducir "00a2.34ff". Quieres que las busquedas de cualquiera de estos formatos aparezcan.) Para ajustarse a tus necesidades, querras definir una nueva sintáxis del tipo "hex" (COMPRUEBA ESTO!), permitiendo caracteres 0-9, A-F, espacios, y periodos. Las busquedas podrían ignorar las mayúsculas y normalizadas para eliminar todos los espacios y periodos. Presto! Misión conseguida. Para más información sobre la creación de sintáxis personalizada, por favor comprueba la documentación espacifica de tu servidor de Directorio.


Perdoneme, es usted soltero (single)?

Algunos (pero no todos) los servidores de Directorio permiten especificar que algunos atributos son "únicos". El uso del atributo "único" se hace cuando quieres garantizar que para un registro dado en tu directorio, hay como máximo un valor para ese tipo de atributo. Consideremos una entrada para Mike Jones. Puedes almacenar multiples entradas para su CN (uno para "Mike Jones", otro para "Michael Jones") pero cuando almacenas su servidor primario de correo quieres garantizare que como máximo hay un valor único.

Com crear un esquema propi (extendre esquema Ldap)

OIDs

OID són les inicials de Object IDentifier. L'objectiu és que cada atribut, objecte Ldap tingui un identificador únic. Per tal de complir amb aquesta condició a nivell mundial la IANA s'encarrega d'assignar rangs de OIDs a empresas utilitzats els anomenats PEN o private Enterprise Number, aquest número és un número que t'assignen i que és únic per a cada empresa. Existeix un formulari per a demanar un PEN per a una empresa/institució. Podeu veure els PENs assignats a:

http://www.iana.org/assignments/enterprise-numbers

En aquest apartat veureu una explicació més detallada per a l'esquema que s'ha creat per a l'aplicació gosaInventory objecte gestionat per l'entitat insEbre (Institut de l'Ebre).

Els OIDs estan formats de dos parts la primera 1.3.6.1.4.1.37589 que identifica la empresa.

Amb el número 37589:

37589
Institut de l'Ebre
Sergi Tur Badenas
stur&iesebre.com

Per tant ens correspon el OID:

1.3.6.1.4.1.37589

On segons el document:

http://www.iana.org/assignments/enterprise-numbers

El prefix:

1.3.6.1.4.1.37589

La segona part la decideix la institució, per exemple .2.0.0.1 identifica l'atribut o el objectclass dins de la empresa/institució i és aquesta qui s'ha d'encarregar de no assignar els mateix número a dos objectes o atributs diferents. Aquesta part es de lliure elecció però cal posar-la amb ordre i sentit lògic.

Definir atributs

Cal modificar les diferents parts segons els interesos propis.

atributetype (OID del atribut' NAME ' Nom del atribut '
        DESC ' Descripció del atribut '
        EQUALTY  Opció de cerca, varia segons SYNTAX
        ORDERING Opció de ordenació, varia segons SYNTAX
        SUBSTR   Opció de cerca, varia segons SYNTAX
        SYNTAX   Especifica el tipus de cam amb el OID, per exemple varchar en SQL.
        opcions del atribut SINGLE_VALUE 'Un sol valor')

SYNTAX més usuals:

Nom OID Descripció
boolean 1.3.6.1.4.1.1466.115.121.1.7 Valor booleà
directoryString 1.3.6.1.4.1.1466.115.121.1.15 Unicode (UTF-8) cadena de caràcters
distinguishedName 1.3.6.1.4.1.1466.115.121.1.12 LDAP DN
integer 1.3.6.1.4.1.1466.115.121.1.27 Enter
numericString 1.3.6.1.4.1.1466.115.121.1.36 Cadena numèrica
OID 1.3.6.1.4.1.1466.115.121.1.38 object identifier
octetString 1.3.6.1.4.1.1466.115.121.1.40 arbitrary octets

MATCHING rules mes usuals.

Nom Tipus Descripció
booleanMatch equality Booleà
caseIgnoreMatch equality No diferencia majúscules ni número d'espais
caseIgnoreOrderingMatch ordering No diferencia majúscules ni número d'espais
caseIgnoreSubstringsMatch substrings No diferencia majúscules ni número d'espais
caseExactMatch equality Diferencia majúscules i número d'espais
caseExactOrderingMatch ordering Diferencia majúscules i número d'espais
caseExactSubstringsMatch substrings Diferencia majúscules i número d'espais
distinguishedNameMatch equality distinguished name
integerMatch equality integer
integerOrderingMatch ordering integer
numericStringMatch equality numerical
numericStringOrderingMatch ordering numerical
numericStringSubstringsMatch substrings numerical
octetStringMatch equality octet string
octetStringOrderingMatch ordering octet string
octetStringSubstringsMatch ordering octet st ring
objectIdentiferMatch equality object identifier

Ennllaços externs:

http://rfc-ref.org/RFC-TEXTS/2798/chapter9.html
http://www.openldap.org/doc/admin24/schema.html

Definir objectclasses

Vegem una plantilla de com definir una nova classe d'objecte:

ObjectClassDescription = "(" whsp
               OID OID del objectclass      ;
               [ "NAME" NOM ]
               [ "DESC" Descripcio ]
               [ "OBSOLETE" whsp ] Indica si esta obsolet per defecte no.
               [ "SUP" OIDs objectyclass superiors ]
               [ ( "ABSTRACT" / "STRUCTURAL" / "AUXILIARY" ) whsp ] Per defecte structural indica el tipus de relacio amb el object class superior
               [ "MUST" Atributs obligatoris a omplir ]
               [ "MAY" Atributs opcionals a omplir ]
               whsp ")"

Com passar un .schema a .ldif

NOTA: En aquest apartat veure un exemple complet pas a pas de conversió de fitxer d'esquema del format antic al nou format en LDIF, per veure una explicació més general d'aquest procediment consulteu Convertir esquemes a LDIF per tal de treballar amb el nou format configuració

Anem a veure un exemple de com passar un schema Ldap en format antic (fitxer regular) al nou format (format LDIF). L'esquema que veurem és l'esquema crear per a l'aplicació gosaInventory:

Aquesta es la última versió i la podeu trobar a:

http://www.iesebre.com/subversion/projectes/gosa-inventory/trunk/etc/ldap/schema/iesebreinventory.schema
# Attributes
attributetype ( 1.3.6.1.4.1.37589.2.0.0.1 NAME 'iesebreObjectCode'
	DESC 'Identificador unic'
	EQUALITY integerMatch
	ORDERING integerOrderingMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.27
	SINGLE-VALUE)

attributetype ( 1.3.6.1.4.1.37589.2.0.0.19 NAME 'iesebreDate'
	DESC 'Identificador Familia'
	EQUALITY caseIgnoreMatch
	ORDERING caseIgnoreOrderingMatch
	SUBSTR caseIgnoreSubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
	SINGLE-VALUE)

attributetype ( 1.3.6.1.4.1.37589.2.0.0.2 NAME 'iesebreDepartamentCode'
	DESC 'Identificador Familia'
	EQUALITY caseIgnoreMatch
	ORDERING caseIgnoreOrderingMatch
	SUBSTR caseIgnoreSubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
	SINGLE-VALUE)

attributetype ( 1.3.6.1.4.1.37589.2.0.0.3 NAME 'iesebreMaterialCode'
	DESC 'Identificador unic'
	EQUALITY caseIgnoreMatch
	ORDERING caseIgnoreOrderingMatch
	SUBSTR caseIgnoreSubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
	SINGLE-VALUE)

attributetype ( 1.3.6.1.4.1.37589.2.0.0.4 NAME 'iesebreMaterialTypeCode'
	DESC 'Identificador material'
	EQUALITY caseIgnoreMatch
	ORDERING caseIgnoreOrderingMatch
	SUBSTR caseIgnoreSubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
	SINGLE-VALUE)

attributetype ( 1.3.6.1.4.1.37589.2.0.0.5 NAME 'iesebreFinalCode'
	DESC 'Identificador final'
	EQUALITY caseIgnoreMatch
	ORDERING caseIgnoreOrderingMatch
	SUBSTR caseIgnoreSubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
	SINGLE-VALUE)

attributetype ( 1.3.6.1.4.1.37589.2.0.0.8 NAME 'iesebreVendorCode'
	DESC 'Identificador final'
	EQUALITY caseIgnoreMatch
	ORDERING caseIgnoreOrderingMatch
	SUBSTR caseIgnoreSubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
	SINGLE-VALUE)

attributetype ( 1.3.6.1.4.1.37589.2.0.0.9 NAME 'iesebreLocation1Code'
	DESC 'Identificador final'
	EQUALITY caseIgnoreMatch
	ORDERING caseIgnoreOrderingMatch
	SUBSTR caseIgnoreSubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
	SINGLE-VALUE)

attributetype ( 1.3.6.1.4.1.37589.2.0.0.10 NAME 'iesebreLocation2Code'
	DESC 'Identificador final'
	EQUALITY caseIgnoreMatch
	ORDERING caseIgnoreOrderingMatch
	SUBSTR caseIgnoreSubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
	SINGLE-VALUE)

attributetype ( 1.3.6.1.4.1.37589.2.0.0.11 NAME 'iesebreOriginCode'
	DESC 'Identificador final'
	EQUALITY caseIgnoreMatch
	ORDERING caseIgnoreOrderingMatch
	SUBSTR caseIgnoreSubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
	SINGLE-VALUE)

attributetype ( 1.3.6.1.4.1.37589.2.0.0.12 NAME 'iesebreDepartmentName'
	DESC 'Identificador Familia'
	EQUALITY caseIgnoreMatch
	ORDERING caseIgnoreOrderingMatch
	SUBSTR caseIgnoreSubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
	SINGLE-VALUE)

attributetype ( 1.3.6.1.4.1.37589.2.0.0.13 NAME 'iesebreMaterialName'
	DESC 'Identificador unic'
	EQUALITY caseIgnoreMatch
	ORDERING caseIgnoreOrderingMatch
	SUBSTR caseIgnoreSubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
	SINGLE-VALUE)

attributetype ( 1.3.6.1.4.1.37589.2.0.0.14 NAME 'iesebreTypeMaterialName'
	DESC 'Identificador material'
	EQUALITY caseIgnoreMatch
	ORDERING caseIgnoreOrderingMatch
	SUBSTR caseIgnoreSubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
	SINGLE-VALUE)

attributetype ( 1.3.6.1.4.1.37589.2.0.0.15 NAME 'iesebreObjectName'
	DESC 'Identificador final'
	EQUALITY caseIgnoreMatch
	ORDERING caseIgnoreOrderingMatch
	SUBSTR caseIgnoreSubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
	SINGLE-VALUE)

attributetype ( 1.3.6.1.4.1.37589.2.0.0.6 NAME 'iesebreVendorName'
	DESC 'Identificador final'
	EQUALITY caseIgnoreMatch
	ORDERING caseIgnoreOrderingMatch
	SUBSTR caseIgnoreSubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
	SINGLE-VALUE)

attributetype ( 1.3.6.1.4.1.37589.2.0.0.16 NAME 'iesebreLocation1Name'
	DESC 'Identificador final'
	EQUALITY caseIgnoreMatch
	ORDERING caseIgnoreOrderingMatch
	SUBSTR caseIgnoreSubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
	SINGLE-VALUE)

attributetype ( 1.3.6.1.4.1.37589.2.0.0.17 NAME 'iesebreLocation2Name'
	DESC 'Identificador final'
	EQUALITY caseIgnoreMatch
	ORDERING caseIgnoreOrderingMatch
	SUBSTR caseIgnoreSubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
	SINGLE-VALUE)

attributetype ( 1.3.6.1.4.1.37589.2.0.0.18 NAME 'iesebreOriginName'
	DESC 'Identificador final'
	EQUALITY caseIgnoreMatch
	ORDERING caseIgnoreOrderingMatch
	SUBSTR caseIgnoreSubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
	SINGLE-VALUE)

attributetype ( 1.3.6.1.4.1.37589.2.0.0.7 NAME 'iesebreProviderID'
	DESC 'Identificador final'
	EQUALITY caseIgnoreMatch
	ORDERING caseIgnoreOrderingMatch
	SUBSTR caseIgnoreSubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
	SINGLE-VALUE)

attributetype ( 1.3.6.1.4.1.37589.2.0.0.20 NAME 'iesebreComputerBusiness'
	DESC 'Identificador final'
	EQUALITY caseIgnoreMatch
	ORDERING caseIgnoreOrderingMatch
	SUBSTR caseIgnoreSubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
	SINGLE-VALUE)

attributetype ( 1.3.6.1.4.1.37589.2.0.0.21 NAME 'iesebreDescription'
	DESC 'Identificador final'
	EQUALITY caseIgnoreMatch
	ORDERING caseIgnoreOrderingMatch
	SUBSTR caseIgnoreSubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
	SINGLE-VALUE)

# objectclasses
objectclass (1.3.6.1.4.1.37589.2.0.1.1 NAME 'iesebreinventory'
       DESC 'iesebreinventory , objectclass (v0.1)' SUP top STRUCTURAL
       MUST ( cn $ iesebreObjectCode $ iesebreDepartamentCode $ iesebreMaterialCode $ iesebreFinalCode $ 
			iesebreMaterialTypeCode )
       MAY ( iesebreProviderID $ iesebreVendorCode $ iesebreLocation2Name $ iesebreLocation1Name $ 
			iesebreOriginName $ iesebreTypeMaterialName $ iesebreMaterialName $ iesebreDepartmentName $
			iesebreOriginCode $ iesebreVendorCode $ iesebreLocation2Code $ iesebreLocation1Code $ iesebreDate $
			iesebreComputerBusiness $ iesebreDescription $ iesebreDate ) )

Primer cal crear un fitxer amb els schemas que és vol convertir, els podem posar a la carpeta habitual on es posen els esquemes Ldap /etc/ldap/schema/:

$ cd /etc/ldap/schema/
$ sudo joe iesebreinventory.schema

I li poseu el text de l'esquema que teniu una mica més amunt. Ara cal crear un fitxer amb el path complet dels esquemes que es volen exportar a ldif:

$ cat schema_convert.conf
include /etc/ldap/schema/iesebreinventory.schema

Crear un fitxer amb aquest contingut i afegir permisos de execució:

$ sudo nano convert_schemas.sh
$ mkdir ldif_result
$ slaptest -f schema_convert.conf -F ldif_result 
$ chmod +x convert_schemas.sh

Executar l'escript:

$ sudo ./convert_schemas.sh

Amb un script similar al següent (variarà segons el nom del schema i número d'esquemes):

$ cat sed_ldif.sh
cat ldif_result/cn=config/cn=schema/cn=*iesebreinventory.ldif | \
egrep -v structuralObjectClass\|entryUUID\|creatorsName  | \
egrep -v createTimestamp\|entryCSN\|modifiersName\|modifyTimestamp | \
sed 's/dn: cn={.}iesebreinventory/dn: cn=iesebreinventory,cn=schema,cn=config/g' | \
sed 's/{.}iesebreinventory/iesebreinventory/' > samba.ldif
TODO: Que fa?

L'executem:

$ sudo bash sed_ldif.sh

Cal editar el fitxer resultant i deixa nomes dn: cn=iesebreinventory. Per exemple:

# head iesebreinventory.ldif 
dn: cn=goserver

NO és correcte:

$ head iesebreinventory.ldif 
dn: cn=goserver,cn=schema,cn=config

Ara cal instal·lar l'esquema copiant-lo a:

$ cp * /etc/ldap/slapd.d/cn\=config/cn\=schema

Canviar els propietaris a openldap:

$ cd /etc/ldap/slapd.d/cn\=config/cn\=schema
$ sudo chown openldap:openldap *

Després cal aplicar els canvis:

$ sudo /etc/init.d/slapd restart

El fitxer ldif resultant és:

Aquesta el la última versió i la podeu trobar ha http://www.iesebre.com/subversion/projectes/gosa-inventory/etc/ldap/slapd.d/cn=config/cn=schema/iesebreinventory.ldif

dn: cn=iesebreinventory
objectClass: olcSchemaConfig
cn: iesebreinventory
olcAttributeTypes: {0}( 1.3.6.1.4.1.37589.2.0.0.1 NAME 'iesebreObjectCode' DES
 C 'Identificador unic' EQUALITY integerMatch ORDERING integerOrderingMatch SY
 NTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
olcAttributeTypes: {1}( 1.3.6.1.4.1.37589.2.0.0.19 NAME 'iesebreDate' DESC 'Id
 entificador Familia' EQUALITY caseIgnoreMatch ORDERING caseIgnoreOrderingMatc
 h SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGL
 E-VALUE )
olcAttributeTypes: {2}( 1.3.6.1.4.1.37589.2.0.0.2 NAME 'iesebreDepartamentCode
 ' DESC 'Identificador Familia' EQUALITY caseIgnoreMatch ORDERING caseIgnoreOr
 deringMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.
 1.15 SINGLE-VALUE )
olcAttributeTypes: {3}( 1.3.6.1.4.1.37589.2.0.0.3 NAME 'iesebreMaterialCode' D
 ESC 'Identificador unic' EQUALITY caseIgnoreMatch ORDERING caseIgnoreOrdering
 Match SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 S
 INGLE-VALUE )
olcAttributeTypes: {4}( 1.3.6.1.4.1.37589.2.0.0.4 NAME 'iesebreMaterialTypeCod
 e' DESC 'Identificador material' EQUALITY caseIgnoreMatch ORDERING caseIgnore
 OrderingMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.12
 1.1.15 SINGLE-VALUE )
olcAttributeTypes: {5}( 1.3.6.1.4.1.37589.2.0.0.5 NAME 'iesebreFinalCode' DESC
  'Identificador final' EQUALITY caseIgnoreMatch ORDERING caseIgnoreOrderingMa
 tch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SIN
 GLE-VALUE )
olcAttributeTypes: {6}( 1.3.6.1.4.1.37589.2.0.0.8 NAME 'iesebreVendorCode' DES
 C 'Identificador final' EQUALITY caseIgnoreMatch ORDERING caseIgnoreOrderingM
 atch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SI
 NGLE-VALUE )
olcAttributeTypes: {7}( 1.3.6.1.4.1.37589.2.0.0.9 NAME 'iesebreLocation1Code' 
 DESC 'Identificador final' EQUALITY caseIgnoreMatch ORDERING caseIgnoreOrderi
 ngMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
  SINGLE-VALUE )
olcAttributeTypes: {8}( 1.3.6.1.4.1.37589.2.0.0.10 NAME 'iesebreLocation2Code'
  DESC 'Identificador final' EQUALITY caseIgnoreMatch ORDERING caseIgnoreOrder
 ingMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.1
 5 SINGLE-VALUE )
olcAttributeTypes: {9}( 1.3.6.1.4.1.37589.2.0.0.11 NAME 'iesebreOriginCode' DE
 SC 'Identificador final' EQUALITY caseIgnoreMatch ORDERING caseIgnoreOrdering
 Match SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 S
 INGLE-VALUE )
olcAttributeTypes: {10}( 1.3.6.1.4.1.37589.2.0.0.12 NAME 'iesebreDepartmentNam
 e' DESC 'Identificador Familia' EQUALITY caseIgnoreMatch ORDERING caseIgnoreO
 rderingMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121
 .1.15 SINGLE-VALUE )
olcAttributeTypes: {11}( 1.3.6.1.4.1.37589.2.0.0.13 NAME 'iesebreMaterialName'
  DESC 'Identificador unic' EQUALITY caseIgnoreMatch ORDERING caseIgnoreOrderi
 ngMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
  SINGLE-VALUE )
olcAttributeTypes: {12}( 1.3.6.1.4.1.37589.2.0.0.14 NAME 'iesebreTypeMaterialN
 ame' DESC 'Identificador material' EQUALITY caseIgnoreMatch ORDERING caseIgno
 reOrderingMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.
 121.1.15 SINGLE-VALUE )
olcAttributeTypes: {13}( 1.3.6.1.4.1.37589.2.0.0.15 NAME 'iesebreObjectName' D
 ESC 'Identificador final' EQUALITY caseIgnoreMatch ORDERING caseIgnoreOrderin
 gMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 
 SINGLE-VALUE )
olcAttributeTypes: {14}( 1.3.6.1.4.1.37589.2.0.0.6 NAME 'iesebreVendorName' DE
 SC 'Identificador final' EQUALITY caseIgnoreMatch ORDERING caseIgnoreOrdering
 Match SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 S
 INGLE-VALUE )
olcAttributeTypes: {15}( 1.3.6.1.4.1.37589.2.0.0.16 NAME 'iesebreLocation1Name
 ' DESC 'Identificador final' EQUALITY caseIgnoreMatch ORDERING caseIgnoreOrde
 ringMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.
 15 SINGLE-VALUE )
olcAttributeTypes: {16}( 1.3.6.1.4.1.37589.2.0.0.17 NAME 'iesebreLocation2Name
 ' DESC 'Identificador final' EQUALITY caseIgnoreMatch ORDERING caseIgnoreOrde
 ringMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.
 15 SINGLE-VALUE )
olcAttributeTypes: {17}( 1.3.6.1.4.1.37589.2.0.0.18 NAME 'iesebreOriginName' D
 ESC 'Identificador final' EQUALITY caseIgnoreMatch ORDERING caseIgnoreOrderin
 gMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 
 SINGLE-VALUE )
olcAttributeTypes: {18}( 1.3.6.1.4.1.37589.2.0.0.7 NAME 'iesebreProviderID' DE
 SC 'Identificador final' EQUALITY caseIgnoreMatch ORDERING caseIgnoreOrdering
 Match SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 S
 INGLE-VALUE )
olcAttributeTypes: {19}( 1.3.6.1.4.1.37589.2.0.0.20 NAME 'iesebreComputerBusin
 ess' DESC 'Identificador final' EQUALITY caseIgnoreMatch ORDERING caseIgnoreO
 rderingMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121
 .1.15 SINGLE-VALUE )
olcAttributeTypes: {20}( 1.3.6.1.4.1.37589.2.0.0.21 NAME 'iesebreDescription' 
 DESC 'Identificador final' EQUALITY caseIgnoreMatch ORDERING caseIgnoreOrderi
 ngMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
  SINGLE-VALUE )
olcObjectClasses: {0}( 1.3.6.1.4.1.37589.2.0.1.1 NAME 'iesebreinventory' DESC 
 'iesebreinventory , objectclass (v0.1)' SUP top STRUCTURAL MUST ( cn $ iesebr
 eObjectCode $ iesebreDepartamentCode $ iesebreMaterialCode $ iesebreFinalCode
  $ iesebreMaterialTypeCode ) MAY ( iesebreProviderID $ iesebreVendorCode $ ie
 sebreLocation2Name $ iesebreLocation1Name $ iesebreOriginName $ iesebreTypeMa
 terialName $ iesebreMaterialName $ iesebreDepartmentName $ iesebreOriginCode 
 $ iesebreVendorCode $ iesebreLocation2Code $ iesebreLocation1Code $ iesebreDa
 te $ iesebreComputerBusiness $ iesebreDescription $ iesebreDate ) )

Exemple dummyplug (plugin inicial per al gosa)

Creació del schema

Creem el schema amb els atributs i objectClass necessaris.

$ sudo nano /etc/ldap/schema/stuff.schemma
 attributetype ( 1.3.6.1.4.1.37589.3.0.0.1 NAME 'stuffID'
	DESC 'Identificador final'
	EQUALITY caseIgnoreMatch
	ORDERING caseIgnoreOrderingMatch
	SUBSTR caseIgnoreSubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
	SINGLE-VALUE)

attributetype ( 1.3.6.1.4.1.37589.3.0.0.2 NAME 'stuffName'
	DESC 'Identificador final'
	EQUALITY caseIgnoreMatch
	ORDERING caseIgnoreOrderingMatch
	SUBSTR caseIgnoreSubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
	SINGLE-VALUE)

attributetype ( 1.3.6.1.4.1.37589.3.0.0.3 NAME 'stuffDesc'
	DESC 'Identificador final'
	EQUALITY caseIgnoreMatch
	ORDERING caseIgnoreOrderingMatch
	SUBSTR caseIgnoreSubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
	SINGLE-VALUE)
	
# objectclasses
objectclass (1.3.6.1.4.1.37589.3.0.1.1 NAME 'iesebreinventory'
       DESC 'iesebreinventory , objectclass (v0.1)' SUP top STRUCTURAL
       MUST ( stuffID )
       MAY ( stuffName $ iesebreinventory ) )

Convertir stuff.schema a stuff.ldif

  • Creació o modificació dels scripts.
  • Creem el fitxer de configuració schema_convert.conf on estaran els schemes que volem convertir.
$ cat schema_convert.conf
include /etc/ldap/schema/stuff.schema
  • Creem l'script de execució convert_schemas.sh.

$ sudo nano convert_schemas.sh

mkdir ldif_result
slaptest -f schema_convert.conf -F ldif_result 
  • I donem permissos de execució
$ chmod +x convert_schemas.sh
  • Creem el fitxer de canvis ldif sed_ldif.sh
$ sudo nano sed_ldif.sh
cat ldif_result/cn=config/cn=schema/cn=*stuff.ldif | \
egrep -v structuralObjectClass\|entryUUID\|creatorsName  | \
egrep -v createTimestamp\|entryCSN\|modifiersName\|modifyTimestamp | \
#CANVIA tots dn: cn={.}stuff per dn: cn=stuff que es el format nou
sed 's/dn: cn={.}stuff/dn: cn=stuff/g' | \
#CANVIA tots dn: cn={.}stuff per dn: cn=stuff que es el format nou i ho gurada tot a un fitxer stuff.ldif
sed 's/{.}stuff/stuff/' > stuff.ldif

Afegim permisos de execució i executem l'script

$ chmod +x sed_ldif.sh
$ sudo ./stuff.ldif
  • Afegir el stuff.ldif al ldap
$ sudo -s
# cp stuff.ldif /etc/ldap/slapd.d/cn\=config/cn\=schema/
# cd /etc/ldap/slapd.d/cn\=config/cn\=schema/
# chown openldap:openldap *

Canviem el nom del ldif el número depen del número de schemes que i tingui el ldap sera el últim més 1.

# mv stuff.ldif cn\=\{28\}stuff.ldif
# exit
  • Reiniciem el ldap
$ sudo /etc/init.d/slapd restart

Resultat de la conversió

dn: cn=stuff
objectClass: olcSchemaConfig
cn: stuff
olcAttributeTypes: {0}( 1.3.6.1.4.1.37589.3.0.0.1 NAME 'stuffID' DESC 'Stuff I
 D' EQUALITY caseIgnoreMatch ORDERING caseIgnoreOrderingMatch SUBSTR caseIgnor
 eSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )
olcAttributeTypes: {1}( 1.3.6.1.4.1.37589.3.0.0.2 NAME 'stuffName' DESC 'Stuff
  name' EQUALITY caseIgnoreMatch ORDERING caseIgnoreOrderingMatch SUBSTR caseI
 gnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )
olcAttributeTypes: {2}( 1.3.6.1.4.1.37589.3.0.0.3 NAME 'stuffDesc' DESC 'Stuff
  description' EQUALITY caseIgnoreMatch ORDERING caseIgnoreOrderingMatch SUBST
 R caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE
  )
olcObjectClasses: {0}( 1.3.6.1.4.1.37589.3.0.1.1 NAME 'stuff' DESC
 'iesebreinventory , objectclass (v0.1)' SUP top STRUCTURAL MUST stuffID MAY (
  stuffName $ stuffDesc ) )
:*http://www.ldapman.org/articles/sp_atributos.html

Creació del plugin stuff per a gosa

  • Creació de fitxers.

Primer cal crear el directori del plugin.

$ sudo mkdir -p /usr/share/gosa/plugins/admin/stuff/
  • Fitxer main.inc controla la execucio i el temps de vida del plugin.
<?php
/*
 * This code is part of GOsa (http://www.gosa-project.org)
 * Copyright (C) 2003-2008 GONICUS GmbH
 *
 * ID: $$Id: main.inc 14740 2009-11-04 09:41:16Z hickert $$
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

/* Remove locks created by this plugin
 */
//Comprova que s'ha iniciat sessió
if ($remove_lock){
    if(session::is_set('stuffManagement')){
        $macl = session::get('stuffManagement');
        $macl->remove_lock();
    }
}

/* Remove this plugin from session
 */
if ( $cleanup ){
    session::un_set('stuffManagement');
}else{

    /* Create rolemanagement object on demand */
    if (!session::is_set('stuffManagement')){
        $stuffManagement= new stuffManagement ($config, $ui);
        session::set('stuffManagement',$stuffManagement);
    }
    $stuffManagement = session::get('stuffManagement');
    //Executa el plugin
    $display= $stuffManagement->execute();

    /* Reset requested? */
    if (isset($_GET['reset']) && $_GET['reset'] == 1){
        session::un_set ('stuffManagement');
    }

    /* Show and save dialog */
    session::set('stuffManagement',$stuffManagement);
}

// vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler:
?>
  • Fitxer stuff-list.tpl és un plantilla on especifique on es mostra les accions que pot fer l'usuari.
<div id="mainlist">

  <div class="mainlist-header">
   <p>{$HEADLINE} {$SIZELIMIT}</p>
   <div class="mainlist-nav">
    <table summary="{$HEADLINE}">
     <tr>
      <td>{$ROOT}</td>
      <td>{$BACK}</td>
      <td>{$HOME}</td>
      <td>{$RELOAD}</td>
      <td class="left-border">{$ACTIONS}</td>
      <td class="left-border">{$FILTER}</td>
     </tr>
    </table>
   </div>
  </div>

  {$LIST}
</div>

:*Fitxer [http://www.iesebre.com/subversion/projectes/gosaexamples/stuff/usr/share/gosa/plugin/admin/stuff/stuff-list.xml stuff-list.xml], plantilla que divideix com s'ha de mostrar i el que s'ha de mostrar a la part del plugin
<pre class="brush:xml">
<?xml version="1.0" encoding="UTF-8"?>

<list>
  <definition>
    <departmentBrowser>false</departmentBrowser>
    <departmentRootVisible>false</departmentRootVisible>
    <baseMode>false</baseMode>
    <multiSelect>true</multiSelect>
    <template>stuff-list.tpl</template>
    <module>stuff</module>
    <label>List of stuff</label>
    <defaultSortColumn>1</defaultSortColumn>

    <objectType>
      <label>Stuff</label>
      <objectClass>stuff</objectClass>
      <category>stuff</category>
      <class>stuff</class>
      <image>plugins/sudo/images/select_sudo.png</image>
    </objectType>

  </definition>

  <table>
    <!-- Mida de les columnes de les dades que mostrara el plugin. --> 
    <layout>|20px;c|50px|100px||170px;r|</layout>
    <!-- Definicio de les dades de les columnes que mostrara el plugin. --> 
    <column>
      <value>%{filter:objectType(dn,objectClass)}</value>
    </column>

    <column>
      <!-- Nom que és mostra al navegador --> 
      <label>ID</label>
      <!-- Atribut de les dades que ha de mostrar --> 
      <sortAttribute>stuffID</sortAttribute>
      <!-- Tipus de atribut --> 
      <sortType>string</sortType>
      <value>%{filter:link(row,dn,"%s",cn)}</value>
      <export>true</export>
    </column>

    <column>
      <label>Name</label>
      <sortAttribute>stuffName</sortAttribute>
      <sortType>string</sortType>
      <value>%{filter:link(row,dn,"%s",description)}</value>
      <export>true</export>
    </column>

	<column>
      <label>Description</label>
      <sortAttribute>stuffDesc</sortAttribute>
      <sortType>string</sortType>
      <value>%{filter:link(row,dn,"%s",description)}</value>
      <export>true</export>
    </column>
    
    <column>
      <label>Actions</label>
      <value>%{filter:actions(dn,row,objectClass)}</value>
    </column>

  </table>

  <actionmenu>
    <!-- Accions disponibles --> 
    <action>
     <type>sub</type>
     <image>images/lists/element.png[new]</image>
     <label>Create</label>
      <!-- Un action dins de un altre fa un submenú --> 
     <action>
      <name>new_stuff</name>
      <type>entry</type>
      <image>plugins/sudo/images/select_sudo.png</image>
      <label>Default</label>
     </action>

    </action>
    <!-- Barra separadora --> 
    <action>
      <type>separator</type>
    </action>

    <action>
      <name>remove</name>
      <type>entry</type>
      <image>images/lists/trash.png</image>
      <label>Remove</label>
    </action>

    <action>
      <type>exporter</type>
    </action>

    <action>
      <type>separator</type>
    </action>
    <!-- Només es mostren si estan activats a /etc/gosa/gosa.conf --> 
    <action>
      <type>copypaste</type>
    </action>

    <action>
      <type>snapshot</type>
    </action>

  </actionmenu>

  <actiontriggers snapshot="true" copypaste="true">
   
    <action>
      <name>cp</name>
      <type>copypaste</type>
    </action>

    <action>
      <name>edit</name>
      <type>entry</type>
      <image>images/lists/edit.png</image>
      <label>Edit stuff</label>
    </action>

    <action>
      <name>snapshot</name>
      <type>snapshot</type>
    </action>

    <action>
      <name>remove</name>
      <type>entry</type>
      <image>images/lists/trash.png</image>
      <acl>stuff/stuff[d]</acl>
      <label>Remove stuff</label>
    </action>

  </actiontriggers>

</list>
<div class="clear"></div>

<input type="hidden" name="ignore">
<?xml version="1.0" encoding="UTF-8"?>

<filterdef>

  <definition>
    <category>stuff</category>
    <initial>true</initial>
    <default>default</default>
    <scope>one</scope>
    <attribute>dn</attribute>
    <attribute>objectClass</attribute>
    <!-- Valors a mostrar -->
    <attribute>ID</attribute>
    <attribute>Name</attribute>
    <attribute>Description</attribute>
  </definition>

  <search>
    <tag>default</tag>
    <!-- Nom del filtre --> 
    <label>Default filter</label>
    <query>
      <backend>LDAP</backend>
    <!-- Consulta ldapsearch que executara -->
      <filter>(&(objectClass=stuff)(stuffID=$))</filter>
    </query>
    <autocomplete>
    <!-- Atribut a autocompletar -->
      <attribute>stuffID</attribute>
    <!-- Temps que espera per autocompletar quan deixes de escriure -->
      <frequency>0.5</frequency>
    <!-- Número de caractes a escriure previs avans de autocompletar -->
      <characters>3</characters>
    </autocomplete>
  </search>

  <search>
    <tag>byName</tag>
    <label>By Name</label>
    <query>
      <backend>LDAP</backend>
      <filter>(&(objectClass=stuffID)(|(stuffName=$)))</filter>
    </query>
    <autocomplete>
      <attribute>stuffName</attribute>
      <frequency>0.5</frequency>
      <characters>3</characters>
    </autocomplete>
  </search>

</filterdef>
<?php
/*
 * This code is part of GOsa (http://www.gosa-project.org)
 * Copyright (C) 2003-2008 GONICUS GmbH
 *
 * ID: $$Id: class_roleManagement.inc 14742 2009-11-04 13:18:33Z hickert $$
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

class stuffManagement extends management
{
    var $plHeadline     = "Stuff rules";
    //Descripcio que surt quan entres al plugin
    var $plDescription  = "Manage stuffs";
    //Fitxer amb la imatge
    var $plIcon  = "plugins/sudo/images/sudo.png";

    // Tab definition 
    //protected $tabClass = "stufftabs";
    //protected $tabType = "STUFFTABS";
    //protected $aclCategory = "stuff";
    //protected $aclPlugin   = "stuff";
    //protected $objectName   = "stuff";

    //Funcio indispensable que construeix el plugin quan entres.
    function __construct($config,$ui)
    {
        //Carrega el fitxer /etc/gosa/gosa.conf
        $this->config = $config;
        //Carrega el codi html i php general
        $this->ui = $ui;

        //$this->storagePoints = array(get_ou("stuff", "stuffID"));

        // Build filter
        //Comprova si hi han filtres.
        if (session::global_is_set(get_class($this)."_filter")){
            $filter= session::global_get(get_class($this)."_filter");
        } else {
            $filter = new filter(get_template_path("stuff-filter.xml", true));
            $filter->setObjectStorage($this->storagePoints);
        }
        $this->setFilter($filter);

        // Build headpage
        $headpage = new listing(get_template_path("stuff-list.xml", true));
        $headpage->setFilter($filter);

        // Add copy&paste and snapshot handler.
        if ($this->config->boolValueIsTrue("core", "copyPaste")){
            $this->cpHandler = new CopyPasteHandler($this->config);
        }
        if($this->config->get_cfg_value("core","enableSnapshots") == "true"){
            $this->snapHandler = new SnapshotHandler($this->config);
        }
       //Comprova si s'ha demanat l'accio de crear un stuff nou
        $this->registerAction("new_default", "newEntry");
        parent::__construct($config, $ui, "stuff", $headpage);
    }
    
    function newEntry($action="",$target=array(),$all=array(), $altTabClass ="", $altTabType = "", $altAclCategory="")
    {
        $str = management::newEntry($action,$target,$all,$altTabClass,$altTabType,$altAclCategory);

        /* This entry will become the default entry */
        if($action == "new_stuff"){
            $this->tabObject->set_default(TRUE);
        }
        if(!empty($str)) return($str);
    }
} 
// vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler:
?>
<section name="INS Ebre">
 <plugin acl="stuff" class="stuffManagement" />
</section>
  • O afegir el plugin a una altra secció només afegint dintre de la secció
<plugin acl="stuff" class="stuffManagement" />

Convertir esquemes a LDIF per tal de treballar amb el nou format configuració

Podeu utilitzar slaptest. Un exemple de guió de bash:

Cal crear un fitxer amb tots els schemas que voleu convertir:

$ cat schema_convert.conf

include /etc/ldap/schema/core.schema
include /etc/ldap/schema/collective.schema
include /etc/ldap/schema/corba.schema
include /etc/ldap/schema/cosine.schema
include /etc/ldap/schema/duaconf.schema
include /etc/ldap/schema/dyngroup.schema
include /etc/ldap/schema/inetorgperson.schema
include /etc/ldap/schema/java.schema
include /etc/ldap/schema/misc.schema
include /etc/ldap/schema/nis.schema
include /etc/ldap/schema/openldap.schema
include /etc/ldap/schema/ppolicy.schema

I utilitzar un script similar a:

# cat convert_schemas.sh
mkdir ldif_result
slaptest -f schema_convert.conf -F ldif_result 

Oco amb els DN dels objectes creats! Un script com el següent us els pots canviar tots utilitzant sed:

cat ldif_result/cn=config/cn=schema/cn=*samba.ldif | \
egrep -v structuralObjectClass\|entryUUID\|creatorsName  | \
egrep -v createTimestamp\|entryCSN\|modifiersName\|modifyTimestamp | \
sed 's/dn: cn={.}samba/dn: cn=samba,cn=schema,cn=config/g' | \
sed 's/{.}samba/samba/' > samba.ldif

cat ldif_result/cn=config/cn=schema/cn=*autofs.ldif | \
egrep -v structuralObjectClass\|entryUUID\|creatorsName  | \
egrep -v createTimestamp\|entryCSN\|modifiersName\|modifyTimestamp | \
sed 's/dn: cn={.}autofs/dn: cn=autofs,cn=schema,cn=config/g' | \
sed 's/{.}autofs/autofs/' > autofs.ldif

cat ldif_result/cn=config/cn=schema/cn=*kerberos.ldif | \
egrep -v structuralObjectClass\|entryUUID\|creatorsName  | \
egrep -v createTimestamp\|entryCSN\|modifiersName\|modifyTimestamp | \
sed 's/dn: cn={.}kerberos/dn: cn=kerberos,cn=schema,cn=config/g' | \
sed 's/{.}kerberos/kerberos/' > kerberos.ldif

També sembla ser que hi ha algunes eines per Internet:

Com afegir esquema IrisPerson

Podeu trobar l'esquema passat a ldif a:

http://acacha.org/~sergi/cn=%7b13%7diris.ldif

El podeu descarregar amb:

$ wget http://acacha.org/~sergi/cn=%7b13%7diris.ldif
$ sudo cp cn\=\{3\}iris.ldif  /etc/ldap/slapd.d/cn\=config/cn\=schema/cn\=\{13\}iris.ldif
$ sudo chown openldap:openldap /etc/ldap/slapd.d/cn\=config/cn\=schema/cn\=\{13\}iris.ldif
$ sudo /etc/init.d/slapd restart

Resol·lució de problemes

Problemes amb esquemes de Gosa

Consulteu GoSA

Comptes d'usuari a Ldap

POSIX Account

posixAccount ObjectClasses:


TODO

sambaSamAccount

Samba-3.0 proporciona un esquema ldap per emmagatzemar comptes de Samba. El podeu trobar al fitxer

/usr/share/doc/samba-doc/examples/LDAP/samba.schema

Del paquet de documentació de Samba. Per instal·lar-lo:

$ sudo apt-get install samba-doc

Es possible que l'hageu de descomprimir:

$ sudo gunzip /usr/share/doc/samba-doc/examples/LDAP/samba.schema.gz

El fitxer és el següent:

ObjectClass (1.3.6.1.4.1.7165.2.2.6 NAME 'sambaSamAccount' SUP top AUXILIARY
    DESC 'Samba-3.0 Auxiliary SAM Account'
    MUST ( uid $ sambaSID )
    MAY  ( cn $ sambaLMPassword $ sambaNTPassword $ sambaPwdLastSet $
          sambaLogonTime $ sambaLogoffTime $ sambaKickoffTime $
          sambaPwdCanChange $ sambaPwdMustChange $ sambaAcctFlags $
          displayName $ sambaHomePath $ sambaHomeDrive $ sambaLogonScript $
          sambaProfilePath $ description $ sambaUserWorkstations $
          sambaPrimaryGroupSID $ sambaDomainName ))  

Aquest és un objecte auxiliar i es pot utilitzar amb combinació amb altres esquemes com posixAccount. De fet per tal d'emmagatzemar tant la informació de Unix com de Samba és necessari utilitzar-los de forma combinada.

  • User account: Inclou la informació d'una compte de domini d'usuari Windows NT/Samba. Pode trobar més informació sobre comptes d'usuari Samba a l'article sobre Samba i concretament consulten les comandes pdbedit i [[ net]]
  • Machine account: No es distingeix en res de l'anterior excepte que acaba amb el caràcter $.

ACLs i usuaris

Vegeu també slapacl

Nova configuració "cn=config"

Manual:

$ man slapd.access

Sintaxi curta:

olcAccess: to <what> [ by <who> <accesslevel> <control> ]+

On:

Què? (to)

Indica a que controlem l'accés. Es poden indicar objectes de l'arbre utilitzant DN i scopes. Hi ha 3 formats:

to * --> Qualsevol objecte de l'arbre
to dn[.<basic-style>]=<regex> --> Especificar un filtre o condició
to dn.<scope-style>=<DN> --> Des de qualsevol objecte de l'arbre i especificant un scope.
to filter=<ldap filter>


Hi ha 4 opcions d'scope:

  • base: només coincideix amb l'entrada (DN) especificada.
  • one: coincideix amb les entrades les quals el pare sigui el DN especificat.
  • subtree: coincideix amb totes les entrades que estiguin al subarbre especificat pel DN (incloent el DN)
  • children: coincideix amb totes les entrades sota el DN (no inclou el DN especificat)

Per exemple, amb:

       0: o=suffix
       1: cn=Manager,o=suffix
       2: ou=people,o=suffix
       3: uid=kdz,ou=people,o=suffix
       4: cn=addresses,uid=kdz,ou=people,o=suffix
       5: uid=hyc,ou=people,o=suffix

Aleshores:

     dn.base="ou=people,o=suffix" coincideix amb 2;
     dn.one="ou=people,o=suffix" coincideix amb 3, i 5;
     dn.subtree="ou=people,o=suffix" coincideix amb 2, 3, 4, i 5; i
     dn.children="ou=people,o=suffix" coincideix amb 3, 4, i 5.

Exemples de filtres:

to filter=(objectClass=person)
to dn.one="ou=people,o=suffix" filter=(objectClass=person)  ---> Sistema mixt filtre i dn+scope

Qui? (who):

Taula (Access Entity Identifiers):

* 	                        Tothom, incloent usuaris anònims i autenticats
anonymous 	                Usuaris anònims (no autenticats)
users 	                        Usuaris autenticats
self 	                        L'usuari associat a la entrada objectiu
dn[.<basic-style>]=<regex> 	Usuaris que compleixen una expressió regular
dn.<scope-style>=<DN> 	        Usuaris dins d'un scope indicat a partir d'un DN concret.

Com?

Nivells d'accés:

none 	 =0 	 sense accés
auth 	 =x 	 només pot autenticar (bind) (s'utilitza per exemple per utilitza paraules de pas --> només es pot accedir a elles si es per fer una autenticació)
compare =cx 	 a més pot comparar
search  =scx 	 a més pot aplicar filtres de cerca
read 	 =rscx 	 a més pot llegir els resultats d'una cerca
write 	 =wrscx  a més pot modificar o renombrar una entrada

Ordre d'aplicació:

Slapd s'atura a la primera entrada on el selector <what> coincideixi.

Exemples:

Permisos a tothom per a llegir-ho tot:

olcAccess: to * by * read 

Un altre exemple:

{0}to attrs=userPassword,shadowLastChange,sambaNTPassword,sambaLMPassword by dn="cn=admin,dc=iesebre,dc=com" write by anonymous auth by self write by * none

A l'exemple anterior només té accés complet (escriptura) als atributs paraules de pas (de Linux i SAmba a l'exemple) l'usuari admin, els usuaris anònims només poden utilitzar per autenticar i el propi usuari (self) pot també modificar-se a si mateix. La resta no tenen cap mena d'accés.

NOTA: Al rootdn no se li apliquen les ACL

Exemple més complex:

olcAccess: to *
          by self write
          by anonymous auth
          by * read

Permet a l'usuari modificar la seva pròpia entrada (self), els usuaris anonims es poden "autenticar" a aquestes entrades i permet a tots els altres llegir aquestes entrades.

Sintaxi Completa:

olcAccess: <access directive>
       <access directive> ::= to <what>
               [by <who> <access> <control>]+
       <what> ::= * |
               [dn[.<basic-style>]=<regex> | dn.<scope-style>=<DN>]
               [filter=<ldapfilter>] [attrs=<attrlist>]
       <basic-style> ::= regex | exact
       <scope-style> ::= base | one | subtree | children
       <attrlist> ::= <attr> [val[.<basic-style>]=<regex>] | <attr> , <attrlist>
       <attr> ::= <attrname> | entry | children
       <who> ::= * | [anonymous | users | self
                       | dn[.<basic-style>]=<regex> | dn.<scope-style>=<DN>]
               [dnattr=<attrname>]
               [group[/<objectclass>[/<attrname>][.<basic-style>]]=<regex>]
               [peername[.<basic-style>]=<regex>]
               [sockname[.<basic-style>]=<regex>]
               [domain[.<basic-style>]=<regex>]
               [sockurl[.<basic-style>]=<regex>]
               [set=<setspec>]
               [aci=<attrname>]
       <access> ::= [self]{<level>|<priv>}
       <level> ::= none | auth | compare | search | read | write
       <priv> ::= {=|+|-}{w|r|s|c|x|0}+
       <control> ::= [stop | continue | break]


This directive grants access (specified by <accesslevel>) to a set of entries and/or attributes (specified by <what>) by one or more requesters (specified by <who>). See the Access Control section of this chapter for a summary of basic usage.

Note: If no olcAccess directives are specified, the default access control policy, to * by * read, allows all users (both authenticated and anonymous) read access.

Note: Access controls defined in the frontend are appended to all other databases' controls.


Recursos:

Rendiment

Tuning

http://www.openldap.org/doc/admin24/tuning.html#Caching

Vegeu també els següents apartats:

Indexs

Vegeu també slapindex

Els índexs permeten accelerar les consultes: per exemple si busquem sovint a la base de dades pel camp email, aleshores pot ser una bona idea crear un index per aquest camp. La sintaxi per definir índexs és:

index attrlist | default indices

NOTA: A la nova configuració (cn=config) el atribut és olcDbIndex

On indices:

# indices = [pres [,approx] [,eq] [,sub] [,special]]
  • attrlist: un sol atribut o una llista d'atributs (separats per comes) dels quals es vol fer un index. O s'indica una llista o es posa default
  • default: Si no s'especifica llista es pot posar default per definir valors per defecte. Els valors per defecte s'utilitzen en qualsevol línia de més endavant que no indiqui indices (per tant "indices" pot ser opcional). S'ha de definir abans d'utilitzar-lo. Es pot tornara a declarar i aleshores s'utilitza per a les entrades següents.
  • indices:
  • pres (present): tipus d'índex si es fan cerques del tipus 'objectclass=person' o 'attribute=mail'
  • approx: útil per a cerques de l'estil "sn~=person" (camp similar a)
  • eq (equality): eq should be used if searches of the form 'sn=smith' will be used i.e no wildcards are included (uses the EQUALITY rule only).
  • sub: sub should be used if use searches of the form 'sn=sm*' i.e wildcards are included (uses the SUBSTR rule). This rule may be enhanced by a using subinitial (optimised for 'sn=s*'), subany (optimised for 'sn=*n*') or subfinal (optimised for 'sn=*th'). One or more sub parameters may be included.
  • special: special may be either nolang or nosubtypes which are related to subtypes.

Extret de http://www.openldap.org/doc/admin24/slapdconf2.html, sobre la nova configuració

5.2.6.7. olcDbIndex: {<attrlist> | default} [pres,eq,approx,sub,none]

This directive specifies the indices to maintain for the given attribute. If only an <attrlist> is given, the default indices are maintained. The index keywords correspond  
to the common types of matches that may be used in an LDAP search filter.

Example:

        olcDbIndex: default pres,eq
        olcDbIndex: uid
        olcDbIndex: cn,sn pres,eq,sub
        olcDbIndex: objectClass eq 

The first line sets the default set of indices to maintain to present and equality. The second line causes the default (pres,eq) set of indices to be maintained for the uid 
attribute type. The third line causes present, equality, and substring indices to be maintained for cn and sn attribute types. The fourth line causes an equality index for  
the objectClass attribute type.

There is no index keyword for inequality matches. Generally these matches do not use an index. However, some attributes do support indexing for inequality matches, based on 
the equality index.

A substring index can be more explicitly specified as subinitial, subany, or subfinal, corresponding to the three possible components of a substring match filter. A  
subinitial index only indexes substrings that appear at the beginning of an attribute value. A subfinal index only indexes substrings that appear at the end of an attribute 
value, while subany indexes substrings that occur anywhere in a value.

Note that by default, setting an index for an attribute also affects every subtype of that attribute. E.g., setting an equality index on the name attribute causes cn, sn, 
and every other attribute that inherits from name to be indexed.

By default, no indices are maintained. It is generally advised that minimally an equality index upon objectClass be maintained.

       olcDbindex: objectClass eq

Additional indices should be configured corresponding to the most common searches that are used on the database. Presence indexing should not be configured for an attribute 
unless the attribute occurs very rarely in the database, and presence searches on the attribute occur very frequently during normal use of the directory. Most applications  
don't use presence searches, so usually presence indexing is not very useful.

If this setting is changed while slapd is running, an internal task will be run to generate the changed index data. All server operations can continue as normal while the  
indexer does its work. If slapd is stopped before the index task completes, indexing will have to be manually completed using the slapindex tool.

Missatges al fitxers de log: bdb_equality_candidates

$ sudo cat /var/log/syslog | grep slapd
... 
Jul  8 16:09:08 alumnat slapd[1938]: <= bdb_equality_candidates: (gidNumber) not indexed

Proposa crear un index. Si el creeu aleshores ja no us sortirà el missatge.

Soft links (alias)

Cal utilitzar el objectclass alias amb l'atribut aliasedObjectName. Un exemple:

dn: cn=user,ou=institute2,ou=employees
objectclass: alias
aliasedObjectName: cn=Boer F.J. de,ou=institute1,ou=employees,o=NHL,c=nl

NOTA: L'objecte alias és proporcionat a l'esquema core.schema

Cal que els client (fitxer /etc/ldap/ldap.conf) tingui el valor DEREF searching.

O el que pot ser equivalent utilitzeu el paràmetre

-a 

Les opcions són:

-a {never|always|search|find}
  Specify  how  aliases  dereferencing is done.  Should be one of never, always, search, or find to 
  specify that aliases are never dereferenced, always dereferenced, dereferenced when searching, or 
  dereferenced only when locating the base object for the search.  The default is to never 
  dereference aliases.

A ldapsearch:

Per exemple, per defecte no es desreferencia i per tant trobareu el dn del alias però no podreu consultar camps de l'original

$ ldapsearch -h 192.168.0.8 -x -b "ou=people,ou=Grup A,ou=Curs 1,ou=Informàtica   
ASIX,ou=Informàtica,ou=Alumnes,ou=All,dc=iesebre,dc=com" '(objectclass=*)' homeDirectory | grep -A 
10 Almela
...


Si poseu -a always:

$ ldapsearch -h 192.168.0.8 -a always -x -b "ou=people,ou=Grup A,ou=Curs 1,ou=Informàtica    
ASIX,ou=Informàtica,ou=Alumnes,ou=All,dc=iesebre,dc=com" '(objectclass=*)' homeDirectory | grep -A 
10 Almela
# Almela Sanchez Ester, people, Grup A, Curs 2, Inform\C3\A0tica   ASI, Infor
 m\C3\A0tica, Alumnes, All, iesebre.com
dn:: Y249QWxtZWxhIFNhbmNoZXogRXN0ZXIsb3U9cGVvcGxlLG91PUdydXAgQSxvdT1DdXJzIDIsb
 3U9SW5mb3Jtw6B0aWNhICAgQVNJLG91PUluZm9ybcOgdGljYSxvdT1BbHVtbmVzLG91PUFsbCxkYz
 1pZXNlYnJlLGRjPWNvbQ==
homeDirectory: /home/esteralmela

Consulteu també:

$ man ldap.conf

Referrals

If the server a.example.net holds dc=example,dc=net and wished to delegate the subtree ou=subtree,dc=example,dc=net to another server b.example.net, the following named referral object would be added to a.example.net:

       dn: dc=subtree,dc=example,dc=net
       objectClass: referral
       objectClass: extensibleObject
       dc: subtree
       ref: ldap://b.example.net/dc=subtree,dc=example,dc=net


RFCs

  • [RFC2037] directories TODO.
  • RFC2254 Especifica com han de ser els filtres Ldap. The String Representation of LDAP Search Filters

Configuració de Ldap per suportar Samba

Cal instal·lar el paquet samba-doc

$ sudo apt-get install samba-doc

Descomprimir l'esquema:

$ sudo gunzip /usr/share/doc/samba-doc/examples/LDAP/samba.schema.gz

I després copiar l'esquema Ldap de Samba

$ sudo cp /usr/share/doc/samba-doc/examples/LDAP/samba.schema /etc/ldap/schema/

Després cal afegir el nou esquema al fitxer /etc/ldap/slapd.conf i afegir les línies:

$ sudo joe /etc/ldap/slapd.conf
## needed for sambaSamAccount
include            /etc/ldap/schema/cosine.schema
include            /etc/ldap/schema/inetorgperson.schema
include            /etc/ldap/schema/nis.schema
include            /etc/ldap/schema/samba.schema

Segurament només us caldrà afegir la última línia però tota la resta són necessàries per tal que l'esquema de Samba funcioni correctament.

A part de l'esquema de Samba cal assegurar-se de tenir els esquemes cosine.schema, inetorgperson.schema i nis.schema.

També es recomanat crear uns index per fer més ràpides les cerques de comptes Samba. Això es fa afegint:

# Indices to maintain
## required by OpenLDAP
index objectclass             eq

index cn                      pres,sub,eq
index sn                      pres,sub,eq
## required to support pdb_getsampwnam
index uid                     pres,sub,eq
## required to support pdb_getsambapwrid()
index displayName             pres,sub,eq 

## uncomment these if you are storing posixAccount and
## posixGroup entries in the directory as well
##index uidNumber               eq
##index gidNumber               eq
##index memberUid               eq

index   sambaSID              eq
index   sambaPrimaryGroupSID  eq
index   sambaDomainName       eq
index   default               sub 

Segurament la línia :

index           objectClass eq

No us caldrà afegir-la (ja ve per defecte).

I creem els nous index executant:

$ sudo /etc/init.d/slapd stop
$ sudo slapindex -f /etc/ldap/slapd.conf
$ sudo /etc/init.d/slapd start

Us pot donar l'error:

WARNING!
Runnig as root!
There's a fair chance slapd will fail to start.
Check file permissions!

Si consulteu la base de dades de Ldap veureu:

$ sudo ls -la /var/lib/ldap
-rw-------  1 root     root        8192 2008-04-05 21:04 gidNumber.bdb

Que pertanyen a root. Openldap s'executa amb usuari anomenat openldap (aquesta és la configuració per defecte però es pot modificar a /etc/default/slapd).

Torneu a establir els permisos adequats als fitxers d'aquesta carpeta:

$ sudo chown openldap:openldap -R /var/lib/ldap

Si executeu slapindex amb el paràmetre -v veureu que els índexs es creen correctament.


Ara cal crear els contenidors (nodes del arbre) a on volem guardar les comptes. Un exemple de com fer-ho el trobeu al següent fitxer LDIF:

NOTA: En negreta teniu els valors que s'han de modificar d'aquest fitxer per adaptar-lo al vostre basedn (arrel del servidor Ldap). Suposem que 
el basedn ja esta creat (a l'exemple: dc=aulalinux,dc=ice,dc=upc,dc=edu)
# Organization for Samba Base

# Setting up container for Users OU
dn: ou=People,dc=aulalinux,dc=ice,dc=upc,dc=edu
objectclass: top
objectclass: organizationalUnit
ou: People 

# Setting up container for groups
dn: ou=Groups,dc=aulalinux,dc=ice,dc=upc,dc=edu
objectclass: top
objectclass: organizationalUnit
ou: Groups 

# Setting up container for computers
dn: ou=Computers,dc=aulalinux,dc=ice,dc=upc,dc=edu
objectclass: top
objectclass: organizationalUnit
ou: Computers

Per executar aquest ldiff podem parar el servidor ldap i utilitzar slapadd:

$ sudo /etc/init.d/slapd stop
$ slapadd -v -l initldap.dif
$ sudo /etc/init.d/slapd start

O podem utilitzar la comanda ldapadd:

$ sudo ldapadd -f initldap.dif

Abans de poder accedir al servidor Ldap des de Samba cal executar:

$ sudo smbpasswd -w parauladepas

Un cop fet això cal tornar a iniciar OpenLdap:

$ sudo /etc/init.d/slapd restart


Recursos:

Eines

PADL. Conversió de NIS i Unix a Ldap

$ sudo apt-get install conversiontools

Els scripts de conversió es troben a la carpeta:

 /usr/share/doc/migrationtool

Té un scripts per passar-ho tot tant en mode offline (Ldap apagat) o en mode online:

$ cd /usr/share/doc/migrationtool
$ ./migrate_all_online.sh

Es poden migrar parts concretes. Per exemple:

$ ./migrate_protocols.pl /etc/protocols /home/cursice/protocols.ldif

I després utilitzar els fitxers ldif conjuntament amb la comanda ldapadd:

$ ldapadd -x -f /home/cursice/protocols.ldif -D "cn=admin,dc=aulalinux,dc=ice,dc=upc,dc=edu" -W

LdapScripts

Consulteu l'article LdapScripts.

Eines d'administració gràfiques

Phpldapadmin

Veieu l'article Phpldapadmin.

GQ

El gq és un paquets que és pot instalar amb apt

$apt-get install gq

Es molt recomanable tenir també instalar el paquet ldap-utils.

Un cop instalat l'executem amb

$sudo gq

Al menu File-->Preferences i la pestanya servers és poden afegir servidors. La info que cal introduir és la de l'apartat Característiques del servidor ldap a skolelinux

Egroupware

Integra phpldapadmin

Ldap Account Manager (LAM)

Consulteu l'article sobre LAM

Configuració

Ldap-Account-Manager té una secció de configuració a la qual podem accedir amb el password per defecte lam. Es molt important que per qüestions de seguretat el primer que hem de fer és canviar aquest password. Podem modificar la configuració de LAM amb el link LAM Configuration o editant el fitxer:

/etc/ldap-account-manager/config.php

Cal tenir en compte que la contrasenya es guarda en clar en aquest fitxer i que per tant cal controlar qui pot llegir aquest fitxer.

Un cop hem canviat la configuració principal de LAM, ara hem d'editar els perfils seguint l'enllaç Edit Server Profiles:

Aquí podeu canviar les característiques del servidor LDAP al que volem gestionar les comptes d'usuari. Hem d'escollir:

  • La ip o el nom de màquina del servidor
  • El base dn del servidor
  • El llenguatge de la interfície de lam

Un altre cop la contrasenya per defecte és lam, i cal que la canvieu el més aviat possible.

NOTA: L'aplicació esta disponible en català i podem canviar l'interfície.

Recursos:

Webmin

Consulteu la secció Ldap Webmin de l'article sobre Webmin.

Gosa

Consulteu l'article sobre Gosa.

Apache Directory Studio

Veieu l'article sobre Apache Directory Studio.

Altres eines

Aplicacions lliures “Ldap Aware”:

Multiplataforma:

  • Ekiga (GnomeMeeting)
  • Mozilla Thunderbird
  • Novell Evolution

Linux

  • KaddressBook
  • gq
  • kolab

Aplicacions Ldap d'administració client

Recursos:

Recursos:

Exemple configuració servidor LDAP. Aula Linux

Consulteu l'article Exemple configuració servidor LDAP. Aula Linux.

Ldap i Thunderbird

Thunderbird pot treballar amb directoris de Ldap que facin de llibreta d'adreces.

Si volem passar els nostres contactes a un servidor Ldap primer els hauríem d'exportar:

A Thunderbird, dins la llibreta d'adreces podem exportar utilitzant el menú Eines/Exporta. El format a escollir ha de ser ldif.

Un cop tingueu un fitxer ldif amb tots els vostres contactes heu de carregar l'esquema de Thunderbird a OpenLdap

NOTA IMPORTANT: Cal tenir en compte que sembla ser que actualment no hi ha cap gestor de Correu que permeti mantenir els contactes d'un servidor Ldap.
Lo únic que poden fer és obtenir la informació.

Recursos:

Equivalències entre paràmetres de servidors i paràmetres client

Sovint és típic confondre els atributs:

LdapServerClientAtrributes.png

Recursos:

Configuració d'un client GNU/Linux per autenticar amb Ldap

Vegeu també l'antiga pàgina de configuració Configuració d'un client GNU/Linux per autenticar amb Ldap.

Ara la forma més senzilla de configurar el client Ldap és executar:

$ sudo apt-get install ldap-auth-config

Consulteu també l'apartat [# Automatització de la instal·lació utilitzant preseeding| Automatització de la instal·lació utilitzant preseeding]].

ldap-auth-client

Es tracta de un metapaquet o paquet tonto que realment no instal·la res de per si:

$ dpkg -L ldap-auth-client
/.
/usr
/usr/share
/usr/share/doc
/usr/share/doc/ldap-auth-client
/usr/share/doc/ldap-auth-client/copyright
/usr/share/doc/ldap-auth-client/changelog.gz

sinó que lo important són les dependències:

$ apt-cache depends ldap-auth-client
ldap-auth-client
 Depèn: libpam-ldap
   libpam-ldapd
 Depèn: libnss-ldap
   libnss-ldapd
 Entra en conflicte: libnss-ldap
 Entra en conflicte: libpam-ldap 

És a dis que serveix només per a instal·lar els paquets libpam-ldap i libnss-ldap.

ldap-auth-config

IMPORTANT: Les noves versions d'Ubuntu i Debian tenen aquest paquet que instal·la i configura al mateix temps tant libpam-ldap com libnss-ldap

Per configurar el client executeu:

$ sudo apt-get install ldap-auth-config

I responeu a les preguntes del configurador:

  • URL del servidor: Cal posar-la en format ldap://nomdelservidorOIP --> p.ex. ldap://ldap.iesebre.com
  • basedn: DN base a partir del qual es buscaran usuaris Linux (objectClass=posixAccount). P.ex ou=All,dc=iesebre,dc=com
  • versió: escolliu la versió 3
  • TODO 1: Normalment no cal. Poseu no
  • TODO 2: Normalment no cal. Poseu no
  • Tipus de xifratge: Durant la instal·lació escollirà per defecte md5. Podeu fer posteriorment un sudo dpkg-reconfigure ldap-auth-config per canviar el valor a exop

Els sistemes que utilitzen aquest paquet tenen un sol fitxer de configuració. Un exemple del resultat del fitxer de configuració (sense comentaris):

$ cat /etc/ldap.conf | grep -v '^#\|^$\|^;'
base ou=All,dc=insmontsia,dc=com
uri ldap://localhost
ldap_version 3
pam_password exop

Automatització de la instal·lació utilitzant preseeding

#!/bin/bash

apt-get install -y debconf-utils

# create answer file
sudo debconf-set-selections <<\EOF
ldap-auth-config	ldap-auth-config/dbrootlogin	boolean	false
ldap-auth-config	ldap-auth-config/pam_password	select	exop
ldap-auth-config	ldap-auth-config/move-to-debconf	boolean	true
ldap-auth-config	ldap-auth-config/ldapns/ldap-server	string	ldap://ldap.iesebre.com
ldap-auth-config	ldap-auth-config/ldapns/base-dn	string	ou=All,dc=iesebre,dc=com
ldap-auth-config	ldap-auth-config/ldapns/ldap_version	select	3
ldap-auth-config	ldap-auth-config/dblogin	boolean	false
ldap-auth-config	ldap-auth-config/override	boolean	true
EOF

apt-get install -y ldap-auth-config

#modify nsswitch.conf

cat <<\EOT > /etc/nsswitch.conf
# /etc/nsswitch.conf
#
# Example configuration of GNU Name Service Switch functionality.
# If you have the `glibc-doc-reference' and `info' packages installed, try:
# `info libc "Name Service Switch"' for information about this file.

passwd:         ldap compat
group:          ldap compat
shadow:         ldap compat

hosts:          files mdns4_minimal [NOTFOUND=return] dns mdns4
networks:       files

protocols:      db files
services:       db files
ethers:         db files
rpc:            db files

netgroup:       nis
EOT



Les dades necessaries per a fer el presed les podeu obtenir en un sistema ja instal·lat i configurat correctament:

$ sudo [[[debconf-get-selections]] | grep ldap-auth
ldap-auth-config	ldap-auth-config/rootbindpw	password	
ldap-auth-config	ldap-auth-config/bindpw	password	
ldap-auth-config	ldap-auth-config/binddn	string	cn=proxyuser,dc=example,dc=net
ldap-auth-config	ldap-auth-config/dbrootlogin	boolean	false
ldap-auth-config	ldap-auth-config/pam_password	select	exop
ldap-auth-config	ldap-auth-config/move-to-debconf	boolean	true
ldap-auth-config	ldap-auth-config/ldapns/ldap-server	string	ldap://ldap.iesebre.com
ldap-auth-config	ldap-auth-config/ldapns/base-dn	string	dc=All,dc=iesebre,dc=com
ldap-auth-config	ldap-auth-config/ldapns/ldap_version	select	3
ldap-auth-config	ldap-auth-config/dblogin	boolean	false
ldap-auth-config	ldap-auth-config/rootbinddn	string	cn=manager,dc=example,dc=net
ldap-auth-config	ldap-auth-config/override	boolean	true


Recursos:

libpam-ldap

Consulteu l'article libpam-ldap.

libnss-ldap

Consulteu l'article libnss-ldap.

PHP i Ldap

Consulteu PHP i Ldap.

Backup

Crear una replica exacte de un servidor

Mètode 1 Copiar directament els fitxers (versió 1)

Al servidor on es vol fer la replica (cal accés per SSH i Rsync al servidor replicat):

$ sudo apt-get install slapd ldap-utils
$ sudo /etc/init.d/slapd stop
$ sudo mv /etc/ldap /etc/ldap.original
$ sudo su
# rsync -e ssh -cavz root@192.168.0.8:/etc/ldap /etc
# sudo mv /var/lib/ldap/ /var/lib/ldap.original
# rsync -e ssh -cavz root@192.168.0.8:/var/lib/ldap /var/lib
# exit
$ sudo /etc/init.d/slapd start

Mètode 1 Copiar directament els fitxers (versió 2)

NOTA: Vegeu: Berkeley Database. Cal vigilar amb les versions de BDB, si la de la màquina original no és igual que la remota no funcionarà.

Suposeu que teniu un servidor Ldap configurat i funcionant correctament i voleu obtenir una copia exacte del servidor. Els passos a seguir són:

A la màquina a on voleu posar una còpia:

$ sudo apt-get install slapd ldap-utils

Per evitar corrupció de dades, apagueu el servidor Ldap del qual voleu fer copia:

$ sudo service slapd stop

Ara a la màquina que ha de tenir la copia copieu del servidor original les carpetes importants, ho podeu fer amb rsync o scp:

$ sudo mv /var/lib/ldap /var/lib/ldap.original
$ sudo mv /etc/ldap /etc/ldap.original

NOTA: En aquest exemple el servidor Ldap original té la IP 192.168.0.8

$ sudo scp -pr root@192.168.0.8:/var/lib/ldap /var/lib
$ sudo scp -pr root@192.168.0.8:/etc/ldap /etc

Ara cal arreglar els permisos:

$ sudo chown -R openldap:openldap /etc/ldap/slapd.d
$ sudo chown -R openldap:openldap /var/lib/ldap

IMPORTANT: Si el servidor original tenia suport per a SSL també caldrà fer:

$ sudo apt-get install gnutls-bin openssl
$ sudo scp -pr root@192.168.0.8:/etc/ssl/certs/slapd-ca-cert.pem /etc/ssl/certs/
$ sudo scp -pr root@192.168.0.8:/etc/ssl/certs/slapd-server.crt /etc/ssl/certs/
$ sudo scp -pr root@192.168.0.8:/etc/ssl/certs/slapd-server.key /etc/ssl/certs/
$ sudo chown openldap:openldap /etc/ssl/certs/slapd-server.crt 
$ sudo chown openldap:openldap /etc/ssl/certs/slapd-server.key

Ara ja podeu provar la copia:

$ sudo service slapd start

Podeu comprovar que funciona amb les ordres ldapwhoami i ldapsearch o també podeu utilitzar Apache Directory Studio. També val la pena utilitzar:

$ ps aux | grep slapd
openldap  1360  0.0  0.0 111384    56 ?        Ssl  Jan30   0:00 /usr/sbin/slapd -h ldap:/// ldapi:/// -g openldap -u openldap -F /etc/ldap/slapd.d/

Torneu a iniciar el servidor Ldap original:

$ sudo service slapd start

Si teniu problemes executeu Ldap en mode depuració:

$ sudo slapd -d 16383 -h 'ldap:/// ldapi:///' -g openldap -u openldap -F /etc/ldap/slapd.d/

Mètode 2 slapcat | slapadd

NOTA: Vegeu: Berkeley Database. Cal vigilar amb les versions de BDB, el mètode slapcat

Suposeu que teniu un servidor Ldap configurat i funcionant correctament i voleu obtenir una copia exacte del servidor. Els passos a seguir són:

A la màquina a on voleu posar una còpia:

$ sudo apt-get install slapd ldap-utils

Per evitar corrupció de dades, apagueu el servidor Ldap del qual voleu fer copia:

$ sudo service slapd stop

Ara feu una copia del servidor:

$ sudo slapcat > backupldap.ldif

Ara a la màquina que ha de tenir la copia copieu del servidor original les carpetes importants, ho podeu fer amb rsync o scp:

$ sudo mv /etc/ldap /etc/ldap.original

NOTA: En aquest exemple el servidor Ldap original té la IP 192.168.0.8

$ sudo scp -pr root@192.168.0.8:/etc/ldap /etc

Ara cal arreglar els permisos:

$ sudo chown -R openldap:openldap /etc/ldap/slapd.d

IMPORTANT: Si el servidor original tenia suport per a SSL també caldrà fer:

$ sudo apt-get install gnutls-bin openssl
$ sudo scp -pr root@192.168.0.8:/etc/ssl/certs/slapd-ca-cert.pem /etc/ssl/certs/
$ sudo scp -pr root@192.168.0.8:/etc/ssl/certs/slapd-server.crt /etc/ssl/certs/
$ sudo scp -pr root@192.168.0.8:/etc/ssl/certs/slapd-server.key /etc/ssl/certs/
$ sudo chown openldap:openldap /etc/ssl/certs/slapd-server.crt 
$ sudo chown openldap:openldap /etc/ssl/certs/slapd-server.key

NOTA: Si el servidor era un servidor de replica, caldrà crear la carpeta /var/lib/ldap/accesslog i configurar apparmor:

$ sudo joe /etc/apparmor.d/usr.sbin.slapd

Afegiu les línies:

/var/lib/ldap/accesslog/ r,
/var/lib/ldap/accesslog/** rwk,

Al final del fitxer (abans però del }).

Ara cal crear la carpeta /var/lib/ldap/accesslog/:

$ sudo -u openldap mkdir /var/lib/ldap/accesslog
$ sudo -u openldap cp /var/lib/ldap/DB_CONFIG /var/lib/ldap/accesslog/

Torneu a iniciar Apparmor:

$ sudo /etc/init.d/apparmor reload

Ara cal restaurar la copia feta amb slapadd, per restaurar sempre cal tenir el servidor Ldap aturat:

$ sudo service slapd stop
Stopping OpenLDAP: slapd.

$ sudo slapadd -l backupldap.ldif

Torneu a refer els permisos:

$ sudo chown openldap:openldap -R /var/lib/ldap

Ara ja podeu provar la copia:

$ sudo service slapd start

Podeu comprovar que funciona amb les ordres ldapwhoami i ldapsearch o també podeu utilitzar Apache Directory Studio. També val la pena utilitzar:

$ ps aux | grep slapd
openldap  1360  0.0  0.0 111384    56 ?        Ssl  Jan30   0:00 /usr/sbin/slapd -h ldap:/// ldapi:/// -g openldap -u openldap -F /etc/ldap/slapd.d/

Torneu a iniciar el servidor Ldap original:

$ sudo service slapd start

Si teniu problemes executeu Ldap en mode depuració:

$ sudo slapd -d 16383 -h 'ldap:/// ldapi:///' -g openldap -u openldap -F /etc/ldap/slapd.d/

ninjabackup

ninjabackup es capaç de fer copies de Seguretat de Ldap.

Mòduls

Ldap permet dos opcions a l'hora de ampliar les seves funcionalitats: es poden incloure estàticament en temps de compilació o és poden activar com a mòduls dinàmics.

Activació de mòduls Ldap amb cn=config

Normalment els mòduls s'activen a:

cn=modules{0},cn=config

o

cn=module{0},cn=config

La següent captura de pantalla mostra el contingut de cn=module{0},cn=config:

ModulsLdap.png

A l'exemple hi ha dos mòduls activats que són els necessaris per crear un proveïdor syncrepl.

Els mòduls disponibles els trobareu a la carpeta /usr/lib/ldap/

$ ls /usr/lib/ldap/
accesslog-2.4.so.2        back_ldap.la               back_relay-2.4.so.2      constraint.la          pcache-2.4.so.2       seqmod.la
accesslog-2.4.so.2.5.6    back_ldap.so               back_relay-2.4.so.2.5.6  constraint.so          pcache-2.4.so.2.5.6   seqmod.so
accesslog.la              back_meta-2.4.so.2         back_relay.la            dds-2.4.so.2           pcache.la             sssvlv-2.4.so.2
accesslog.so              back_meta-2.4.so.2.5.6     back_relay.so            dds-2.4.so.2.5.6       pcache.so             sssvlv-2.4.so.2.5.6
...

Si, per exemple, voleu activar el mòdul dynlist cal afegir un atribut olcModuleLoad:

olcModuleLoad: {3}dynlist

I automàticament tindreu el mòdul actiu.

Overlays

Els "overlay" de openldad són components de software que proporcionen un hook (ganxo) a funcions similars a les que proporcionen els backend ldap. Els hooks poden aplicar-se durant les crides al backend o durant les respostes per tal de modificar les el comportament del backend ldap.

NOTA: Per exemple el overlay dynlist permet que s'insereixin una sèrie d'atributs de Ldap dinàmicament a partir d'una cerca tipus ldapsearch

Els overlays poden estar compilats estàticament a slapd o es poden activar com a mòduls ldap dinàmics.

Some can be stacked on the frontend as well, for global use. This means that they can be executed after a request is parsed and validated, but right before the appropriate database is selected. The main purpose is to affect operations regardless of the database they will be handled by, and, in some cases, to influence the selection of the database by massaging the request DN.

Essentially, overlays represent a means to:

   * customize the behavior of existing backends without changing the backend code and without requiring one to write a new custom backend with complete functionality
   * write functionality of general usefulness that can be applied to different backend types

Quan s'utilitza slapd.conf(5) es configuren de la següent forma:

       database frontend
       overlay <overlay name>

La majoria de overlays estan documentats amb manuals Linux a la secció 5.

$ man slapo-<overlay name>

Tots els overlays principals (core overlays, els que venen per defecte amb openldap) tenen una pàgina de manual. Els oficials els podeu trobar a:

servers/slapd/overlays/

Un fitxer interessant és slapover.txt, que explica com funcionen i com es desenvolupen overlays.

Altres overlays els podeu trobar a:

contrib/slapd-modules/<overlay name>/

Consulteu:

overlay syncrepl

Vegeu syncrepl

dynlist

Configuració antiga (fitxers slapd.conf)

Al fitxer /etc/ldap/slapd.conf poseu:

overlay dynlist
dynlist-attrset labeledUriObject labeledURI

Si el vostre servidor Ldap carrega els mòduls dinàmicament cal posar:

moduleload dynlist

A la secció global del fitxer de configuració.

Consulteu també el manual:

$ man slapo-dynlist

Configuració de dynlist amb cn=config

El primer que cal fer és activar el mòdul dynlist, afegint l'atribut:

olcModuleLoad: {3}dynlist

a l'objecte:

[[cn=module{0},cn=config]]

Ho podeu fer amb l'eina ADS:

Dynlist1.png

NOTA: A l'exemple posa 3 per què és el tercer mòdul activat, és a dir hi ha dos mòduls amb els índex 1 i 2

També cal definir l'atribut olcDlAttrSet però això ho farem més endavant en aquest mateix manual.

Podeu utilitzar Apache Directory Studio per modificar la base de dades cn=config.

També cal que tingueu disponible l'objecte:

groupOfURLs

Als vostres esquemes. L'esquema el trobareu a:

$ grep -n "groupOfURLs" -r /etc/ldap/schema/
/etc/ldap/schema/dyngroup.schema:78:	NAME 'groupOfURLs'

Pes instal·lar-lo primer cal passar-lo a format ldif. Segons el contingut de l'esquema groupOfURLs depèn de l'esquema core.schema. Per tant per convertir-lo farem les següents passes (vegeu Conversió d'esquemes Ldap):

$ mkdir schemaConversions && cd schemaConversions/
$ joe schema_convert.conf

I poseu:

include /etc/ldap/schema/core.schema
include /etc/ldap/schema/dyngroup.schema

I ara executeu:

$ mkdir ldif_result
$ slaptest -f schema_convert.conf -F ldif_result 

Ja teniu l'esquema convertit, per instal·lar-lo:

$ sudo install -c -o openldap -g openldap -m 640 ldif_result/cn\=config/cn\=schema/cn\=\{1\}dyngroup.ldif  /etc/ldap/slapd.d/cn\=config/cn\=schema

Ojo però amb el número, poseu el que us correspongui, en el meu cas era l'esquema 20:

$ sudo mv /etc/ldap/slapd.d/cn\=config/cn\=schema/cn\=\{1\}dyngroup.ldif /etc/ldap/slapd.d/cn\=config/cn\=schema/cn\=\{20\}dyngroup.ldif

IMPORTANT: Si canvieu el número de l'esquema també us caldrà entrar dis del fitxer cn\=\{XX\}dyngroup.ldif i posar el cn que correspongui

Un cop activat el mòdul es configura posant un objecte olcOverlayConfig a la nostra base de dades DIT, per exemple la primera base de dades hdb:

$ mkdir /etc/ldap/configuracioInicial/
$ cd /etc/ldap/configuracioInicial/

Creeu un fitxer LDIF:

$ sudo joe dynlist_overlay.ldif

dn: olcOverlay=dynlist,olcDatabase={1}hdb,cn=config
objectClass: olcOverlayConfig
objectClass: olcDynamicList
olcOverlay: dynlist

I afegiu l'objecte amb:

$ sudo ldapadd -x -D cn=admin,cn=config -W -f dynlist_overlay.ldif

Ara vegem un exemple d'ús, anem a crear grups de Unix (PosixGroup) dinàmics:

Cal afegir l'atribut olcDlAttrSet a l'objecte olcOverlayConfig que acabem de crear:

olcDlAttrSet: {0}labeledURIObject labeledURI memberUid:uid

La configuració queda quelcom similar a:

Dynlist2.png

Amb això indiquem que cada cop que es trobi un objecte de tipus labeledURIObject, aleshores abans d'obtenir els atributs d'aquest objecte primer es farà una cerca ldap (ldapsearch) utilitzant el camp labeledURI de l'objecte. L'´ultim camp:

memberUid:uid

Fa que els camps uid que es trobin durant la cerca s'insereixin a l'objecte com a camps memberUid. Amb aquesta configuració, el següent objecte:

dn: cn=maninfo,ou=groups,ou=Maninfo,ou=Personal,ou=All,dc=insmontsia,dc=com
objectClass: labeledURIObject
objectClass: posixGroup
objectClass: top
cn: maninfo
gidNumber: 2003
labeledURI: ldap:///ou=Maninfo,ou=Personal,ou=All,dc=insmontsia,dc=com?uid?s
 ub?(objectClass=posixAccount)

Retorna realment:

dn: cn=maninfo,ou=groups,ou=Maninfo,ou=Personal,ou=All,dc=insmontsia,dc=com
objectClass: labeledURIObject
objectClass: posixGroup
objectClass: top
cn: maninfo
gidNumber: 2003
labeledURI: ldap:///ou=Maninfo,ou=Personal,ou=All,dc=insmontsia,dc=com?uid?s
 ub?(objectClass=posixAccount)
memberUid: jordimarin
memberUid: lisasimpson
memberUid: oscaralavedra

NOTA: L'objecte es pot configurar amb GOsa 2.7 posant la labeledURI a la pestanya Dynamic object

Apliqueu els canvis:

$ sudo /etc/init.d/slapd restart

Compte al reiniciar el servidor Ldap que no doni cap error! Comproveu que esta funcionant amb:

$ ps aux | grep slapd

En cas d'errors val la pena executar slapd en mode debug:

Ldap#Com_depurar.2C_executar_el_servidor_LDAP_a_m.C3.A0_en_mode_debug

NOTA: Amb gosa 2.7 també podeu utilitzar la pestanya dynamic groups. Un exemple de com ha de quedar la pestanya:

DynlistGosaExample.png


Manual

dynlist-attrset <group-oc> [<URI>] <URL-ad> [[<mapped-ad>:]<member-ad> ...]
             The value group-oc is the name of the objectClass that triggers the dynamic expansion of the data.

             The optional URI restricts expansion only to entries matching the DN, the scope and the filter portions of the URI.

             The  value  URL-ad  is  the  name of the attributeDescription that contains the URI that is expanded by the overlay; if none is present, no
             expansion occurs.  If the intersection of the attributes requested by the search operation (or the asserted attribute for compares) and the
             attributes listed in the URI is empty, no expansion occurs for that specific URI.  It must be a subtype of labeledURI.

             The value member-ad is optional; if present, the overlay behaves as a dynamic group: this attribute will list the DN of the entries result‐
             ing from the internal search.  In this case, the attrs portion of the URIs in the URL-ad attribute must be absent, and the DNs of  all  the
             entries  resulting  from the expansion of the URIs are listed as values of this attribute.  Compares that assert the value of the member-ad
             attribute of entries with group-oc objectClass apply as if the DN of the entries resulting from the expansion of the URI  were  present  in
             the group-oc entry as values of the member-ad attribute.

             Alternatively,  mapped-ad  can be used to remap attributes obtained through expansion.  member-ad attributes are not filled by expanded DN,
             but are remapped as mapped-ad attributes.  Multiple mapping statements can be used.

Exemple amb mailaliases

TODO:

Step#4: Now you are ready to actually use the dynlist module. A common use-case is to create dynamic mail alias objects; with dynlist you don't need to maintain mail aliases, they will automatically contain everyone who matches the relevent criteria. Provided you use the traditional nisMailAlias objectclass in order to define mail aliases adding the attribute -

   olcDlAttrSet: {0}nisMailAlias labeledURI rfc822mailmember:mail
- to "olcOverlay=dynlist,olcDatabase={1}hdb,cn=config" will enable dynamic mail aliases.  Specifically any nisMailAlias containing a labeledURI attribute will be expanded by the query specified in that attribute.  The results of that query will be rewritten by the optional rfc822mailmember:mail clause which will rename the mail attributes resulting from the query into the rfc822mailmember attribute required by consumers of the nisMailAlias objects.  So rather than populating the mail alias object with rfc822mailmember attributes manually, you extend the object with the auxilliary labeledURIObject objectclass and define the query in the labeledURI attribute.
   dn: cn=gr_parts, ou=ListAliases, ou=Aliases, ou=Mail, ou=SubSystems, o=Morrison Industries,c=US
   mail: gr_parts@morrison-ind.com
   labeledURI: ldap:///ou=People,ou=Entities,ou=SAM,o=Morrison Industries,c=US?mail?one?(&(morrisonactiveuser=Y)(objectclass=morrisonuser)(departmentNumber=*P*)(morrisonbranch=GRD))
   objectClass: nisMailAlias
   objectClass: top
   objectClass: labeledURIObject
   cn: gr_parts

The object will immediately populate with rfc822mailmember attributes derived from the mail attribute of those objects matching the specified filter: "(&(morrisonactiveuser=Y)(objectclass=morrisonuser)(departmentNumber=*P*)(morrisonbranch=GRD))". The third parameter, "one", of the URI is the scope of the query so only objects immediately subordinate to "ou=People,ou=Entities,ou=SAM,o=Morrison Industries,c=US" are candidates for the filter.

Bases de dades Berkeley DB

El format més utilitzat de backend són les bases de dades Berkeley DB:

Consulteu Berkeley DB

Configuració

Vegeu:

http://www.zytrax.com/books/ldap/ch6/bdb.html

Apache i Ldap

Consulteu Apache#Autenticaci.C3.B3_amb_Ldap

Recuperació de bases de dades malmeses db_recover

IMPORTANT: Cal utilitzar la versió de l'eina db_recover que correspongui a la versió de base de dades Ldap que tingueu.

El primer que cal fer és instal·lar les eines de manipulació (les tools) de bases de dades Berkeley. Veureu que hi ha diverses versions:

$ sudo dpkg -l | grep libdb
ii  libdb4.7                            4.7.25-9                            Berkeley v4.7 Database Libraries [runtime]
ii  libdb4.8                            4.8.30-1                            Berkeley v4.8 Database Libraries [runtime]

Per veure quina versió utilitzar ldap:

$ apt-cache depends slapd
slapd
 Depèn: libc6
 Depèn: libdb4.8
...

En el nostre cas instal·lem la versió 4.8:

$ sudo apt-get install db4.8-util
$ dpkg -L db4.8-util 
/.
/usr
/usr/share
/usr/share/man
/usr/share/man/man1
/usr/share/man/man1/db4.8_archive.1.gz
/usr/share/man/man1/db4.8_deadlock.1.gz
/usr/share/man/man1/db4.8_dump.1.gz
/usr/share/man/man1/db4.8_hotbackup.1.gz
/usr/share/man/man1/db4.8_load.1.gz
/usr/share/man/man1/db4.8_printlog.1.gz
/usr/share/man/man1/db4.8_recover.1.gz
/usr/share/man/man1/db4.8_stat.1.gz
/usr/share/man/man1/db4.8_upgrade.1.gz
/usr/share/man/man1/berkeley_db4.8_svc.1.gz
/usr/share/man/man1/db4.8_checkpoint.1.gz
/usr/share/man/man1/db4.8_verify.1.gz
/usr/share/doc
/usr/share/doc/db4.8-util
/usr/share/doc/db4.8-util/copyright
/usr/share/doc/db4.8-util/changelog.Debian.gz
/usr/bin
/usr/bin/db4.8_deadlock
/usr/bin/db4.8_dump
/usr/bin/db4.8_hotbackup
/usr/bin/db4.8_load
/usr/bin/db4.8_printlog
/usr/bin/db4.8_recover
/usr/bin/db4.8_sql
/usr/bin/db4.8_upgrade
/usr/bin/db4.8_verify
/usr/bin/db4.8_archive
/usr/bin/db4.8_checkpoint
/usr/bin/db4.8_stat  

Vegeu també: Berkeley_Database.

Els errors amb bases de dades Berkeley els podeu tenir amb múltiples sistemes que les utilitzen, però un dels més típics és OpenLdap. En la meva experiència els errors s'identifiquen als fitxer de log del sistema (/var/log/syslog). Consulteu l'apartat Ldap#slapd_unable_to_allocate_memory_for_mutex.3B_resize_mutex_region

Si us dona l'error:

PANIC: fatal region error detected; run recovery
$ sudo apt-get install db4.8-util
$ sudo su
# cd /var/lib/ldap
# db4.8_recover

O millor encara si utilitxeu el mode verbose:

/var/lib/ldap# db4.8_recover -v
Finding last valid log LSN: file: 11 offset 6138377
Recovery starting from [11][6138249]
Recovery complete at Sun Apr  8 11:52:29 2012
Maximum transaction ID 80000009 Recovery checkpoint [11][6138377]

IMPORTANT: Tingueu en compte que en el cas de servidors Ldap amb repliques pot ser que la base de dades espatllada sigui la acceslog i per tant la carpeta a solucionar sigui /var/log/ldap/accesslog

I un cop feta la recuperació cal restaurar els permisos dels fitxers:

NOTA: A mi en alguns casos no m'ha calgut fer-ho

# chown -R openldap:openldap -R /var/lib/ldap
# exit
$

Haureu de provar de recuperar amb dbx_recover on x és la versió de les BDB...

Recursos:

Còpia de seguretat

Realitzar una còpia de seguretat

Primer cal entrar al servidor Ldap, suposem que és troba a la IP 192.168.50.30 (ip típica del servidor Gosa/Ldap del projecte OpenFPnet):

$ ssh 192.168.50.30
$ cd

Atureu el servidor Ldap:

$ sudo /etc/init.d/slapd stop

Feu una còpia de seguretat:

$ sudo slapcat > servidorLdap_iesebre_27_06_2013.ldif

IMPORTANT: slapcat només realitza un backup del directori ldap principal. Si teniu altres directoris cal utilitzar el paràmetre -b. Per exemple més endavant en aquest exemple veurem com copia la base de dades de configuració config

NOTA: Modifiqueu el nom del fitxer per adaptar-lo al vostre cas

Comproveu el contingut del fitxer i feu una còpia de seguretat. També podeu copiar físicament el sistema de fitxers:

$ sudo cp -r /var/lib/ldap /var/lib/ldap_201213

És important també fer una còpia de seguretat de la configuració del servidor Ldap:

$ sudo cp -r /etc/ldap /etc/ldap_201213

I del directori ldap de configuració:

$ sudo bash -c "slapcat -b cn=config > "

És important guardar la còpia a un servidor remot. Si torneu a la vostra màquina podeu copiar el fitxer per SSH amb:

$ exit
$ cd
$ mkdir ldap_backup
$ cd ldap_backup
$ scp 192.168.50.30:~/servidorLdap_27_06_2013.ldif .
$ scp 192.168.50.30:~/servidorldap_config_iesebre_27_06_2013.ldif .
$ scp 192.168.50.30:/var/lib/ldap_201213 .
$ scp 192.168.50.30:/etc/ldap_201213] . 

Torneu a encendre el servidor Ldap:

$ ssh 192.168.50.30
$ sudo /etc/init.d/slapd start

Comproveu que el servidor ha arrancat:

$  ps aux | grep slapd
openldap 28243  0.0  0.1 365876  7732 ?        Ssl  07:20   0:00 /usr/sbin/slapd -h ldap:/// ldapi:/// -g openldap -u openldap -F /etc/ldap/slapd.d

Troubleshooting

Migrar base de dades d'un màquina a un altre i canviant la versió de slapd o BDB utils

Si al actualitzar Ubuntu de 12.04 a 14.04 us dona un error el paquet slapd executant l'script:

/var/lib/dpkg/info/slapd.postinst

Podeu utilitzar les següents comandes per migrar una base de dades ldap. Cal copiar les carpetes /var/lib/ldap i /etc/ldap/slapd.d. Seguiu els passos de:

Slapd#M.C3.A8tode_1_Copiar_directament_els_fitxers_.28versi.C3.B3_1.29

Per actualitzar els fitxers de base de dades berkeley (BDB):

$ sudo apt-get install db5.3-util
$ sudo su
$ cd /var/lib/ldap
# db5.3_recover -v -h /var/lib/ldap
# db5.3_upgrade -v -h /var/lib/ldap/ *.bdb
# chown openldap:openldap -R .
# /etc/init.d/slapd restart

Si teniu també una base de dades accesslog (vegeu syncrepl):

# cd /var/lib/ldap/accesslog/
# db5.3_recover -v -h /var/lib/ldap/accesslog/
# db5.3_upgrade -v -h /var/lib/ldap/accesslog/ *.bdb
# chown openldap:openldap -R .

{{nota|Al exemple la versió instal·lada a la màquina destí de la còpia és de 5.3. Adapteu la comanda a la vostra versió]]

Si durant el procés el servidor Ldap no us arranca bé executeu:

# slapd -d 16383 -h 'ldap:/// ldapi:///' -g openldap -u openldap -F /etc/ldap/slapd.d/

Per tal detenir més informació.

Per evitar que continuï donant errors el fitxer:

/var/lib/dpkg/info/slapd.postinst

l'editeu:

$ sudo joe /var/lib/dpkg/info/slapd.postinst

i afegiu després del shebang:

return 0

Canviar el basedn d'un servidor Ldap

Jo no conec cap forma simple de fer-ho. El procediment complet seria:

  • Fer còpies de seguretat de totes les bases de dades
  • Crear un nou servidor Ldap des de zero amb el nou basedn. Podeu utilitzar per exemple l'instal·lador Ldap que inclou installgosa
  • Fer una còpia de seguretat de l'arbre antic utilitzant slapcat
  • Utilitzar les eines descrites al article base64 per tal de decodificar les entrades DN de la còpia de seguretat. Això és un requisit previ per tal que totes aquelles entrades Ldap que tinguin caràcters "extranys" (per exemple: ou=Gestió,ou=All,cn=insmontsia,cn=org) apareguin com a text i no com a base64 i puguin ser reemplaçades. Cal tenir en compte:
  • Primer car utilitzar l'script unldif, que farà que les línies llarges no estiguin plegades o folded. Ldif posa un límit màxim de mida de línia de 78 caràcters.
  • Després cal utilitzar l'eina un64.sh, per tal de decodificar totes les entrades CN que estiguin en format base64
  • Utilitzar algun editor de text (per exemple geany) per tal de buscar i reemplaçar totes les ocurrències del basedn. Per exemple de cn=insmontsia,cn=com a cn=iesmontsia,cn=org.
  • Cal tornar a plegar(fold) l'arxiu ldif resultant per que funcionin camps com les fotos (p.ex. el camp jpegPhoto)
  • Restaurar la còpia de seguretat amb slapadd. Cal utilitzar l'opció -c per tal d'evitar aturades quan hi haguin errors (per exemple el basedn ja existirà).

Exemple:

En el servidor origen:

$ sudo /etc/init.d/slapd stop
Stopping OpenLDAP: slapd.
$ sudo slapcat > ldap15092012.ldif

En el servidor destinació:

$ sudo /etc/init.d/slapd stop
$ sudo slapcat > copiaseguretatabansmigracio15062012.ldif

Ara passem el fitxer del servidor origen al servidor destinació:

$ scp ldap15092012.ldif sergi@192.168.50.30:~/LdapInicialProvinentDeMigracio/

On 192.168.50.30 és la Ip del servidor de destinació.

En el nostre cas el domini d'origen té el DN:

dc=insmontsia,dc=com

I volem passar a:

dc=iesmontsia,dc=org

Al servidor de destinació, cal processar el fitxer d'origen per tal de fer les modificacions. Creem l'script unldif i el fem executable:

$ joe unldif.sed
$ sudo chmod +x unldif.sed

Ara executem:

$ cat ldap15092012.ldif | ./unldif.sed > ldap15092012_unfolded.ldif

Ja tenim les línies llargues. Ara cal crear l'script un64.sh

$ joe un64.sh
$ chmod +x un64.sh

I apliquem-lo al fitxer ldap15092012_unfolded.ldif

$ cat ldap15092012_unfolded.ldif | ./un64.sh > ldap15092012_unfolded_un64.ldif

Editem el fitxer resultant:

$ geany ldap15092012_unfolded_un64.ldif 

Amb un Ctrl+H podem utilitzar el buscar i reemplaçar:

dc=insmontsia,dc=com

per:

dc=iesmontsia,dc=org

Guardeu el fitxer amb el nom:

ldap15092012_unfolded_un64_replaced.ldif

Ara tornem a plegar el fitxer. Utilitzeu l'script fold:

$ joe fold.awk
$ chmod +x ./fold.awk

I executem:

$ cat ldap15092012_unfolded_un64_replaced.ldif | ./fold.awk > ldap15092012_unfolded_un64_replaced_refolded.ldif

Tardarà una bona estona. Ara ja estem preparats per volcar el nou fitxer:

$ sudo slapadd -c -l ldap15092012_unfolded_un64_replaced_refolded.ldif

Torneu a iniciar el servidor Ldap:

$ sudo /etc/init.d/slapd start

Comproveu que funciona:

$ ps aux | grep slapd
openldap 11023  0.0  0.7 433532  7924 ?        Ssl  06:29   0:00 /usr/sbin/slapd -h ldap:/// ldapi:/// -g openldap -u openldap -F /etc/ldap/slapd.d

I que no hi han errors:

$ sudo tail -f /var/log/syslog

És molt possible que haguéssim d'executar un recover, vegeu:

Ldap#Recuperaci.C3.B3_de_bases_de_dades_malmeses_db_recover
$ apt-cache depends slapd | grep libdb
$ sudo apt-get install db5.1-util 
$ sudo su
# cd /var/lib/ldap/
# db5.1_recover -v
# chown -R openldap:openldap -R /var/lib/ldap
# exit
$ sudo /etc/init.d/slapd start

També val la pena tornar a construir els índexs Ldap amb slapindex:

$ sudo /etc/init.d/slapd stop
$ sudo /usr/sbin/slapindex
$ sudo chown openldap:openldap -R /var/lib/ldap
$ sudo /etc/init.d/slapd start

Cal tenir en compte que després de la migració, totes les repliques estaran desactualitzades i caldrà forçar la replicació seguint els passos de:

Ldap#S.27esborra_tota_la_replica_menys_l.27objecte_principal

Per forçar que tornin a replicar totes les modificacions.

bi_db_open failed! (13) bdb_db_close: database "XXX": alock_close failed

En el meu cas donava l'error:

$ sudo tail -f /var/log/syslog
Aug 10 08:10:39 gosa slapd[15279]: backend_startup_one (type=hdb, suffix="dc=iesmontsia,dc=org"): bi_db_open failed! (13)
Aug 10 08:10:39 gosa slapd[15279]: bdb_db_close: database "dc=iesmontsia,dc=org": alock_close failed
Aug 10 08:10:39 gosa slapd[15279]: slapd stopped.
Aug 10 08:10:43 gosa slapd[15296]: @(#) $OpenLDAP: slapd  (Jul 26 2012 00:09:02) $#012#011buildd@allspice:/build/buildd/openldap-2.4.28/debian/build/servers/slapd
Aug 10 08:10:43 gosa slapd[15297]: hdb_db_open: database "dc=iesmontsia,dc=org" cannot be opened, err 13. Restore from backup!
Aug 10 08:10:43 gosa slapd[15297]: bdb(dc=iesmontsia,dc=org): txn_checkpoint interface requires an environment configured for the transaction subsystem
Aug 10 08:10:43 gosa slapd[15297]: bdb_db_close: database "dc=iesmontsia,dc=org": txn_checkpoint failed: Invalid argument (22).
Aug 10 08:10:43 gosa slapd[15297]: backend_startup_one (type=hdb, suffix="dc=iesmontsia,dc=org"): bi_db_open failed! (13)
Aug 10 08:10:43 gosa slapd[15297]: bdb_db_close: database "dc=iesmontsia,dc=org": alock_close failed
Aug 10 08:10:43 gosa slapd[15297]: slapd stopped.

Després de restaurar una copia de seguretat amb slapadd. Sembla que era un problema amb els indexs:

$ sudo /usr/sbin/slapindex
WARNING!
Runnig as root!
There's a fair chance slapd will fail to start.
Check file permissions!
$ sudo chown openldap:openldap -R /var/lib/ldap

I ja arranca correctament:

$ sudo /etc/init.d/slapd start
* Starting OpenLDAP slapd                                                                                                                                                [ OK ]

Amb la instal·lació automàtica de Ldap en Ubuntu 11.10 o superior no hi ha usuari d'accés a la base de dades config

Creeu-vos una carpeta per posar els fitxers ldif:

$ sudo mkdir /etc/ldap/configuracioInicial/
$ cd /etc/ldap/configuracioInicial/

Per crear l'usuari, primer creeu el següent fitxer:

$ sudo joe config.ldif  

dn: cn=config
changetype: modify

dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootDN
olcRootDN: cn=admin,cn=config

dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootPW
olcRootPW: Paraula de pas en MD5

ON heu de posar la paraula de pas en MD5:

$ mkpasswd -m md5

Lo anterior no funciona! Obligatoriament cal utilitzar slappasswd:

$ slappasswd -h {MD5}

I ara executar:

$ sudo ldapadd -Y EXTERNAL -H ldapi:/// -f config.ldif

Canviar la paraula de pass de cn=config

Creeu-vos una carpeta per posar els fitxers ldif:

$ sudo mkdir /etc/ldap/configuracioInicial/
$ cd /etc/ldap/configuracioInicial/

Per crear l'usuari, primer creeu el següent fitxer:

$ sudo joe config.ldif  
dn: olcDatabase={0}config,cn=config
changetype: modify
replace: olcRootPW
olcRootPW: Paraula de pas en MD5

ON heu de posar la paraula de pas en MD5:

$ mkpasswd -m md5

Lo anterior no funciona! Obligatoriament cal utilitzar slappasswd:

$ slappasswd -h {MD5}

I ara executar:

$ sudo ldapadd -Y EXTERNAL -H ldapi:/// -f config.ldif

file id2entry.bdb has LSN 204/4391988, past end of log at 204/4361029

També el missatge d'error pot dir quelcom similar a:

syncrepl_updateCookie: rid=000 be_modify failed (22) Jul 18 07:03:55 replicaLdap slapd[2823]: bdb(dc=iesmontsia,dc=org): file id2entry.bdb has LSN 1/113730, past end of log at 1/66517 Jul 18 07:03:55 replicaLdap slapd[2823]:  
bdb(dc=iesmontsia,dc=org): Commonly caused by moving a database from one database environment...

IMPORTANT: Aquest error m'ha passat més d'un cop. En un dels casos va ser problema de no aturar el servidor Ldap abans de mirar de fer una còpia d'un servidor master a l'esclau copiant les carpetes /var/lib/ldap i /etc/ldap del master a l'esclau de syncrepl

Al executar Ldap en mode debug:

$ sudo slapd -d 16383 -h 'ldap:/// ldapi:///' -g openldap -u openldap -F /etc/ldap/slapd.d/
...
file id2entry.bdb has LSN 204/4391988, past end of log at 204/4361029
bdb(dc=iesebre,dc=com): Commonly caused by moving a database from one database environment
bdb(dc=iesebre,dc=com): to another without clearing the database LSNs, or by removing all of
bdb(dc=iesebre,dc=com): the log files from a database environment
bdb(dc=iesebre,dc=com): __db_meta_setup: /var/lib/ldap/id2entry.bdb: unexpected file type or format
hdb_db_open: database "dc=iesebre,dc=com": db_open(/var/lib/ldap/id2entry.bdb) failed: Invalid argument (22)

En una base de dades ldap replicada. La solució ha estat Tornar a construir una replica Ldap.

slapd unable to allocate memory for mutex; resize mutex region

Aquest missatge us pot apareixeir al fitxer de log del sistema /var/log/syslog:

$ sudo tail -f /var/log/syslog 
Apr  8 11:53:42 cop slapd[11727]: bdb(cn=accesslog): unable to allocate memory for mutex; resize mutex region
Apr  8 11:53:42 cop slapd[11727]: hdb_db_open: database "cn=accesslog" cannot be opened, err 12. Restore from backup!

NOTA: Tingueu en compte que el script System V d'arrancada del servidor Ldap no us donarà cap error:

$ sudo /etc/init.d/slapd start
Starting OpenLDAP: slapd.

Consulteu Recuperació de bases de dades Ldap malmeses amb db_recover. Cal utilitzar l'eina db_recover.

IMPORTANT: Cal identificar quina base de dades Ldap és la que té problemes. Per exemple a fitxer de log de més amunt podeu veure que no és la base de dades "principal" sinó la accesslog ja que és tracta d'un servidor Ldap que té repliques Ldap

Error LDAP arxiu acl.ldif

modifying entry "olcDatabase={1}hdb,cn=config"
ldap_modify: Other (e.g., implementation specific) error (80)
       additional info: <olcAccess> handler exited with 1

Aquest missatge surt perquè falten d'afegir els 3 squemes principals:

# ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/cosine.ldif
# ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/inetorgperson.ldif
# ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/nis.ldif

build signature doesn't match environment

Si al executar el servidor Ldap en mode depuració vegeu l'error:

$ sudo slapd -d 16383 -h 'ldap:/// ldapi:///' -g openldap -u openldap -F /etc/ldap/slapd.d/
...
bdb(dc=iesebre,dc=com): Build signature doesn't match environment
hdb_db_open: database "dc=iesebre,dc=com" cannot be opened, err -30971. Restore from backup!

En el meu cas era per un backup directe de copia de fitxers però on la màquina de destinació i la màquina d'origen no eren sistemes de la mateixa platafoma. Un era de 64 bits (origen) i l'altre de 32.

Servidor Ldap deixa de funcionar després d'un upgrade de Ubuntu 9.10 a 10.10

Al final m'ha tocat esborrar tot ldap i restaurar una copia de seguretat a mà... NO m'ha funcionat cap dels remeis indicats a webs com:


Com a referència, tot iq ue no crec que estigui bé:

NOTA: En el cas exposat el servidor Ldap és un servidor master replicat a altres servidors esclaus utilitzant syncrepl

NOTA: Compte al fer l'upgrade amb do-release-upgrade! Durant l'actualització us farà preguntes sobre fitxers modificats en local. Normalment l'opció per defecte és mantenir els fitxers locals (no sobrescriure per les noves versions dels fitxers!). Això sovint és lo ideal. Per exemple us dirà que heu canviat la configuració de apparmor per tal de poder configurar la replicació Ldap

L'error que dona durant l'actualització és:

S'està instal·lant una versió nova del fitxer de configuració /etc/ldap/schema/cosine.ldif …
 Backing up /etc/ldap/slapd.d/ in /var/backups/slapd-2.4.21-0ubuntu5.3... done.
 Moving old database directories to /var/backups:
 - directory dc=iesebre,dc=com... done.
 Loading from /var/backups/slapd-2.4.21-0ubuntu5.3: 
 - directory dc=iesebre,dc=com... failed.

Loading the database from the LDIF dump failed with the following
error while running slapadd:
   olcDbDirectory: value #0: invalid path: No such file or directory
   config error processing olcDatabase={2}hdb,cn=config: olcDbDirectory: value #0: invalid path: No such file or directory
   slapadd: bad configuration directory!
dpkg: s'ha produït un error en processar slapd (--configure):
 el subprocés s'ha instal·lat l'escript post-installation retornà el codi d'eixida d'error 1
S'està configurant libmailtransport4 (4:4.5.1-0ubuntu1) …
S'està configurant kdepimlibs5 (4:4.5.1-0ubuntu1) …
Traceback (most recent call last):
                                    File "/usr/share/apport/package_hook", line 59, in <module>
                                                                                                   
pr.write(open(apport.fileutils.make_report_path(pr), 'w'))
                               IOError: [Errno 2] No such file or directory: '/var/crash/slapd.0.crash'

Després de l'error no podeu arrancar Ldap:

$ sudo /etc/init.d/slapd restart

Al log:

$ sudo tail -f --lines=100 /var/log/syslog

Veure que es queixa que no existeix la carpeta:

/var/lib/ldap/accesslog
La sol·lució és tornar a crear la carpeta /var/lib/ldap/accesslog:
$ sudo -u openldap mkdir /var/lib/ldap/accesslog

Copiar el fitxer DB_CONFIG i reiniciar apparmor i slapd:

$ sudo -u openldap cp /var/lib/ldap/DB_CONFIG /var/lib/ldap/accesslog/
$ sudo /etc/init.d/apparmor reload
$ sudo /etc/init.d/slapd restart

Problemes amb dn llargs i sortida de l'ordre ldapsearch

Podeu utilitzar el codi:

$ perl -00 -pe 's/\n (\S)/$1/g'

Per exemple:

ldapsearch -LLL -x -h $ies_ldap_server_ip -b "ou=Alumnes,ou=All,dc=iesebre,dc=com" "physicalDeliveryOfficeName=$line_codi_grup" dn | perl -00 -pe 's/\n (\S)/$1/g'

Backing up /etc/ldap/slapd.d/ in /var/backups/slapd-2.4.21-0ubuntu5... done. chown: no s’ha pogut accedir a «olcDbDirectory\nolcDbDirectory»: No such file or directory

El error el dona al actualitzar el sistema, al intentar configurar una actualització de slapd.

La solució es troba al comentari nº 11 de:

https://bugs.launchpad.net/ubuntu/+source/openldap/+bug/450645

Només cal esborrar o moure el fitxer:

/etc/ldap/slapd.d/cn=config/hdb.ldif~
# sudo -s
# cd /etc/ldap/slapd.d/cn=config
# mv olcDatabase\=\{1\}hdb.ldif~ ~

Com depurar, executar el servidor LDAP a mà en mode debug

Amb l'opció -d 16383:

# slapd -d 16383 -h 'ldap:/// ldapi:///' -g openldap -u openldap -F /etc/ldap/slapd.d/

Canviar la paraula de pas de rootdn

IMPORTANT: Amb les noves versions d'ubuntu no proveu de fer un dpkg-reconfigure slapd ja que us esborrarà la configuració que teniu i posarà la configuració per defecte que hi ha un cop s'acab d'instal·lar el servidor Ldap per primer cop

Si sabeu l'antiga paraula de pas us podeu connectar al servidor Ldap amb ADS obtenint la paraula de pas xifrada amb ldappasswd.

Si no sabeu la paraula de pas:

No funcionen el paràmetres BINDDN al fitxer /etc/ldap/ldap.conf

Al manual del fitxer ldap.conf:

$ man ldap.conf

Diu:

Some options are user-only. Such options are ignored if present in the ldap.conf (or file specified by LDAPCONF). 

Algunes opcions doncs no és poden utilitzar a /etc/ldap/ldap.conf i només es poden utilitzar als fitxer ~/ldaprc or ~/~ldaprc.

BINDN és un dels paràmetres que és user-only.

Error al final de dpkg-reconfigure slapd

Si al acabar d'executar sudo dpkg-reconfigure slapd obtenim el següent error

$ sudo dpkg-reconfigure slapd
Stopping OpenLDAP: slapd.
  Moving old database directory to /var/backups:
  There are leftover files in /var/lib/ldap. This will probably break
  creating the initial directory. If that's the case please move away
  stuff in there and retry the configuration.
..............................

Després segurament tindrem problemes amb LDAP. Si volem reconfigurar el que hem de fer és feu una copia de la base de dades ldap (carpeta /var/lib/ldap) i abans d ereconfigurar esborrar la base de dades:

$ sudo rm -rf /var/lib/ldap/*

Al executar dpkg-reconfigure amb slapd cal fixar-se que al final no hi hagi cap problema. Les següents linies mostren una sortida de dpkg-reconfigure correcta:

$ sudo dpkg-reconfigure slapd
 Stopping OpenLDAP: slapd.
 Creating initial slapd configuration... done.
 Creating initial LDAP directory... done.
 Starting OpenLDAP: running BDB recovery, slapd. 


ldap_bind: Confidentiality required (13) additional info: confidentiality required

Si executem una comanda com:

$ldapadd -x -h localhost -D "cn=admin" -W -f exemple.ldif
Enter LDAP Password:
ldap_bind: Confidentiality required (13)
      additional info: confidentiality required

a un servidor segur obtenim un error. Cal posar el host com una url segura:


$ldapadd -x -H "ldaps://localhost" -D "cn=admin" -W -f exemple.ldif
Enter LDAP Password:
ldap_bind: Confidentiality required (13)
      additional info: confidentiality required

Les consultes tornen un màxim de 500 registres

IMPORTANT: Oco que no tingueu dos valors al mateix temps!!! Per exemple jo també m'he trobat aquest valor configurat a:

olcDatabase={-1}frontend,cn=config

Cal canviar el paràmetre del servidor sizelimit (o amb la nova configuració: olcsizelimit).. L'he canviat accedint amb l'usuari cn=admin,cn=config i utilitzant ADS al servidor i modificant l'atribut sizelimit de l'entrada:

DN: olcDatabase={-1}frontend,cn=config

IMPORTANT: La mida màxima del paràmetres és 65435!!! No poseu més per que no servirà de res, al contrari no us funcionarà

syncrepl new superior not found

Executant slapd en mode debug:

$ sudo slapd -d 16383 -h 'ldap:/// ldapi:///' -g openldap -u openldap -F /etc/ldap/slapd.d/
...
hdb_modrdn: wr to children of entry ou=people,ou=curs 2,ou=desenvolupament i aplicació de projectes de construcció,ou=edificació i obra 
civil,ou=alumnes,ou=all,dc=iesebre,dc=com OK
hdb_modrdn: parent dn=ou=people,ou=Curs 2,ou=Desenvolupament i aplicació de projectes de construcció,ou=Edificació i obra civil,ou=Alumnes,ou=All,dc=iesebre,dc=com
hdb_modrdn: new parent "ou=people,ou=Grup A,ou=Curs 2,ou=Desenvolupament i aplicació de projectes de construcció,ou=Edificació i obra civil,ou=Alumnes,ou=All,dc=iesebre,dc=com" requested...
bdb_dn2entry("ou=people,ou=grup a,ou=curs 2,ou=desenvolupament i aplicació de projectes de construcció,ou=edificació i obra civil,ou=alumnes,ou=all,dc=iesebre,dc=com")
=> hdb_dn2id("ou=people,ou=grup a,ou=curs 2,ou=desenvolupament i aplicació de projectes de construcció,ou=edificació i obra civil,ou=alumnes,ou=all,dc=iesebre,dc=com")
<= hdb_dn2id: get failed: DB_NOTFOUND: No matching key/data pair found (-30988)
hdb_modrdn: newSup(ndn=ou=people,ou=grup a,ou=curs 2,ou=desenvolupament i aplicació de projectes de construcció,ou=edificació i obra  civil,ou=alumnes,ou=all,dc=iesebre,dc=com) not here!
send_ldap_result: conn=-1 op=0 p=3
send_ldap_result: err=32 matched="" text="new superior not found"

Solucionat a la versió 2.3.28:

OpenLDAP 2.3.28 Release
       Fixed slapd syncrepl modrdn new superior (ITS#4695)

A Ubuntu 10.4 hi ha:

$ dpkg -l | grep slapd
ii  slapd                            2.4.21-0ubuntu5                   OpenLDAP server (slapd)


Error al actualitzar slapd Ubuntu Server 10.10

$ sudo apt-get upgrade
...
S'està configurant slapd (2.4.21-0ubuntu5.3) ...
 Backing up /etc/ldap/slapd.d/ in /var/backups/slapd-2.4.21-0ubuntu5... done.
chown: no s’ha pogut accedir a «olcDbDirectory\nolcDbDirectory»: No such file or directory
dpkg: s'ha produït un error en processar slapd (--configure):
el subprocés installed post-installation script retornà el codi d'eixida d'error 1

Vegeu també

Enllaços externs