LDAP es un sistema de base de datos en forma de arbol optimizado para las consultas en las que se producen pocas actualizaciones, este tipo de DBs suelen ser idóneas para servicios de autenticación o inventarios.
En este artículo describiré como realizar una instalación básica de dicho servicio utilizando para ello openldap, además mostraré de forma muy breve como utilizar la herramienta shelldap para navegar a través del arbol y como eliminar y crear entradas.
Lo primero que debemos tener en cuenta es que se estructura en forma de arbol, este es llamado como DIT(Data Information Tree), si estamos familiarizados con el protocolo SNMP nos daremos cuenta de que la estructura es muy similar.
Cada objeto es una instancia de un objectClass y los objectClass contienen atributos.
En el siguiente dibujo podemos ver una configuración de un arbol ldap:
Una lista de los atributos y objectClass puede ser encontrada aquí (dependiendo de los esquemas incluidos en /etc/openldap/slapd.conf se tendrán a nuestra disposición unos objectClass u otros).
Podemos ver que elementos tiene cada objectClass en los esquemas:
objectclass ........
Un esquema típico podría ser:
Dominio --> Organization unit --> UID
dc=com dc=alfaexploit ou=people uid=kr0m
dc=com dc=alfaexploit ou=servers uid=server01
Pueden haber tantos dc como queramos: asd.alfaexploit.com
Y tantos ou como queramos: servers –> HTTP –> server01
Los atributos del UID se controlan mediante los objectclass.
- RDN –> Elemento final del arbol uid=kr0m
- DN –> Elementos hasta llegar al RDN uid=kr0m ou=people dc=alfaexploit dc=com
Ahora que ya tenemos los conceptos claros podemos proceder con la instalación del software:
include /etc/openldap/schema/core.schema --> Cuidado con los includes ya que pueden haber dependencias cruzadas!!!
include /etc/openldap/schema/cosine.schema
include /etc/openldap/schema/inetorgperson.schema
pidfile /var/run/openldap/slapd.pid
argsfile /var/run/openldap/slapd.args
database hdb
suffix "dc=alfaexploit,dc=com"
checkpoint 32 30
rootdn "cn=Manager,dc=alfaexploit,dc=com" --> Cuando conectemos con este DN se nos permitirá modificar cualquier cosa del LDAP
rootpw "{SSHA}sAAQc/1EDlk23Vb/stsceOa/EoFd7pghi" --> Salida de slappasswd
directory /var/lib/openldap-data
index objectClass eq
Copiamos el fichero de config de ejemplo de la base de datos:
chown ldap:ldap /var/lib/openldap-data/*
mkdir /var/run/openldap/
chown ldap:ldap /var/run/openldap/
Se puede chequear la config con:
config file testing succeeded
NOTA: Si da problemas podemos arrancarlo de forma manual con debug level 65535 así veremos donde está el problema:
También puede que estén fallando los permisos del directorio de datos:
/etc/init.d/slapd restart
Configuramos la parte como cliente(para poder hacer pruebas en local en el propio servidor LDAP):
BASE dc=alfaexploit,dc=com
URI ldap://ldap.alfaexploit.com:389
IP_SERVER ldap.alfaexploit.com
Comprobamos que funciona:
# extended LDIF
#
# LDAPv3
# base <> with scope baseObject
# filter: (objectclass=*)
# requesting: namingContexts
#
#
dn:
namingContexts: dc=alfaexploit,dc=com --> OK
# search result
search: 2
result: 0 Success
# numResponses: 2
# numEntries: 1
Para realizar inserciones openldap espera la entrada en sintaxis LDIF:
# Creamos el elemento superior
dn: dc=alfaexploit,dc=com
dc: alfaexploit
description: The best place in the whole world
objectClass: dcObject
objectClass: organization
o: Alfaexploit, Corp.
# Creamos el elemento de tipo organizationUnit
dn: ou=servers,dc=alfaexploit,dc=com
ou: servers
description: All servers in alfaexploit.com
objectclass: organizationalUnit
# Anyadimos un servidor al elemento
dn: uid=server01,ou=servers,dc=alfaexploit,dc=com
objectclass: inetOrgPerson
cn: server01
sn: serve01
uid: server01
displayName: HTTP-server01
NOTA: El servidor LDAP NO nos permitirá el acceso incluso utilizando las credenciales de rootdn si no hay datos en el arbol, para evitar esto SIEMPRE realizaremos una carga de datos inicial!!
Realizamos la inserción:
Enter LDAP Password:
adding new entry "dc=alfaexploit,dc=com"
adding new entry "ou=servers,dc=alfaexploit,dc=com"
adding new entry "uid=server01,ou=servers,dc=alfaexploit,dc=com"
Si queremos depurar la salida:
Para comprobar que se ha insertado:
version: 1
#
# LDAPv3
# base <dc=alfaexploit,dc=com> (default) with scope subtree
# filter: objectClass=inetOrgPerson
# requesting: ALL
#
# server01, servers, alfaexploit.com
dn: uid=server01,ou=servers,dc=alfaexploit,dc=com
objectClass: inetOrgPerson
cn: server01
sn: serve01
uid: server01
displayName: HTTP-server01
# search result
# numResponses: 2
# numEntries: 1
Una herramienta muy útil es shelldap, esta nos permitirá navegar por el arbol y realizar tareas administrativas sobre el:
shelldap --server IP_SERVER --binddn cn=Manager,dc=alfaexploit,dc=com
~ > TAB
cat copy delete exit id mkdir passwd rm touch
cd cp edit grep list move pwd search vi
clear create env help ls mv read setenv whoami
~ > ls
ou=servers/
~ > cd ou=servers
ou=servers,~ > ls
uid=server01
ou=servers,~ > cat uid=server01
dn: uid=server01,ou=servers,dc=alfaexploit,dc=com
objectClass: inetOrgPerson
cn: server01
displayName: HTTP-server01
sn: serve01
uid: server01
ou=servers,~ > rm uid=server01
Are you sure? [N/y]: y
uid=server01,ou=servers,dc=alfaexploit,dc=com: Success
ou=servers,~ > ls
ou=servers,~ > create organizationalUnit
dn: ou=HTTP_SERVERS,ou=servers,dc=alfaexploit,dc=com
objectClass: organizationalUnit
ou: HTTP_SERVERS
Success
ou=servers,~ > ls
ou=HTTP_SERVERS
ou=servers,~ > cd ou=HTTP_SERVERS
ou=HTTP_SERVERS,ou=servers,~ > create inetOrgPerson
dn: cn=http_server_01,ou=HTTP_SERVERS,ou=servers,dc=alfaexploit,dc=com
objectClass: inetOrgPerson
cn: http_server_01
sn: http_server_01
Success
ou=HTTP_SERVERS,ou=servers,~ > ls
cn=http_server_01
Si se crean objetos de varios tipos y alguno de ellos está en un schema que no se incluyó en el server LDAP NO nos saldrán las opciones correspondientes a ese schema
Si en un momento dado necesitamos dumpear el arbol LDAP desde el propio servidor LDAP podemos hacerlo:
Con esto ya tenemos nuestro servidor LDAP básico, en próximas entregas explicaré como podemos tener un entorno con una VIP y un segundo servidor LDAP en stand-by.