Como instalar OpenLDAP en Debian7/Ubuntu13.04 con soporte GnuTLS

OpenLDAP LogoPara quienes trabajamos realizando montajes de servidores usando GNU/Linux y Software Libre, OpenLDAP viene convirtiéndose en una de esas herramientas de «uso obligatorio» en todo montaje medianamente ambicioso.

Pero, ¿Que es OpenLDAP?

Vamos por partes… ¿Que es LDAP?

Según la Wikipedia

LDAP son las siglas de Lightweight Directory Access Protocol (en español Protocolo Ligero de Acceso a Directorios) que hacen referencia a un protocolo a nivel de aplicación que permite el acceso a un servicio de directorio ordenado y distribuido para buscar diversa información en un entorno de red. LDAP también se considera una base de datos (aunque su sistema de almacenamiento puede ser diferente) a la que pueden realizarse consultas.

En resumen…
El protocolo LDAP nos permite crear un directorio (muy similar a un directorio telefónico) para nuestra organización, facilitando la organización de los diferentes objetos (Usuarios, Grupos, Dispositivos, etc) en una estructura jerárquica (similar a un árbol). simplificando la creación de «perfiles» para cada uno de los objetos que conforman nuestro directorio; muy útil para otorgar permisos de acceso (autorización) a los diferentes servicios/recursos que ofrezcamos en nuestra organización.

En una definición mucho mas simple, un directorio LDAP es una base de datos optimizada para llevar a cabo operaciones de lectura.

Ahora si, ¿Que es OpenLDAP?

OpenLDAP es una implementación libre del protocolo LDAP, licenciado bajo la OpenLDAP Public Licence cuyas principales características son:

  • Soporte IPV6
  • Soporte para referrals (distribuido)
  • UTF-8 como codificación de caracteres por defecto
  • Soporte para autenticación usando Kerberos, SASL, CRAM-MD5
  • Soporte para el protocolo LDAPv3
  • Soporte para TLS
  • Soporte para Proxy LDAP
  • Backends Disponibles: DBD (obsoleto), HDB, LDIF y NDB
  • Soporte para LDAP Monitor
  • Soporte para ldap-dnssrv o búsqueda de servicios LDAP usando registro SRV
  • Soporte para llamadas a procedimientos remoto o RPC
  • Gran cantidad de Overlays disponibles (piezas de código que proveen características adicionales. Mayormente al backend de almacenamiento)

Si deseas ahondar aún mas en el proyecto, te invito a que visites su sitio web http://www.openldap.org

OpenLDAP se divide en 3 grandes componentes

  • Demonio de servidor (slapd)
  • Librerías para interactuar con el directorio
  • Herramientas de gestión (ldapsearch, ldapmodify, ldapadd, ldapindex, entre otras)

Manos a la obra

Instalación

Tanto en Debian, como en Ubuntu al instalar el paquete slapd, por defecto se crea un nuevo árbol de directorio usando los datos del dominio plasmados en el archivo /etc/hosts, por lo tanto, si en nuestro archivo hosts, tenemos lo siguiente:

127.0.1.1 debianpruebas.slabinfo.com.co debianpruebas

El instalador, creará automáticamente el siguiente árbol de directorio (BaseDN):

dc=slabinfo,dc=com,dc=co

Aclarado el punto anterior, instalamos OpenLDAP y sus utilidades usando APT

sudo apt-get install slapd ldap-utils

El instalador nos solicitará una contraseña para el administrador del nuevo árbol de directorio (cn=admin, dc=slabinfo,dc=com,dc=co), es aconsejable crear una contraseña segura para proteger de mirones no autorizados nuestro directorio.

Configuración inicial del directorio

El servidor slapd, tanto en Ubuntu, como en Debian, usa el estilo de configuración cn=config o «configuración al vuelo», por lo que dicha configuración se hace a base de archivos de texto usando el formado LDIF (LDAP Data Interchange Format).

Estructura del directorio

