Describimos como configurar y usar un servidor LDAP en adJ OpenBSD 5.8p1, empleando el servicio ldpad y los clientes openldap-client y phpldapadmin.

1. INTRODUCCIÓN

LDAP (Lightweight Directory Access Protocol) es un protocolo para mantener e intercambiar información almacenada en directorios (i.e bases de datos especiales).

Un uso típico de LDAP es mantener en un servidor información de los usuarios (e.g nombres, apellidos, dirección, teléfono, login, clave) de una organización para permitir su autenticación en los computadores o en aplicaciones.

OpenBSD incluye (desde OpenBSD 4.8) un servidor para LDAP versión 2, ldapd. No incluye cliente para LDAP pero desde la línea de comandos pueden emplearse las herramientas del paquete openldap-client o como interfaz web puede usarse phpldapadmin .

2. INSTALACIÓN Y CONFIGURACIÓN DE ldapd

No necesita instalar paquetes para la operación como servidor.

La configuración que se presenta puede empelar SSL (puerto 636) o TLS para conexiones en la red local y conexiones no cifradas desde el mismo computador tanto por puerto TCP estándar (389) como por una conexión socket (/var/run/ldapi).

Las conexiones cifradas requieren certificado cuyas llave pública y privada deben copiarse a /etc/ldap/certs. Puede bien generar un certificado autofirmado o bien instalar uno firmado por una autoridad certificadora. Según documentación de OpenLDAP para aumentar facilidad de conexión desde más clientes es mejor uno firmado por una autoridad (unido a certificado intermedios y de la autoridad) y que el FQDN del certificado sea el CN del directorio.

Por ejemplo si quiere usar el certificado que usa para el servidor web (por ejemplo /etc/ssl/server.crt y /etc/ssl/private/server.key), puede copiar las llaves con el nombre que usará para el servicio:

# cp /etc/ssl/private/server.key /etc/ldap/certs/www.pasosdeJesus.org.key
# cp /etc/ssl/server.crt /etc/ldap/certs/www.pasosdeJesus.org.crt

Como se explica en {3}, además ejecute:

cd /etc/ldap/certs
chown _ldapd:_ldapd *
chmod 0640 /etc/ldap/certs/*key
chmod 0644 /etc/ldap/certs/*crt 

Para configurar el servidor, verifique que exista el usuario _ldapd y el grupo _ldapd y edite /etc/ldapd.conf:

schema "/etc/ldap/core.schema"                                                  
schema "/etc/ldap/inetorgperson.schema"                                         
schema "/etc/ldap/nis.schema"                                                   
 
lan_if = "re1"

listen on $lan_if ldaps certificate www.pasosdeJesus.org
listen on $lan_if tls certificate www.pasosdeJesus.org
listen on lo0 secure
listen on "/var/run/ldapi"

namespace "dc=pasosdeJesus,dc=org" {
        rootdn          "cn=admin,dc=pasosdeJesus,dc=org"
        rootpw          "secreto"
        index           sn
        index           givenName
        index           cn
        index           mail
        index           objectClass
        index           sn
        fsync           on
}                                                                               

Recuerde que la clave del directorio debe ser mejor que la presentada (i.e remplace secreto por una buena clave). En lugar de poner la clave plana también es posible poner la cadena generada con:

# slappasswd -v -u -h {SHA} -s secreto

que en el caso de la clave 'secreto' es '{SHA}Ck+Lk/qtUEAH33jJrLb5PqbMjFM='

La configuración por defecto emplea /var/db/ldap como directorio para mantener las bases de datos y mantiene una por cada namespace del archivo de configuración.
Las conexiones no cifradas por defecto operan en el puerto 389, sólo desde el mismo computador. Desde la red pueden iniciarse conexiones no cifradas por el puerto 389 pero para que ldapd permita autenticar primero deben volverse cifradas con TLS. Pueden hacerse conexiones cifradas desde el comienzo con SSL que opera en el puerto 636.
Se recomienda deshabilitar SSL y dejar sólo TLS. No se recomienda agregar secure a conexión alguna excepto a las del mismo servidor.

Cada vez que modifique el archivo de configuración del servidor puede verificarlo con:

$ doas ldapd -n

Para iniciar el servidor LDkAP en modo de depuración y ver posibles errores:

$ doas ldapd -dv

Tras verificar el funcionamiento, para que en cada arranque se inicie el servidor puede agregar a /etc/rc.conf.local:

ldapd_flags=""
pkg_scripts="ldapd"

E iniciar el servicio con doas /etc/rc.d/ldapd start y detenerlo con doas /etc/rc.d/ldadp stop

Si emplea un adJ 5.2 y planea conectarse desde clientes digamos en Ubuntu requerirá el parche descrito en http://openbsd.7691.n7.nabble.com/ldapd-and-quot-The-Diffie-Hellman-prime-sent-by-the-server-is-not-acceptable-quot-td59635.html

Si planea autenticar correo es recomendable que emplee el esquema misc de OpenLDAP como se describe en {7}: doas ftp -o "/etc/ldap/misc.schema" \ http://www.openldap.org/devel/cvsweb.cgi/~checkout~/servers/slapd/schema/misc.schema y que en /etc/ldapd.conf agregue la línea:

schema "/etc/ldap/courier.schema"

Si planea autenticar estaciones Ubuntu además del anterior es muy recomendable que agregue el esquema LDAP de Courier, de la siguiente forma descrita en {3}: doas ftp -o /etc/ldap/courier.schema \ http://courier.cvs.sourceforge.net/viewvc/courier/libs/authlib/authldap.schema Agregue en /etc/ldapd.conf la línea:

schema "/etc/ldap/courier.schema"

Para que PHPldapadmin no reporte errores en esquemas, también se recomiendan: doas ftp -o "/etc/ldap/mozillaOrgPerson.schema" \ http://downloads.sourceforge.net/project/jabook/Schemas/mozillaOrgPerson/mozillaOrgPerson.schema doas ftp -o "/etc/ldap/cosine.schema" \ https://raw.githubusercontent.com/gcp/openldap/master/servers/slapd/schema/cosine.schema doas ftp -o "/etc/ldap/samba3.schema" \ https://raw.githubusercontent.com/cajus/gosa-gui/master/contrib/openldap/samba3.schema Agregando la respectiva línea con schema en /etc/ldapd.conf. En el caso de cosine.schema tiene varias definciones repetidas respecto a otros así que deben comentarse con el símbolo # al comienzo de cada línea. Determine las definiciones repetidas con:

doas ldapd -n

Una vez instale todos los esquemas y verifique la sintaxis, rcuerde reinicar ldapd (como debe hacer siempre que modifique la configuración).

3. PRUEBAS CON OpenLDAP-client

Instale el paquete con:

# pkg_add openldap-client

Puede descargar unos archivos de órdenes que le facilitarán interactuar con openldap-client con:

mdkir -p ~/servidor
cd ~/servidor
git clone https://github.com/vtamara/servidor_ldap.git
cp servidor_ldap/DN.sh.plantilla servidor_ldap/DN.sh

Y editar y adaptar para su caso servidor_ldap/DN.sh

3.1 SIN CIFRAR EN 127.0.0.1

Verifique localmente que el servidor no cifrado corre con:

ldapsearch -x -b 'dc=pasosdeJesus,dc=org' '(objectclass=*)'

3.2 CIFRANDO

Primero puede analizar y verificar la conexión SSL del puerto 636 con:

openssl s_client -connect 192.168.2.1:636

Puede verificar sus certificados contra la entidad que los expide siguiendo instrucciones de {4}.

ldapsearch por defecto requiere que el certificado de la entidad certificadora esté disponible en el disco y configurado. Si prefiere evitar chequeo de certificados agregue a /etc/openldap/ldap.conf:

TLS_REQCERT never

Por otra parte si prefiere que ldapsearch haga verificaciones completas de certificados: Descargue certificado de su entidad certificadora y agreguelo por ejemplo a /etc/ssl/certs/ca-certificates.crt y agregue a /etc/ldap/ldap.conf la línea:

TLS_CACERT      /etc/ssl/certs/ca-certificates.crt

Con esto, al ejecutar:

ldapsearch -H ldaps://www.pasosdeJesus.org -x -b "dc=pasosdeJesus,dc=org" '(objectclass=*)'

debería obtener

# extended LDIF
#
# LDAPv3
# base <dc=pasosdeJesus,dc=org> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#

# search result
search: 2
result: 32 No such object

# numResponses: 1

Para hacer pruebas desde otro computador, tenga en cuenta que en OpenBSD ldapsearch utiliza openssl mientras que por ejemplo en Ubuntu emplea GNUTls, por lo que con adJ 5.2 requiere el parche mencionado en la sección anterior.

4. ADICIÓN DE DATOS INICIALES

Una vez tenga éxito sus pruebas con ldapsearch deberá iniciar un directorio para su organización y los usuarios que se autenticarán. Puede agregar estos datos con el programa ldapadd que también hace parte del paquete openldap-client. Programa que recibe datos en formato LDIF, por ejemplo leídos de un archivo. Un primer archivo con datos de la organización puede ser org.ldif y contener:

dn: dc=pasosdeJesus,dc=org
dc: pasosdeJesus
objectClass: dcObject
objectClass: organization
o: Pasos de Jesús

dn: cn=admin,dc=pasosdeJesus,dc=org
cn: admin
objectClass: organizationalRole

dn: ou=gente,dc=pasosdeJesus,dc=org
ou: gente
objectClass: top
objectClass: organizationalUnit

dn: ou=grupos,dc=pasosdeJesus,dc=org
ou: grupos
objectClass: top
objectClass: organizationalUnit

dn: ou=sendmail,dc=pasosdeJesus,dc=org
ou: sendmail
objectClass: top
objectClass: organizationalUnit
userPassword: sendmail

Nota: Al agregar información verifique no dejar espacios en blanco al final de cada línea.

Se pueden agregar org.ldif con:

ldapadd -x -D "cn=admin,dc=pasosdeJesus,dc=org" -W \
  -H !ldaps://www.pasosdeJesus.org -f org.ldif

Además de poder revisar los mensajes que ldapd genere al ejecutarse en modo de depuración, podrá consultar los datos ingresados al directorio con:

ldapsearch -H ldaps://www.pasosdeJesus.org -x -b 'dc=pasosdeJesus,dc=org' '(objectclass=*)'

5. USO CON phpldapadmin

5.1 INSTALACIÓN Y CONFIGURACIÓN DE phpldapadmin

La distribución oficial de phpldapadmin no soporta php-5.5 ni TLS, por lo que se recomienda emplear https://github.com/leenooks/phpLDAPadmin

# mkdir -p ~/servidor/ # cd ~/servidor/ # git clone https://github.com/leenooks/phpLDAPadmin.git # cp -rf phpLDAPadmin /var/www/phpldapadmin # doas ln -s ../phpldapadmin /var/www/htdocs/phpldapadmin # doas $EDITOR /var/www/phpldapadmin/config/config.php para configurarlo (use su editor preferido en lugar de $EDITOR o defina esa variable) es importante que por lo menos quite el comentario a la línea

$config->custom->jpeg['tmpdir'] = '/tmp';

También debe asegurar que puede emplearse los dispositivos de generación de números aleatorios en la jaula chroot de Apache. Para esto verifique que en /etc/fstab al montar la partición /var este permitiendo dispositivos (que no este la opción nodev) y como se explica en {5}, ejecute:

cd /var/www
doas mkdir -p dev
cd dev
doas /dev/MAKEDEV arandom

Para probar dirigase a https://midomino.org/phpldapadmin/ o si lo requiere primero configure un alias en su servidor web.

5.2. Preparando cuentas

Primero cree un grupo posix en grupos. A continuación cree cuentas de usuario, tenga en cuenta que en la configuración por omisión debe emplear cifrado SHA para la clave (que no es seguro pero es soportada por phpLdapAdmin y ldadpd).

6. DIFERENCIAS CON OPENLDAP

  • El renombramiento de objetos opera con OpenLDAP pero no con ldapd.

7. BIBLIOGRAFÍA

  • {1} [Autenticacion con OpenLDAP]
  • {2} Páginas man ldadp, man ldapd.conf, man ldapctl
  • {3} http://www.tumfatig.net/20120817/monitoring-openbsds-ldap-daemon/
  • {4} http://www.cyberciti.biz/faq/test-ssl-certificates-diagnosis-ssl-certificate/
  • {5} http://openbsd.7691.n7.nabble.com/dev-random-as-chrooted-named-s-entropy-source-current-td64344.html
  • {6} http://www.openldap.org/faq/index.cgi?_highlightWords=tls&file=185
  • {7} http://www.tumfatig.net/20150718/opensmtpd-dovecot-and-ldapd-on-openbsd-5-7/

Información dedicada al Padre protector y liberada al dominio público. 2013. vtamara@pasosdeJesus.org