Curs: | SambasobreLDAP, LinuxAdministracioAvancada |
Fitxers: | Ldap1.pdf, Ldap2.pdf, AutenticacioiAutoritzacionsLinux.pdf |
Repositori SVN: | https://[email protected]/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).
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
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:
i més enlla d'aquí la organització es per departaments, grups de persones, recursos (), etc:
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
Són?:
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
TODO
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:
Si utilitzem syncrepl per tenir rèpliques d'un servidor Ldap, al servidor proveïdor (master) també tindreu una tercera base de dades:
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==
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
$ sudo apt-get install slapd ldap-utils
Si voleu tornar a configurar:
$ sudo dpkg-reconfigure slapd
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 ...
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
La instal·lació no presenta cap diferencia important respecte a les versions anteriors.
Consulteu: http://www.iesebre.com/manteniment/index.php/LDAP#Instal.C2.B7laci.C3.B3
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 MD5dn: 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"
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ésObserveu 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.
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
Per instal·lar slapd hem d'executar:
$ sudo apt-get install slapd
Durant la instal·lació ens preguntara el password de l'administrador Ldap.
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
Executeu:
$ cd $ wget -N --http-user=anonymous --http-password= http://[email protected]/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"
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
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
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:
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...
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
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.
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/
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
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
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.
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:
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.
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.
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:
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:
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:
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:
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:
TODO
Recursos:
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:
Permet comprovar l'accés a una sèrie d'atributs.
Consulteu: Ldap#ACLs_i_usuaris
Recursos:
Consulteu la secció Ldap de l'article SkoleLinux.
Recursos:
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) $ [email protected]:/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
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:
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
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:
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:
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:
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:
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.
sudo -s cd /etc/ldap/slapd.d/cn=config scp -r cn=schema AdreçaIPEsclau:/tmp exit
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.
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 ...
Consulteu #S'esborra tota la replica menys l'objecte principal
Consulteu #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.
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 [email protected]8:/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
$ 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
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
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).
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
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
É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
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.
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.
Podem trobar alguns exemples a:
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.
Podem executar la següent comanda per comprovar si està instal·lat el servidor ldap:
$ ldapsearch -x -b -s base '(objectclass=*)' namingContexts
On:
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:
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:
Consulteu base64.
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
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
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:
En el nostres cas el problema era que al ldif no havíem posat el dn dels objectes!! (estàvem posant cn).
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
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
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.
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)
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:
$ ldapwhoami -H ldap://localhost -D "cn=admin,dc=dominiescollit,dc=com" -X
$ ldapwhoami -H ldap://ipremota -D "cn=admin,dc=dominiescollit,dc=com" -X
Es pot desactivar l'accés anònim amb l'opció:
disallow bind_anon
Que s'ha de posar al fitxer slapd.conf.
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
Hi han dos mètodes per accedir amb una connexió segura al servidor Ldap:
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:
$ cat /etc/services | grep ldap ldap 389/tcp # Lightweight Directory Access Protocol ldap 389/udp ldaps 636/tcp # LDAP over SSL ldaps 636/udp
$ 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).
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:
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
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:
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)
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)
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:
Podem comprovar el suport de SASL del nostre servidor Ldap amb la comanda:
$ ldapsearch -h localhost -p 389 -x -b "" -s base -LLL supportedSASLMechanisms
Consulteu l'article sobre Moodle l'apartat http://acacha.dyndns.org/mediawiki/index.php/Moodle#Integraci.C3.B3_amb_ldap_.28skolelinux.29.
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.
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
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
Alguns dels esquemes més habituals són:
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.
IMPORTANT: Vegeu també: SNMP#SNMP_OIDS
Al definir un atribut Ldap cal indicar a l'esquema:
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: [email protected] 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 [email protected] 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:
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.
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.
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:
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 ")"
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 ) )
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 ) )
$ cat schema_convert.conf include /etc/ldap/schema/stuff.schema
$ sudo nano convert_schemas.sh
mkdir ldif_result slaptest -f schema_convert.conf -F ldif_result
$ chmod +x convert_schemas.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
$ 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
$ sudo /etc/init.d/slapd restart
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
Primer cal crear el directori del plugin.
$ sudo mkdir -p /usr/share/gosa/plugins/admin/stuff/
<?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: ?>
<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>
<plugin acl="stuff" class="stuffManagement" />
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:
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
Consulteu GoSA
posixAccount ObjectClasses:
TODO
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.
Vegeu també slapacl
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:
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:
http://www.openldap.org/doc/admin24/tuning.html#Caching
Vegeu també els següents apartats:
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]]
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.
$ 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.
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
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
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:
$ 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
Consulteu l'article LdapScripts.
Veieu l'article Phpldapadmin.
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
Integra phpldapadmin
Consulteu l'article sobre LAM
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:
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:
Consulteu la secció Ldap Webmin de l'article sobre Webmin.
Consulteu l'article sobre Gosa.
Veieu l'article sobre Apache Directory Studio.
Aplicacions lliures “Ldap Aware”:
Multiplataforma:
Linux
Aplicacions Ldap d'administració client
Recursos:
Recursos:
Consulteu l'article Exemple configuració servidor LDAP. Aula Linux.
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:
Sovint és típic confondre els atributs:
Recursos:
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]].
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.
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:
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
#!/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:
Consulteu l'article libpam-ldap.
Consulteu l'article libnss-ldap.
Consulteu PHP i Ldap.
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 [email protected]:/etc/ldap /etc # sudo mv /var/lib/ldap/ /var/lib/ldap.original # rsync -e ssh -cavz [email protected]:/var/lib/ldap /var/lib # exit $ sudo /etc/init.d/slapd start
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 [email protected]:/var/lib/ldap /var/lib $ sudo scp -pr [email protected]:/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 [email protected]:/etc/ssl/certs/slapd-ca-cert.pem /etc/ssl/certs/ $ sudo scp -pr [email protected]:/etc/ssl/certs/slapd-server.crt /etc/ssl/certs/ $ sudo scp -pr [email protected]:/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/
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 [email protected]:/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 [email protected]:/etc/ssl/certs/slapd-ca-cert.pem /etc/ssl/certs/ $ sudo scp -pr [email protected]:/etc/ssl/certs/slapd-server.crt /etc/ssl/certs/ $ sudo scp -pr [email protected]:/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 es capaç de fer copies de Seguretat de Ldap.
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.
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:
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.
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:
Vegeu syncrepl
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
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:
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:
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:
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.
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: [email protected] 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.
El format més utilitzat de backend són les bases de dades Berkeley DB:
Consulteu Berkeley DB
Vegeu:
http://www.zytrax.com/books/ldap/ch6/bdb.html
Consulteu Apache#Autenticaci.C3.B3_amb_Ldap
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:
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
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
Jo no conec cap forma simple de fer-ho. El procediment complet seria:
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 [email protected]:~/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.
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#[email protected]:/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 ]
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
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
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.
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
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
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.
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
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'
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~ ~
Amb l'opció -d 16383:
# slapd -d 16383 -h 'ldap:/// ldapi:///' -g openldap -u openldap -F /etc/ldap/slapd.d/
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:
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.
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.
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
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à
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)
$ 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