En este punto cada cual puede adaptar dicha configuración según sus necesidades, yo suelo usar un árbol de directorio estructurado así:

   dc=slabinfo,dc=com,dc=co
    +ou=usuarios
    | +uid=john
    | +uid=jhondoe
    |  ...
    |
    +ou=grupos
    | +cn=sistemas
    | +cn=contabilidad
    |  ...
    |
    +ou=equipos
    | +cn=estacion1
    | +cn=estacion2
    |  ...
    |
    +ou=servicios
    | +cn=squid
    | +cn=samba
    |  ...
    |
    +cn=admin

Comenzamos creando un archivo de texto LDIF y lo guardamos con el nombre estructura-directorio.ldif:

dn: ou=usuarios,dc=slabinfo,dc=com,dc=co
objectClass: organizationalUnit
ou: usuarios

dn: ou=grupos,dc=slabinfo,dc=com,dc=co
objectClass: organizationalUnit
ou: grupos

dn: ou=equipos,dc=slabinfo,dc=com,dc=co
objectClass: organizationalUnit
ou: equipos

dn: ou=servicios,dc=slabinfo,dc=com,dc=co
objectClass: organizationalUnit
ou: servicios

Luego, aplicamos los cambios al directorio con el comando:

ldapadd -x -D cn=admin,dc=slabinfo,dc=com,dc=co -W -f estructura-directorio.ldif
Enter LDAP Password:
adding new entry "ou=usuarios,dc=slabinfo,dc=com,dc=co"

adding new entry "ou=grupos,dc=slabinfo,dc=com,dc=co"

adding new entry "ou=equipos,dc=slabinfo,dc=com,dc=co"

adding new entry "ou=servicios,dc=slabinfo,dc=com,dc=co"

Creamos 2 usuarios de prueba (john y jhondoe) en nuestro directorio, creamos el archivo estructura-usuarios.ldif.

dn: uid=john,ou=usuarios,dc=slabinfo,dc=com,dc=co
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uid: john
sn: Ortiz Roman
givenName: John Edisson
cn: John Edisson Ortiz Roman
displayName: John Edisson Ortiz
uidNumber: 10000
gidNumber: 1000
userPassword: contrasena_segura
gecos: John Edisson Ortiz Roman
loginShell: /bin/false
homeDirectory: /home/john

dn: uid=johndoe,ou=usuarios,dc=slabinfo,dc=com,dc=co
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uid: johndoe
sn: Doe
givenName: John
cn: John Doe
displayName: John Doe
uidNumber: 10001
gidNumber: 1001
userPassword: contrasena_segura
gecos: John Doe
loginShell: /bin/false
homeDirectory: /home/johndoe

y los añadimos al directorio con el comando:

ldapadd -x -D cn=admin,dc=slabinfo,dc=com,dc=co -W -f estructura-usuarios.ldif
Enter LDAP Password:
adding new entry "uid=john,ou=usuarios,dc=slabinfo,dc=com,dc=co"

adding new entry "uid=johndoe,ou=usuarios,dc=slabinfo,dc=com,dc=co"

finalmente los grupos sistemas y contabilidad, para ello, creamos el archivo estructura-grupos.ldif:

dn: cn=sistemas,ou=grupos,dc=slabinfo,dc=com,dc=co
objectClass: posixGroup
objectClass: top
cn: sistemas
gidNumber: 1000
memberUid: john

dn: cn=consultoria,ou=grupos,dc=slabinfo,dc=com,dc=co
objectClass: posixGroup
objectClass: top
cn: consultoria
gidNumber: 1001
memberUid: jhondoe

Nuevamente el comando ldapadd será nuestro aliado.

ldapadd -x -D cn=admin,dc=slabinfo,dc=com,dc=co -W -f estructura-grupos.ldif
Enter LDAP Password:
adding new entry "cn=sistemas,ou=grupos,dc=slabinfo,dc=com,dc=co"

adding new entry "cn=consultoria,ou=grupos,dc=slabinfo,dc=com,dc=co"

