A continuación describiré cómo instalar y configurar OpenLDAP. Si bien mi trabajo fue realizado en debian, no debería variar demasiado en otras distribuciones.
Instalación
En debian y derivados, instalar OpenLDAP es tan simple como ejecutar:
# apt-get install slapd ldap-utilsdonde slapd es el demonio que provee la funcionalidad ldap, y ldap-utils contiene un set de herramientas para administrar y testear el server.
Durante el proceso de instalación, el configurador del paquete (debconf) requerirá los siguientes datos básicos:
- Nombre DNS de nuestro dominio (ej: demasiadovivo.org).
- Nombre de la organización a utilizar en el DN base. En general utilizarán el mismo que el nombre DNS (ej: demasiadovivo.org).
- Contraseña del administrador.
- Base de datos de fondo para almacenar los datos LDAP. Si bien openLDAP acepta distintas bases de datos, es recomendable utilizar la de Berkeley (BDB) que no es una BD relacional, sino una que permite almacenar varios items por cada clave y logra mejor performance en casos de muchas lecturas y pocas escrituras. Todo esto encaja perfecto con LDAP, porque son justamente estos los atributos de un directorio.
- Remover la base de datos cuando el paquete slapd se purgue? es buena idea setear que no, así no borramos accidentalmente la base de datos LDAP.
- Permitir el protocolo LDAPv2? esto dependerá de los clientes que estemos utilizando. Dado que LDAPv3 ya esta muy maduro e implementado en la mayoría de los sistemas, lo mejor es decir no a esta pregunta.
Una vez instalado el paquete, podemos probar si el servidor se instaló y configuró correctamente, utilizando ldapsearch. ldapsearch es una herramienta que nos servirá mucho para testear la configuración del servidor y, como su nombre lo indica, sirve para hacer búsquedas dentro de directorio.
Para realizar la prueba, pediremos todos los objetos que se encuentren en el servidor:
ldapsearch -b dc=demasiadovivo,dc=org -H ldap://localhost -xdonde:
-b indica el DN base done iniciar la búsquedaComo no utilizamos ningún fitro y no indicamos qué atributos traer, ldapsearch traerá todo.
-H es para ingresar la URI del server
-x indica que utilice autenticación simple
ldap.conf
Para evitar tener que ingresar los datos referentes al DN base y la URI o dirección de servidor en cada conexión con el servidor ldap, podemos almacenar esta información en el archivo /etc/ldap.conf
ldap.conf se utiliza para configuraciones default concernientes a los clientes ldap. Los dos valores más utilizados son URI y BASE, que sirven justamente para lo explicado en el párrafo anterior. Un ejemplo de este archivo es el siguiente:
URI ldap://demasiadovivo.org ldaps://demasiadovivo.orgCon esto nos evitamos, por ejemplo, los parámetros -b y -H en ldapsearch =)
BASE dc=demasiadovivo,dc=org
Agregar, modificar, y eliminar entradas del directorio
Los datos LDAP son intercambiados utilizando un formato de texto plano denominado LDIF (LDAP Data Interchange Format). Utilizando archivos LDIF podemos agregar, modificar, elminar y renombrar entradas del directorio.
Cada entrada (registro) continee un conjunto de atributos y están separadas por líneas en blanco. Ya vimos ejemplos de este formato cuando utilizamos ldapsearch para testear el servicio.
Para editar la información del directorio, simplemente creamos un archivo ldif y utilizamos la herramienta ldapadd o ldapmodify. Para eliminar entradas, se utiliza ldapdelete.
En secciones anteriores vimos que la estructura del árbol del directorio se puede armar en base a unidades organizativas (organizational units - OU), algo muy común en sistemas de usuarios centralizado (Active Directory, y GNU/Linux con NSS-LDAP y PAM). Las OU básicas de un sistema de usuarios centralizado son People y Group. Podemos crear estas OUs utilizando un archivo ou.ldif que contenga:
dn: ou=People,dc=demasiadovivo,dc=orgy luego ejecutando ldapadd de la siguiente forma:
ou: People
objectClass: organizationalUnit
dn: ou=Group,dc=demasiadovivo,dc=org
ou: Group
objectClass: organizationalUnit
$ ldapadd -c -x -D cn=admin,dc=dvpem,dc=org -W -f ou.ldifdonde:
-c indica que continúe procesando si encuentra erroresComo se observa, con -x -D cn=admin,dc=dvpem,dc=org -W realizamos la autenticación con el usuario admin, dado que con acceso anónimo no es posible modificar registros de la base de datos. Más adelante veremos cómo autenticar utilizando SASL en lugar de autenticación simple.
-x indica que utilice autenticación simple
-D setea el DN con el cual realizar el bind (usuario de autenticación)
-W pide el password
-f permite importar los datos del archivo
Podemos ver el resultado ejecutando la siguiente búsqueda:
$ ldapsearch -x ou=People
$ ldapsearch -x ou=Group
Modificar la configuración
La configuración del servicio LDAP se almacena en el archivo slapd.conf, pero si se desea hacer cambios en en la misma, una vez que se actualiza dicho archivo, es necesario reiniciar el demonio slapd, algo que es muy contraproducente en un sistema que está en producción atendiendo cientos o miles de consultas. Por suerte, desde la versión 2.3 de OpenLDAP, es posible editar la configuración online. A partir de dicha versión, la configuración se almacena una base de datos separada, con un esquema y DIT predefinidos (cuyo base DN es cn=config), y la cual se encuentra en el directorio slapd.d (en debian /etc/ldap/slapd.d/). Esta base de datos posee administración en tiempo de ejecución a través de operaciones LDAP con datos en formato LDIF y se puede acceder y editar a través del conjunto de herramientas slapacl, slapadd, slapauth, slapcat, slapdn y slaptest.
Para ver las entradas de configuración, se puede utilizar slapcat de la misma manera que se utiliza ldapsearch. Por ejemplo, para ver la configuración de la base de datos, se debe ejecutar:
# slapcat -b cn=config -a olcDatabase=*donde -b indica el sufijo o DN base, y -a permite utilizar filtros.
De esta forma tenemos que la configuración del directorio se realiza a través de atributos en entradas del directorio, y la mayoría de estos comienzan con el prefijo "olc" (OpenLDAP configuration). Además, algunas de las entradas tienen nombres con números entre llaves ({}). Esto se debe a que ni las entradas, ni los atributos de un directorio tienen un orden específico, pero el orden es necesario para la configuración, porque existen dependencias. Los números en los nombres aseguran que la configuración se ejecute en el orden correspondiente, asegurando la consistencia. En general estos números se generan automáticamente a medida que se crean las entradas.
Control de acceso
En la configuración default de un OpenLDAP recién instalado existen dos permisos para acceder al directorio:
- utilizando el usuario admin que tiene control total. Este usuario está declarado en el DN base con cn=admin (por ej: cn=admin,dc=demasiadovivo,dc=org). La contraseña de este usuario se setea durante la instalación del directorio.
- acceso de lectura de cualquier entrada de forma anónima, es decir, sin ningún tipo de autenticación.
El acceso a las entradas del directorio se configura a través del atributo olcAccess, cuyo formato es:
olcAccess: <directiva acceso="" de="">donde la parte <what> selecciona las entradas y/o atributos a los cuales se aplica el acceso, <who> especifica que entidades tienen acceso, y <access> especifica el tipo de acceso otorgado. Se soportan múltiples tripletas <who> <access> <control>, permitiendo otorgar distinto tipo de acceso a distintas entidades.
olcAccess: <directiva acceso="" de="">
<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]
Para observar los accesos default de todas las bases de datos, basta con ejecutar:
# slapcat -b cn=config -a olcAccess=*Por ejemplo, ejecutando slapcat con el siguiente filtro es posible observar los accesos default a la base de datos principal:
# slapcat -b cn=config -a olcDatabase={1}hdbCon esta información se ve que los atributos userPassword (el password del usuario) y shadowLastChange (última fecha de modificación del password) tienen:
...
olcAccess: {0}to attrs=userPassword,shadowLastChange by self write by anonymous auth by dn="cn=admin,dc=demasiadovivo,dc=org" write by * none
olcAccess: {1}to dn.base="" by * read
olcAccess: {2}to * by self write by dn="cn=admin,dc=demasiadovivo,dc=org" write by * read
...
- acceso de escritura para el propio usuario (self) y para el administrador (dn="cn=admin,dc=demasiadovivo,dc=org")
- tiene acceso de lectura de forma anonima en caso de que se este realizando una autenticación (anonymous auth)
- ningún acceso para el resto de los usuarios (* none).
El problema es que este modo de autenticación NO viene habilitado por defecto y requiere activación de TLS/SSL en el servidor LDAP. Esta tarea no resultó tan trivial como pensaba y no pude habilitarlo.
Para poder acceder a la configuración, existe un mecanismo alternativo. En la base de datos config, existe el usuario admin, pero por default no tiene password asignado. Para habilitar el uso de este usuario con autenticación simple, primero hay que crear la contraseña con slappasswd:
# slappasswd -h {SSHA}y luego editar el archivo /etc/ldap/slapd.d/cn\=config/olcDatabase\=\{0\}config.ldif para agregar la siguiente línea debajo del nombre de usuario:
olcRootDN: cn=admin,cn=config //esta línea ya existe en el archivoFinalmente, reiniciar el servicio:
olcRootPW: {SSHA}xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
# /etc/init.d/slapd restarty testear que funciona:
$ ldapsearch -x -D cn=admin,cn=config -W -b cn=configCómo armar los permisos y otorgarlos está excelentemente explicado en la sección 5.3. Access Control del manual de OpenLDAP, por lo tanto no tiene sentido que lo repita aquí.
Clientes gráficos
Si bien podemos administrar todo el directorio a través de archivos LDIF, esto puede resultar engorroso y contraproducente en el día a día. Por suerte existen herramientas gráficas que nos ayudan a administrar el directorio de manera más simple.
Algunas de estas herramientas son:
Referencias
- OpenLDAP provider on Debian squeeze
- OpenLDAP installation on Debian
- OpenLDAP - 2. A Quick-Start Guide
- Debian 5.0 y OpenLDAP con TLS
- OpenLDAP - 5. Configuring slapd
- LDAP Administration Guide
- Zarafa LDAP cn config How To
- HowTo:LDAP Debian 6 (squeeze)
2 comentarios:
disculpa pero el link del cliente gráfico LDAPBrower no funciona
Tenes razón! gracias por avisar!
Se ve que no existe más la entrada, porque el link estaba bien. Googlie un rato y no pude encontrar otra página oficial, sólo links a la que yo había puesto.
Por lo visto ya no tiene un desarrollo activo, así que lo saqué de la lista.
Saludos!
Publicar un comentario