Esta pagina se ve mejor con JavaScript habilitado

Servidor LDAP bajo Gentoo

 ·  🎃 kr0m

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:

vi /etc/openldap/schema/core.schema

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:

emerge -av net-nds/openldap

vi /etc/openldap/slapd.conf
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:

cp /etc/openldap/DB_CONFIG.example /var/lib/openldap-data/DB_CONFIG
chown ldap:ldap /var/lib/openldap-data/*
mkdir /var/run/openldap/
chown ldap:ldap /var/run/openldap/

Se puede chequear la config con:

slaptest -f /etc/openldap/slapd.conf

config file testing succeeded

NOTA: Si da problemas podemos arrancarlo de forma manual con debug level 65535 así veremos donde está el problema:

/usr/lib64/openldap/slapd -d 65535

/etc/init.d/slapd start

También puede que estén fallando los permisos del directorio de datos:

chown ldap:ldap /var/lib/openldap-data/*
/etc/init.d/slapd restart

Configuramos la parte como cliente(para poder hacer pruebas en local en el propio servidor LDAP):

vi /etc/openldap/ldap.conf

BASE dc=alfaexploit,dc=com
URI ldap://ldap.alfaexploit.com:389
vi /etc/hosts
IP_SERVER ldap.alfaexploit.com

Comprobamos que funciona:

ldapsearch -x -b ’’ -s base ‘(objectclass=*)’ namingContexts

# 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:

vi insercion.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:

ldapadd -x -D "cn=Manager,dc=alfaexploit,dc=com" -W -f insercion.ldif

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:

ldapadd -x -D "cn=Manager,dc=alfaexploit,dc=com" -W -f insercion.ldif -d 255

Para comprobar que se ha insertado:

ldapsearch -h ldap.alfaexploit.com -D "cn=Manager,dc=alfaexploit,dc=com" -w ‘XXXXXX’ -L "objectClass=inetOrgPerson"

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:

emerge -av net-nds/shelldap
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:

slapcat

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.

Si te ha gustado el artículo puedes invitarme a un RedBull aquí