Como se puede observar, creamos 4 unidades organizacionales (usuarios, grupos, servicios y equipos), 2 usuarios (john y jhondoe) y 2 grupos (sistemas y contabilidad), a la vez que «matriculamos» al usuario john en el grupo sistemas y a johndoe en contabilidad.

Por ahora no haremos uso de las unidades organizacionales servicios y equipos, pues entraremos en detalles sobre las mismas en futuros artículos cuando expliquemos como hacer para que samba y squid usen LDAP en sus procesos de autenticación.

Ya tenemos nuestra estructura terminada, ahora a habilitar el soporte para GnuTLS.

Activando el soporte GnuTLS

GnuTLS es una implementación libre y de código abierto de los protocolos SSL y TLS permitiendo establecer comunicaciones seguras entre clientes y servidores en la capa de red.

Para hacer uso de TLS en nuestro servidor LDAP, requeriremos de mínimo 1 certificado público y una clave privada. En nuestro caso en particular, crearemos además una CA (Autoridad Certificadora) la cual va a firmar el certificado que nuestro servidor slapd usará en sus conexiones.

De nuevo, manos a la obra

Tanto para crear nuestra CA, como para crear y firmar el par llave/certificado para nuestro servidor LDAP usaremos el paquete gnutls-bin disponibe en los repositorios de Debian y Ubuntu.

sudo apt-get install gnutls-bin

Para mi comodidad, siempre creo una carpeta con el nombre CA-dominio-fqdn, en mi caso dicha carpeta se llama asi: CA-slabinfo.com.co.

mkdir CA-slabinfo.com.co && cd CA-slabinfo.com.co

Creando la CA

Lo primero, la llave privada que usará nuestra CA

~/CA-slabinfo.com.co# certtool --generate-privkey > ca-slabinfo.com.co-key.pem
Generating a 2432 bit RSA private key...

Ahora el turno es para el certificado público de nuestra CA
Antes que nada, crearemos una plantilla que contendra los datos de nuestra CA (parece complicado, pero no tiene ciencia), el archivo en cuestión se llama ca.info

cn = Slabinfo EU
ca
cert_signing_key

Ahora, creamos el certificado y lo firmamos

certtool --generate-self-signed --load-privkey ca-slabinfo.com.co-key.pem --template ca.info --outfile ca-slabinfo.com.co-cert.pem
Generating a self signed certificate...
X.509 Certificate Information:
	Version: 3
	Serial Number (hex): 521bc2e8
	Validity:
		Not Before: Mon Aug 26 21:04:40 UTC 2013
		Not After: Tue Aug 26 21:04:40 UTC 2014
	Subject: CN=Slabinfo EU
	Subject Public Key Algorithm: RSA
	Certificate Security Level: Normal
		Modulus (bits 2432):
			00:c0:1b:c8:62:5a:79:6d:50:f3:f6:56:e9:e5:34:e4
			de:9b:4a:b5:f4:07:98:9b:ef:85:06:46:39:3d:b6:cf
			6d:88:89:a8:37:9e:71:d4:10:f3:13:66:39:7b:85:b4
			20:97:ee:91:f3:7f:95:2e:69:46:5f:a6:cb:93:0d:98
			80:ec:20:eb:c2:75:73:f0:a3:85:31:17:ae:45:66:99
			15:ab:66:07:5a:e5:cb:f6:8a:94:78:4f:35:e9:73:75
			53:f6:d9:4d:19:a7:42:20:51:b3:ad:bf:53:65:87:0e
			e7:39:a0:29:44:73:9d:59:52:8b:42:ef:7e:c9:30:ba
			dc:a1:c7:97:5d:c0:cb:50:b7:55:75:b7:b0:15:02:d7
			99:43:3c:d2:ac:97:d1:93:9e:e5:45:b3:ae:75:7a:43
			d3:d5:a7:b5:9f:3a:ba:68:4d:01:41:5c:f5:e2:44:05
			e7:73:cc:85:4d:b7:d2:c3:ce:da:4c:0c:22:be:be:ca
			24:85:fc:b4:f8:3a:66:fe:b0:40:5f:61:53:37:28:c7
			db:56:6f:96:9f:a3:23:02:b0:dd:fc:ef:84:46:ae:ed
			f6:1a:d1:c6:38:8a:65:4b:36:46:26:de:17:c7:58:6e
			c9:d9:ae:74:7b:71:97:78:b0:22:40:1d:6c:dd:23:52
			f2:e0:3c:61:c1:38:a9:9b:d4:cc:43:42:0b:17:8e:b3
			58:70:15:1e:a3:b5:38:25:bf:ee:3f:ee:2c:de:92:f8
			cf:a8:42:95:92:74:be:56:08:04:eb:47:ff:f4:b6:24
			01
		Exponent (bits 24):
			01:00:01
	Extensions:
		Basic Constraints (critical):
			Certificate Authority (CA): TRUE
		Key Usage (critical):
			Certificate signing.
		Subject Key Identifier (not critical):
			d7fce9fc2f83362289c6116792b82cd41d66e144
