{"id":247,"date":"2004-11-01T01:16:43","date_gmt":"2004-10-31T23:16:43","guid":{"rendered":"http:\/\/www.marblestation.com\/blog\/?p=247"},"modified":"2012-04-26T18:43:42","modified_gmt":"2012-04-26T16:43:42","slug":"libreta-de-direcciones-compartida-con-openldap","status":"publish","type":"post","link":"https:\/\/www.marblestation.com\/?p=247","title":{"rendered":"Libreta de direcciones compartida con OpenLDAP"},"content":{"rendered":"<p>LDAP (Lightweight Directory Access Protocol) es un protocolo de acceso a servicios de directorio. Un directorio es similar a una base de datos pero con informaci\u00f3n basada en atributos que no cambia frecuentemente y sobre la cual no es necesario hacer consultas complejas. En un directorio la lectura de informaci\u00f3n es muy r\u00e1pida.<\/p>\n<p>La informaci\u00f3n de un directorio puede ser almacenada de diversas formas (backends), lo importante es que con LDAP podemos acceder a dicha informaci\u00f3n e incluso mantener servidores secundarios con replicas que se actualizan periodicamente (as\u00ed podriamos equilibrar la carga del servicio).<\/p>\n<p>LDAP podr\u00eda cubrir perfectamente funciones muy \u00fatiles en una intranet como por ejemplo identificaci\u00f3n de usuario centralizada (antiguamente se utilizaba NIS en entornos UNIX pero es menos seguro y eficiente), as\u00ed los usuarios podrian acceder a diversos servicios con un \u00fanico login\/password y la gesti\u00f3n de los mismos ser\u00eda muchisimo m\u00e1s sencilla para los administradores. Tambi\u00e9n podria proporcionarnos un servici\u00f3 de libreta de direcciones centralizado de forma que desde varios PCs podamos acceder siempre a nuestra agenda de contactos, esto ser\u00e1 lo que explicar\u00e9 en este art\u00edculo.<br \/>\n<!--more--><br \/>\n<a href=\"http:\/\/www.openldap.org\/\">OpenLDAP<\/a> es una implementaci\u00f3n libre de un servidor LDAP junto a sus respectibas utilidades y librer\u00edas para acceder al mismo. El servidor dispone de diversos backends para almacenar la informaci\u00f3n del directorio, el m\u00e1s recomendable es BDB (Berkeley DB 4) y ser\u00e1 el que especificaremos en el archivo de configuraci\u00f3n. La informaci\u00f3n en LDAP se guarda orientada a objetos y por tanto se deja a un lado el paradigma relacional t\u00edpico de las bases de datos habituales (MySQL, PostgreSQL,&#8230;).<\/p>\n<p>Para instalar el servidor OpenLDAP en Ubuntu basta con ejecutar &#8220;aptitude install slapd&#8221;. Esto nos crear\u00e1 los archivos de configuraci\u00f3n en &#8220;\/etc\/ldap\/&#8221;, ah\u00ed ser\u00e1 donde encontraremos el fichero de configuraci\u00f3n del servidor &#8220;slapd.conf&#8221;. Este fichero estar\u00e1 compuesto por 3 secciones:<\/p>\n<ol>\n<li>Configuraci\u00f3n global<\/li>\n<li>Definici\u00f3n de backends<\/li>\n<li>Definici\u00f3n de bases de datos<\/li>\n<\/ol>\n<p>Cada una de las secciones herdar\u00e1 la configuraci\u00f3n de su secci\u00f3n anterior.<\/p>\n<p><b>SECCI\u00d3N GLOBAL<\/b><\/p>\n<p>Como ya he comentado, la informaci\u00f3n en LDAP es tratada como objetos y por tanto estos objetos deben ser definidos. Las definiciones de objetos se guardan en lo que se llama esquemas (schema), por defecto OpenLDAP incluye algunos est\u00e1ndar como podemos ver en su archivo de configuraci\u00f3n:<\/p>\n<pre>\r\ninclude         \/etc\/ldap\/schema\/core.schema\r\ninclude         \/etc\/ldap\/schema\/cosine.schema\r\ninclude         \/etc\/ldap\/schema\/nis.schema\r\ninclude         \/etc\/ldap\/schema\/inetorgperson.schema\r\n<\/pre>\n<p>En nuestro caso queremos tener una libreta de direcciones almacenada y por tanto necesitamos objetos que dispongan de los atributos que necesitamos. Utilizar\u00e9 evolution como cliente de correo (tambi\u00e9n veremos que es posible usar mutt o squirrelmail) y por tanto me bajar\u00e9 el esquema que este cliente utiliza: <a href=\"http:\/\/www.linuxchange.com\/download\/Mandrake%20Official%2010\/openldap\/evolutionperson.schema\">evolutionperson.schema<\/a>. Lo guardaremos en &#8220;\/etc\/ldap\/schema\/&#8221; y lo incluiremos en el archivo de configuraci\u00f3n:<\/p>\n<pre>\r\ninclude         \/etc\/ldap\/schema\/evolutionperson.schema\r\n<\/pre>\n<p>El servidor OpenLDAP soporta la versi\u00f3n 2 y 3 de LDAP aunque por defecto la 2 viene desactivada, en cambio Evolution solo entiende la versi\u00f3n 2. Por tanto vamos a activar en nuestro servidor dicha versi\u00f3n a\u00f1adiendo (o descomentando) a nuestro archivo de configuraci\u00f3n:<\/p>\n<pre>\r\nallow bind_v2\r\n<\/pre>\n<p>Si quisieramos habilitar el acceso al directorio utilizando SSL podriamos generar un certificado firmado (ver art\u00edculo <a href=\"http:\/\/www.midominio.com\/blog\/index.php?p=245\">OpenSSL<\/a>) y especificarlo en la configuraci\u00f3n:<\/p>\n<pre>\r\n### SSL-certificates\r\nTLSCACertificateFile \/etc\/ssl\/midominioCA\/MSca.crt\r\nTLSCertificateFile \/etc\/ssl\/certs\/saturno.crt\r\nTLSCertificateKeyFile \/etc\/ssl\/private\/saturno.key\r\n<\/pre>\n<p>Por desgracia no he conseguido que Evolution se conecte correctamente desde otra m\u00e1quina por red usando SSL (desde la misma m\u00e1quina si funciona). Por tanto tendremos que utilizar LDAP sin encriptaci\u00f3n y asumir los riesgos que puede tener que viaje nuestro password en claro por la red y el resto de la informaci\u00f3n (en este caso solo se trata de una libreta de direcciones as\u00ed que no es informaci\u00f3n extremadamente sensible). En mi configuraci\u00f3n he deshabilitado estas l\u00edneas.<\/p>\n<p><b>DEFINICI\u00d3N DE BACKENDS<\/b><\/p>\n<p>Para guardar la informaci\u00f3n del directorio se usar\u00e1 BDB que es la m\u00e1s recomendable, por defecto en la configuraci\u00f3n ya est\u00e1 seleccionada as\u00ed que no tendremos que modificar nada.<\/p>\n<p><b>DEFINICI\u00d3N DE BASES DE DATOS<\/b><\/p>\n<p>Comentaremos las definiciones que haya de ejemplo y crearemos una nueva donde almacenaremos nuestra libreta de direcciones (se pueden definir tantas bases de datos como se deseen).<\/p>\n<pre>\r\n\r\nindex       objectClass eq\r\n<\/pre>\n<p>Nuestra base de datos utilizar\u00e1 el backend BDB definido en la secci\u00f3n anterior.<\/p>\n<pre>\r\ndatabase    bdb\r\n<\/pre>\n<p>Haremos que no sea de solo lectura y que por tanto podamos escribir.<\/p>\n<pre>\r\nreadonly    off\r\n<\/pre>\n<p>Toda base de dato debe tener un nombre que la identifica (DN, Distinguished Name) de forma iinequivoca dentro del servicio LDAP, habitualmente se utiliza el nombre + domino de la m\u00e1quina donde se esta ejecutando el servidor:<\/p>\n<pre>\r\nsuffix      \"dc=midominio, dc=net\"\r\n<\/pre>\n<p>A continuaci\u00f3n definiremos el administrador de esta base, este estar\u00e1 compuesto por un nombre indentificativo (CN, Common Name) seguido del nombre que identifica la base:<\/p>\n<pre>\r\nrootdn      \"cn=Manager, dc=midominio, dc=net\"\r\nrootpw      {SSHA}EkYH40JShOF8j4UlIsb1d\/mNQsUhR0TT\r\n#rootpw      secret\r\n<\/pre>\n<p>El password del administrador se puede escribir en claro en el archivo de configuraci\u00f3n o utilizar el comando &#8220;slappasswd -s &#60;password>&#8221; para generar un password encriptado y as\u00ed evitar tenerlo a la vista en el archivo.<\/p>\n<p>A continuaci\u00f3n indicaremos donde queremos que se guarden los datos en nuestra estructura de directorios:<\/p>\n<pre>\r\ndirectory   \"\/var\/lib\/ldap\/addressbook\"\r\n<\/pre>\n<p>Debemos asegurarnos que este directorio existe, de lo contrario lo creamos con &#8220;mkdir -p \/var\/lib\/ldap\/addressbook\/&#8221;.<\/p>\n<p>De forma opcional, podemos a\u00f1adir indices que ayudar\u00e1n a optimizar las b\u00fasquedas a trav\u00e9s de los atributos:<\/p>\n<pre>\r\nindex       objectClass eq\r\n<\/pre>\n<p>Finalmente podriamos especificar las reglas de acceso a esta base de datos:<\/p>\n<pre>\r\naccess to *\r\n        by dn=\"cn=Manager, dc=midominio, dc=net\" write\r\n        by * none\r\n<\/pre>\n<p>Esto indica que para acceder a cualquier sitio si:<\/p>\n<ul>\n<li>Somos el administrador de la base de datos -> podemos escribir<\/li>\n<li>Si no somos el administrador -> no podemos hacer nada<\/li>\n<\/ul>\n<p>Por tanto solo estoy permitiendo que yo como administrador pueda acceder a mi base de datos y que nadie m\u00e1s pueda conectarse an\u00f3nimamente ni para leer. Es posible que nos pueda interesar que el resto de personas puedan leer (libreta de direcciones p\u00fablica), en dicho caso usariamos:<\/p>\n<pre>\r\naccess to *\r\n        by dn=\"cn=Manager, dc=midominio, dc=net\" write\r\n        by * read\r\n<\/pre>\n<p>Podriamos escribir varias reglas access seguidas, se interpretarian de forma secuencial.<\/p>\n<p>Y aqu\u00ed ha finalizado la configuraci\u00f3n del servidor OpenLDAP, por tanto ya podriamos iniciarlo:<\/p>\n<pre>\r\n\/etc\/init.d\/slapd start\r\n<\/pre>\n<p>Si quisiesemos hacer un arranque manual para poder ver los posibles errores o problemas podriamos iniciar el servidor con:<\/p>\n<pre>\r\nslapd -4 -d -1 -f \/etc\/ldap\/slapd.conf -h \"ldaps:\/\/\/\"\r\n<\/pre>\n<p>El siguiente paso consiste en crear un objeto en la base de datos que pueda contener otros objetos, es decir, una especie de contenedor donde podremos crear todos los objetos correspondientes a nuestros contactos de la libreta de direcciones. Para a\u00f1adir informaci\u00f3n al servidor LDAP se debe utilizar ficheros en formato LDIF (LDAP Data Interchange Format) que tienen el siguiente aspecto:<\/p>\n<pre>\r\ndn: dc=midominio, dc=net\r\nobjectclass: top\r\nobjectclass: dcObject\r\nobjectclass: organization\r\no: Marble Station\r\ndc: midominio\r\n\r\ndn: ou=addressbook, dc=midominio, dc=net\r\nobjectclass: top\r\nobjectclass: organizationalUnit\r\nou: addressbook\r\n<\/pre>\n<p>Este fichero LDIFF (llamemoslo addressbook.ldif) define en primer lugar la ra\u00edz de nuestra base de datos &#8220;dc=midominio, dc=net&#8221;, cumplir\u00e1 las especificaciones de clase top, dcObject y organization. Tendr\u00e1 en el atributo descripci\u00f3n (o) el valor &#8220;Marble Station&#8221; y  en el atributo &#8220;dc&#8221; el nombre corto que le corresponde (como el DN es &#8220;dc=midominio, dc=net&#8221;, cogeremos dc=midominio).<\/p>\n<p>En segundo lugar estamos definiendo un objeto dentro de nuestra base de datos, este objeto se llamar\u00e1 &#8220;addressbook&#8221; y ser\u00e1 del tipo organizationalUnit (ou) y aqu\u00ed ser\u00e1 donde crearemos los objetos de nuestra libreta de contactos (un objeto por contacto).<\/p>\n<p>Si guardamos esta informaci\u00f3n en un fichero llamado &#8220;addressbook.ldif&#8221; lo podremos insertar en LDAP usando:<\/p>\n<pre>\r\nldapadd -x -W -D 'cn=Manager, dc=midominio, dc=net' -f addressbook.ldif -H \"ldap:\/\/midominio.net\"\r\n<\/pre>\n<p>El par\u00e1metro -D nos permite establecer con que usuario nos queremos conectar, el -W har\u00e1 que se nos pregunte el password. Si todo ha ido correctamente ya tendremos nuestro servidor listo para agregar contactos.<\/p>\n<p>Podriamos agregar contactos utilizando el mismo m\u00e9todo con ficheros LDIF, por ejemplo podriamos crear un fichero llamado &#8220;contacto.ldif&#8221;:<\/p>\n<pre>\r\ndn: cn=Sergio Blanco Cuaresma,ou=addressbook,dc=midominio,dc=net\r\ncn: Sergio Blanco Cuaresma\r\nsn: Cuaresma\r\nmail: correo@trabajo.com\r\nmail: correo@casa.com\r\ntelephoneNumber: 977556984\r\nhomePhone: 977236587\r\nmobile: 696587423\r\no: Marble Station\r\nou: Saturno\r\ntitle:: U2XDsW9y\r\nbusinessRole:: SW5nZW5pZXJvIEluZm9ybcOhdGljbw==\r\npostalAddress:: UmFtYmxhIE5vdmEgbsK6IDMzJFRhcnJhZ29uYSwgQ2F0YWx1bnlhJDQzMDA5JE\r\n VzcGHDsWE=\r\nhomePostalAddress:: QXYvIENhdGFsdW55YSBuwrogNSRUYXJyYWdvbmEsIENhdGFsdW55YSQ0Mz\r\n AwOCRFc3Bhw7Fh\r\nlabeledURI: http:\/\/www.marblestation.com\r\ndisplayName: Marble\r\nbirthDate: 2005-06-23\r\nfileAs: Cuaresma, Sergio\r\ncategory: Amigo\r\nobjectClass: top\r\nobjectClass: person\r\nobjectClass: organizationalPerson\r\nobjectClass: inetOrgPerson\r\nobjectClass: evolutionPerson\r\n<\/pre>\n<p>Y a\u00f1adirlo con:<\/p>\n<pre>\r\nldapadd -x -W -D 'cn=Manager, dc=midominio,dc=net' -f contacto.ldif -H \"ldap:\/\/midominio.net\"\r\n<\/pre>\n<p>Pero tener que trabajar as\u00ed es muy inc\u00f3modo y lo mejor ser\u00e1 hacerlo desde el propio cliente de correo Evolution. Antes de nada solo destacar que para acceder o modificar el contenido de un servidor LDAP se puede realizar de 2 formas:<\/p>\n<ul>\n<li>On-line: El servidor esta corriendo y se realizan los cambios utilizando los comandos ldap*, en este caso es posible realizar las acciones por red pero es lento si queremos importar grandes cantidades de informaci\u00f3n. Tambi\u00e9n disponemos de una buena herramienta gr\u00e1fica escrita en Java para acceder al servidor y administrarlo: <a href=\"http:\/\/www-unix.mcs.anl.gov\/~gawor\/ldap\/\">LDAP Browser\/Editor<\/a>.<\/li>\n<li>Off-line: El servidor debe estar parado y se utilizar\u00e1n los comando slap*, estos trabajaran directamente con los ficheros guardados en disco (\/usr\/lib\/ldap\/addressbook\/) y por tanto el tratamiento es mucho m\u00e1s r\u00e1pido.<\/li>\n<\/ul>\n<p>Vamos a configurar nuestro cliente de correo Evolution 2.0 para acceder a la libreta de direcciones. Nos vamos a la secci\u00f3n de contactos (en la parte inferior izquierda) y pulsamos &#8220;Nuevo -> Nueva libreta de direcciones&#8221; (parte superior izquierda). En la nueva ventana que aparece definiremos:<\/p>\n<ol>\n<li> Pesta\u00f1a General:<br \/>\nNombre: Libreta<br \/>\nServidor: midominio.net<br \/>\nPuerto: 389<br \/>\nUsar conexi\u00f3n segura: Nunca<br \/>\nM\u00e9todo de inicio de sesi\u00f3n: Usando &#60;&#60;Nombre Distintivo>> (ND)<br \/>\nInicio de sesi\u00f3n: cn=Manager, dc=midominio, dc=net\n<\/li>\n<li>Pesta\u00f1a Detalles:<br \/>\nBase de b\u00fasqueda: ou=addressbook, dc=midominio, dc=net\n<\/li>\n<\/ol>\n<p>Pulsamos aceptar y nos aparecer\u00e1 en el listado de libretas, ahora podemos seleccionarla y a\u00f1adir contactos en la parte derecha de la ventana haciendo doble click o con el bot\u00f3n derecho. Si ya teniamos contactos en otras libretas de direcciones locales, podemos arrastralas a la nueva para que se copien. Una vez hayamos a\u00f1adido contactos, es posible que sea necesario pulsar &#8220;vaciar&#8221; para que se listen todos los contactos disponibles en el servidor.<\/p>\n<p>Por si necesitamos realizar comprobaciones, con el comando &#8220;slapcat&#8221; podremos ver el contenido de nuestro servidor LDAP en formato LDIFF.<\/p>\n<p>Ahora ya podemos disfrutar de una libreta de direcciones centralizada que adem\u00e1s podremos acceder desde otros clientes de correo, como por ejemplo el cliente de correo de consola <a href=\"http:\/\/www.marblestation.com\/blog\/index.php?p=246\">mutt<\/a>. Para poder acceder con mutt utilizaremos un <a href=\"http:\/\/wwwhome.cs.utwente.nl\/~meentr\/mutt-ldap.html\">script en perl<\/a> llamado llamado <a href=\"http:\/\/wwwhome.cs.utwente.nl\/~meentr\/mutt_ldap_query\">mutt_ldap_query<\/a>. En mi caso lo he modificado para definir el servidor:<\/p>\n<pre>\r\nmy $ldap_server = \"midominio.net\";\r\nmy $BASEDN = \"ou=addressbook, dc=midominio, dc=net\";\r\n<\/pre>\n<p>Y adem\u00e1s he modificado la l\u00ednea 60 para que el comando de b\u00fasqueda se realice con el administrador &#8220;-D &#8216;cn=Manager, dc=midominio, dc=net'&#8221; y el password &#8220;-w &#8216;secret'&#8221;:<\/p>\n<pre>\r\nmy $command = \"ldapsearch -w 'secret' -D 'cn=Manager, dc=midominio, dc=net' -h $ldap_server -b '$BASEDN' -x '(|$query)'\" .\r\n                  \" sn cn givenName mail telephoneNumber\";\r\n<\/pre>\n<p>A continuaci\u00f3n guardo el script en &#8220;\/usr\/local\/bin\/mutt_ldap_query&#8221; con permisos solo para mi usuario del sistema y en la configuraci\u00f3n de mutt de ese mismo usuario a\u00f1adimos:<\/p>\n<pre>\r\nset query_command = \"\/usr\/local\/bin\/mutt_ldap_query '%s'\"\r\n<\/pre>\n<p>Ahora ya podemos ejecutar mutt y pulsar &#8216;Q&#8217;, introducimos un nombre y pulsamos enter para que realice la b\u00fasqueda en el servidor LDAP.<\/p>\n<p>Incluso podemos configurar el webmail <a href=\"http:\/\/www.squirrelmail.org\/\">squirelmail<\/a> para que acceda a un servidor LDAP para consultar la agenda.<\/p>\n<p>Cabe destacar que tanto desde mutt como desde squirrelmail no vamos a poder modificar la agenda, solo consultarla.<\/p>\n<p>* Fuentes de informaci\u00f3n:<br \/>\n<a href=\"http:\/\/linux.cudeso.be\/linuxdoc\/ldap.php\">LDAP Outlook\/Evolution<\/a><br \/>\n<a href=\"http:\/\/www.tldp.org\/HOWTO\/LDAP-HOWTO\/\">LDAP HOWTO<\/a><br \/>\n<a href=\"http:\/\/www.padl.com\/OSS\/pam_ldap.html\">PAM LDAP: Autentificaci\u00f3n centralizada de usuario UNIX<\/a><br \/>\n<a href=\"http:\/\/www.openldap.org\/\">OpenLDAP<\/a><br \/>\n<a href=\"http:\/\/www.metaconsultancy.com\/whitepapers\/ldap.htm\">Using LDAP<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>LDAP (Lightweight Directory Access Protocol) es un protocolo de acceso a servicios de directorio. Un directorio es similar a una base de datos pero con informaci\u00f3n basada en atributos que no cambia frecuentemente y sobre la cual no es necesario hacer consultas complejas. En un directorio la lectura de informaci\u00f3n es muy r\u00e1pida. La informaci\u00f3n &hellip; <a href=\"https:\/\/www.marblestation.com\/?p=247\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">Libreta de direcciones compartida con OpenLDAP<\/span> <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1,6],"tags":[],"class_list":["post-247","post","type-post","status-publish","format-standard","hentry","category-espanyol","category-tecnologia"],"_links":{"self":[{"href":"https:\/\/www.marblestation.com\/index.php?rest_route=\/wp\/v2\/posts\/247","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.marblestation.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.marblestation.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.marblestation.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.marblestation.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=247"}],"version-history":[{"count":1,"href":"https:\/\/www.marblestation.com\/index.php?rest_route=\/wp\/v2\/posts\/247\/revisions"}],"predecessor-version":[{"id":1670,"href":"https:\/\/www.marblestation.com\/index.php?rest_route=\/wp\/v2\/posts\/247\/revisions\/1670"}],"wp:attachment":[{"href":"https:\/\/www.marblestation.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=247"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.marblestation.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=247"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.marblestation.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=247"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}