Ldap

De SergiTurWiki

Share/Save/Bookmark
Dreceres ràpides: navegació, cerca
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 pot 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

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

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 10.4

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

Karmic Koala, Ubuntu 9.10

$ sudo apt-get install slapd
NOTA: Un cop instal·lat veureu que no hi ha fitxer /etc/ldap/slapd.conf!
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!

Si observeu el fitxer /etc/default/slapd:

# Location of the slapd configuration to use.  If using the cn=config
# backend to store configuration in LDIF, set this variable to the
# directory containing the cn=config data; otherwise set it to the location
# of your slapd.conf file.  If empty, use the compiled-in default
# (/etc/ldap/slapd.d).
SLAPD_CONF=

És a dir que per defecte la configuració es troba a:

/etc/ldap/slapd.d

La carpeta només és accessible per a l'usuari openldap (o per a root):

$ sudo -s
# cd /etc/ldap/slapd.d

Consulteu el fitxers que hi ha dins:

$ ls -la
total 16
drwxr-x--- 3 openldap openldap 4096 2010-06-18 20:31 .
drwxr-xr-x 8 root     root     4096 2010-06-18 20:31 ..
drwxr-x--- 3 openldap openldap 4096 2010-06-18 20:31 cn=config
-rw-r----- 1 openldap openldap  407 2010-06-18 20:31 cn=config.ldif

Fixeu-vos que els fitxers que hi ha qui dins han de ser de l'usuari openldap. La configuració de Ldap ara es guarda dins el propi arbre del servidor Ldap al node cn=config. Entre dins la carpeta cn=config:

# cd cn\=config
# ls
cn=schema  cn=schema.ldif  olcDatabase={0}config.ldif  olcDatabase={-1}frontend.ldif

A qui hi ha més configuracions bàsiques del servidor. Una de les carpetes més importants és cn=schema, a on col·locarem els esquemes.

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

#  cd /etc/ldap
# sudo mkdir configuracioInicial

Només l'squema 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

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

# joe db.ldif
NOTA: Canvieu iesebre pel nom del vostre domini
###########################################################
# 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

Ara cal crear l'arrel del servidor LDAP i l'usuari admin. Abans cal aconseguir una paraula de pas en MD5

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

Creeu un altre fitxer:

$ 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: {MD5}sac71Y48I+13VRfWpQeibA==
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 modificar les ACL:

$ sudo joe config.ldif 
dn: cn=config
changetype: modify
delete: olcAuthzRegexp

dn: olcDatabase={-1}frontend,cn=config
changetype: modify
delete: olcAccess

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

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: {MD5}Gnmk1g3mcY6OWzJuM4rlMw==

dn: olcDatabase={0}config,cn=config
changetype: modify
delete: olcAccess
NOTA: Canvieu olcRootPW per la vostra paraula de pas en MD5
# 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={-1}frontend,cn=config"

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

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

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

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

I ara creeu un altre fitxer:

# joe acl.dif 
dn: olcDatabase={1}hdb,cn=config
add: olcAccess
olcAccess: to attrs=userPassword,shadowLastChange by dn="cn=admin,dc=iesebre,dc=com" write by anonymous auth by self write by * none
olcAccess: to dn.base="" by * read
olcAccess: 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.


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.

Imatge:Slapd.png

Imatge: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.

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

Imatge:SlapdConfiguration.jpg

Imatge:SlapdConfiguration1.jpg

Imatge:SlapdConfiguration2.jpg

Imatge:SlapdConfiguration3.jpg

Imatge:SlapdConfiguration4.jpg

Imatge:SlapdConfiguration5.jpg

Imatge:SlapdConfiguration6.jpg

Imatge: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

DIT del config

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:

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

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:

$ sudo /usr/sbin/slapindex
IMPORTANT: Crec que el servidor Ldap ha d'estar aturat

Només per a un atribut:

$ sudo /usr/sbin/slapindex uid

Amb la nova configuració és automàtic? Cal slapindex?

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

Recursos:

slapauth

TODO

Recursos:

slapadd

Permet afegir entrades a un servidor Ldap:

$ sudo slapadd -l ldif

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

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:

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

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:

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

Canvis al master (proveïdor):

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

$ 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 base dn del vostre servidor Ldap

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 }).

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 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:

Ldap#Instal.C2.B7laci.C3.B3

Només les opcions referents a syncrepl seran diferents. Creeu un fitxer anomenat consumer_sync.ldif, amb el següent contingut:

#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
NOTA: Heu de canviar els paràmetres que estan en negreta per tal d'adaptar-los a la vostra configuració.

Un cop tingueu el fitxer salvat:

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

O si heu canviat els permisos per accedir al config:

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

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

FAQ

Resolució de problemes

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:

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

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 funciona 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ó

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

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

  • Per Host Configuration: /etc/ldap/ldap.conf
  • Per User Configuration: ~/.ldaprc

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

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 esta 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 desde 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'

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

Podeu trobar exemples de com fer cerques complexes a:


Recursos:

ldapadd

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

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:

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'

Recursos:

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)

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

Configuració del servidor

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

Al fitxer /etc/ldap/slapd.conf hi ha un paràmetre loglevel 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 configurarel fitxer /etc/syslog per volcar elslogs de ldap a un fitxer específic.

loglevel

-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

Log level cn=nconfig

Esquemes

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

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

# 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

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:


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

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.

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 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:

Imatge:LdapServerClientAtrributes.png

Recursos:

Configuració d'un client GNU/Linux per autenticar amb Ldap

Consulteu l'article Configuració d'un client GNU/Linux per autenticar amb Ldap.

libpam-ldap

Consulteu l'article libpam-ldap.

libnss-ldap

Consulteu l'article libnss-ldap.

PHP i Ldap

Consulteu PHP i Ldap.

Vegeu també

Troubleshooting

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


Es pot fer directament a ADS obtenint la paraula de pas xifrada amb ldappasswd.

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

Cal canviar el paràmetre del servidor sizelimit (o amb la nova configuració: olcsizelimit).. L'he canviat accedint amb l'usuauri cn=admi,cn=config al servidor i modificant el attribute sizelimit a

DN: olcDatabase={-1}frontend,cn=config

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)


Recursos

IES Nicolau Copèrnic