Other Information:
	Public Key Id:
		d7fce9fc2f83362289c6116792b82cd41d66e144

Signing certificate...

Ya hemos creada nuestra CA (muuuuy básica, por cierto), ahora, a crear y firmar el par llave/certificado para nuestro servidor.
Empezamos con la clave (ejem 1024bits siguen siendo una longitud aceptable)

certtool --generate-privkey --bits 1024 --outfile ldap.slabinfo.com.co-key.pem
** Note: Please use the --sec-param instead of --bits
Generating a 1024 bit RSA private key...

Ahora, es el turno de generar y firmar certificado
Primero, crearemos el «template» a usar por el certificado, de nuevo un archivo de texto llamado ldap.info con lo siguiente

organization = Slabinfo E.U.
cn = ldap.slabinfo.com.co
tls_www_server
encryption_key
signing_key
expiration_days = 720

Luego, creamos y firmarmos nuestro certificado

certtool --generate-certificate --load-privkey ldap.slabinfo.com.co-key.pem --load-ca-certificate ca-slabinfo.com.co-cert.pem --load-ca-privkey ca-slabinfo.com.co-key.pem --template ldap.info --outfile ldap.slabinfo.com.co-cert.pem
Generating a signed certificate...
X.509 Certificate Information:
	Version: 3
	Serial Number (hex): 521bc601
	Validity:
		Not Before: Mon Aug 26 21:17:53 UTC 2013
		Not After: Sun Aug 16 21:17:53 UTC 2015
	Subject: O=Slabinfo E.U.,CN=ldap.slabinfo.com.co
	Subject Public Key Algorithm: RSA
	Certificate Security Level: Weak
		Modulus (bits 1024):
			00:b8:53:57:5b:18:0b:b6:c4:eb:2b:da:14:7f:dd:7c
			b1:82:7e:d8:df:f3:27:c2:ea:25:84:7b:dd:29:33:18
			bc:b5:8a:6f:4e:fd:24:30:50:95:7c:23:43:ff:2f:10
			a9:07:7e:c5:b0:28:de:02:3e:5d:f8:d7:5f:df:3f:0d
			e6:e3:7f:c0:6a:af:4b:b3:48:91:a1:13:a8:ad:12:07
			0b:1a:bc:ae:67:ca:81:f7:71:81:55:70:ce:80:42:f7
			86:c5:12:c5:24:52:21:70:45:7c:ee:fd:37:3a:f0:e0
			fd:81:71:ea:b4:bd:5b:3f:bc:31:0b:52:91:cd:75:94
			85
		Exponent (bits 24):
			01:00:01
	Extensions:
		Basic Constraints (critical):
			Certificate Authority (CA): FALSE
		Key Purpose (not critical):
			TLS WWW Server.
		Key Usage (critical):
			Digital signature.
			Key encipherment.
		Subject Key Identifier (not critical):
			88d07313bdf48e7bb27606bf358be399a7175a16
		Authority Key Identifier (not critical):
			d7fce9fc2f83362289c6116792b82cd41d66e144
