Para 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 debianpruebasEl 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)
Muy bueno el tutorial!
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.
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