Other Information:
	Public Key Id:
		88d07313bdf48e7bb27606bf358be399a7175a16

Signing certificate...

Una vez termindos los pasos anteriores, tendremos 6 archivos en nuestra carpeta:

  • ca.info
  • ca-slabinfo.com.co-cert.pem
  • ca-slabinfo.com.co-key.pem
  • ldap.info
  • ldap.slabinfo.com.co-cert.pem
  • ldap.slabinfo.com.co-key.pem

Nuestro servidor LDAP usará solo 3 archivos (el certificado público de la CA, y su par llave/certificado) por lo que los movemos a una ubicación mas idónea.

cp {ca-slabinfo.com.co-cert.pem,ldap.slabinfo.com.co-cert.pem} /etc/ssl/certs/
cp ldap.slabinfo.com.co-key.pem /etc/ssl/private/

Es importante brindarle los permisos de acceso adecuados a dichos certificados/llave para evitar quebraderos de cabeza tratando de dar con el error main: TLS init def ctx failed: -1.

sudo adduser openldap ssl-cert
Añadiendo al usuario `openldap' al grupo `ssl-cert' ...
Añadiendo al usuario openldap al grupo ssl-cert
sudo chgrp ssl-cert /etc/ssl/private/ldap.slabinfo.com.co-key.pem
chmod g+r /etc/ssl/private/ldap.slabinfo.com.co-key.pem
chmod o-r /etc/ssl/private/ldap.slabinfo.com.co-key.pem

En Debian podrían necesitar instalar el paquete ssl-cert
En Ubuntu podría ser necesario modificar el archivo /etc/apparmor.d/usr.sbin.slapd y agregar:

  /etc/ssl/private/ r,
  /etc/ssl/private/* r,

Ya que tenemos todos los certificados y llaves que necesitamos, procederemos a configurar nuestro servidor LDAP para que haga uso de el protocolo TLS, una vez mas.. recurrimos a la creación de un archivo llamado tls.ldif

dn: cn=config
add: olcTLSCACertificateFile
olcTLSCACertificateFile: /etc/ssl/certs/ca-slabinfo.com.co-cert.pem
-
add: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/ssl/private/ldap.slabinfo.com.co-key.pem
-
add: olcTLSCertificateFile
olcTLSCertificateFile: /etc/ssl/certs/ldap.slabinfo.com.co-cert.pem

Aplicamos la configuración en nuestro servidor LDAP:

sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f tls.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "cn=config"

y reiniciamos

sudo service slapd restart
[ ok ] Stopping OpenLDAP: slapd.
[ ok ] Starting OpenLDAP: slapd.

Ahora solo nos queda conectarnos a nuestro servidor usando cualquier GUI que soporte TLS (recomiendo Apache Directory Studio)

apacheds-conexion
apacheds-conexion-1
apacheds-conexion-2

3 comentarios en “Como instalar OpenLDAP en Debian7/Ubuntu13.04 con soporte GnuTLS

  1. Saludos amigo. Estamos tratando implementar un servidor de autenticacion openldap en la red de la empresa donde trabajamos y total no hemos podido. El servidor openldap esta en debian6 y los clientes la mayoria con canaima 4 basado en debian. Aparte tenemos un servidor Pfsense. Voy aplicar tu guia y pueda servirme para dicha implementacion. Gracias.

    Responder
  2. Gracias por el Tutorial me ayudo mucho,

    Despues de esta parte:

    ( Aclarado el punto anterior, instalamos OpenLDAP y sus utilidades usando APT
    1 sudo apt-get install slapd ldap-utils )

    Sugiero que diga algo como lo siguiente:

    Una vez instalado OpenLDAP editar ldap.conf

    vi /etc/ldap/ldap.conf

    Simplemente realizamos los siguientes cambios:
    HOST slabinfo.com.co
    BASE dc=slabinfo, dc=com, dc=co
    URI ldap://slabinfo.com.co:389

    Responder

Deja un comentario