Acceso a LDAP mediante Netscape Directory SDK

Por:iuav,enviado 07 Oct 2009

Directorio LDAP

Para almacenar estas descripciones de directorios es necesario el uso de un directorio LDAP, hay varias implementaciones de estos directorios, de distintas empresas, para distintos usos y para aplicaciones diferentes. Para el caso del presente artículo haremos uso de OpenLDAP, un directorio LDAP a nuestro alcance en el mundo del software libre.

Para descargar el instalador de OpenLDAP acceda a http://www.openldap.org/, ó si desea OpenLDAP para Windows. Una vez descargado e instalado OpenLDAP es necesario modificar el archivo de configuración slapd.conf, este archivo contiene configuración de usuario, contraseña, sufijo, dn principal, especificaciones de esquemas, entre otros. En este caso cambiaremos algunos valores de los atributos.

database   bdb
suffix     "dc=nspsac,dc=com"
rootdn     "cn=root,dc=nspsac,dc=com"
rootpw     abc
directory  ./data

Se ha realizado el cambio del sufijo a "dc=nspsac,dc=com", y dn principal a "cn=root,dc=nspsac,dc=com", luego la contraseña de la cuenta principal se ha cambiado a abc, pero también es posible colocar una contraseña encriptada con {CRYPT}, {MD5}, {SMD5}, {SSHA}, y {SHA}, si usamos alguna de estas encriptaciones la contraseña de la cuenta principal quedaría como el siguiente:

rootpw	{SSHA}/Wg8V59/aoeKLn4PkkKWEsdvjyz6R+/E

Muchos de los atributos de la entrada de directorio descrito anteriormente no está disponible en la configuración inicial, estos atributos están basados en unas especificaciones de esquemas que delimitan su creación. Para esto quitaremos el comentario ó agregaremos si no está descrito de las siguientes especificaciones de esquemas:

include		./schema/core.schema
include		./schema/cosine.schema
include		./schema/inetorgperson.schema

Los atributos dni, ruc, y direccion no está definido en las especificaciones de esquemas que acabamos de activarlas, estos atributos lo he agregado para fines de conocer cómo se crea una nueva especificación de esquemas y por otro lado en mi país (Perú) todo usuario de un sistema al menos tiene su documento nacional de identidad (DNI), su registro único del contribuyente (RUC) y se agregó el atributo dirección por comodidad, aunque el atributo dni y direccion no debiera estar definido en una clase de objetos como la de contribuyente, más bien debería estar definido en la clase de objetos person, para efectos de no complicar la configuración se ha añadido en la clase de objeto contribuyente.

 

En una especificación de esquema se definen clases de objetos válidos que indican qué atributos debe contener en forma obligatoria y qué atributos son opcionales, así como el tipo de dato (cadenas de texto, números) de un atributo. La clase de objetos y los atributos deben estar definidos en forma global y único mediante cadenas de números (OID), para esto es necesario obtener un OID que nos permitirá crear tantas extensiones como se quiera del esquema.

Los tipos de clase de objetos que existen son tres: Structural Una clase de objeto estructural define las características básicas de un objeto. Auxiliary Una clase de objeto Auxiliar es adicional, complementa los atributos de una clase de objeto estructural. Y por último Abstract Esta clase de objeto abstracto es usado solamente para definir modelo de datos LDAP básicos.

La sintaxis básica para crear una clase de objetos es la siguiente:

 

objectclass ( 1.1.2.2.2 NAME 'myPerson'
DESC 'Mi persona'
SUP inetOrgPerson
MUST ( myUniqueName $ givenName )
MAY myPhoto )

Donde:
1.1.2.2.2 es el identificador único global (OID).
NAME 'myPerson' es el nombre de la clase de objeto (alias para OID).
DESC 'Mi persona' la descripción para la clase de objeto.
SUP inetOrgPerson es el objeto del que hereda.
MUST(...) aquí se describen los atributos requeridos.
MAY(...) aquí se describen los atributos opcionales.

La sintaxis básica para crear un atributo es la siguiente:

attributetype ( 1.3.6.1.1.1.1.0 NAME 'uidNumber'
DESC 'Identifica en forma única a un usuario'
EQUALITY integerMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )

Donde:
1.3.6.1.1.1.1.0 es el identificador único global (OID).
NAME 'uidNumber' es el nombre del atributo (alias para OID).
DESC '...' la descripción para el atributo.
EQUALITY integerMatch calificador de plantilla de tipos.
SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 es la sintaxis OID.
SINGLE-VALUE es un calificador, puede ser SINGLE-VALUE, COLLECTIVE y {LENGTH}.

Tipo de dato

OID

Descripción

Binary 1.3.6.1.4.1.1466.115.121.1.5 BER/DER data
Boolean 1.3.6.1.4.1.1466.115.121.1.7 boolean value
Distinguished Name 1.3.6.1.4.1.1466.115.121.1.12 DN
Directory String 1.3.6.1.4.1.1466.115.121.1.15 UTF-8 string
IA5String 1.3.6.1.4.1.1466.115.121.1.26 ASCII string
Integer 1.3.6.1.4.1.1466.115.121.1.27 Integer
Name and Optional UID 1.3.6.1.4.1.1466.115.121.1.34 DN plus UID
Numeric String 1.3.6.1.4.1.1466.115.121.1.36 Numeric String
OID 1.3.6.1.4.1.1466.115.121.1.38 Object Identifier
Octet String 1.3.6.1.4.1.1466.115.121.1.40 Arbitrary Octets
Printable String 1.3.6.1.4.1.1466.115.121.1.44 Printable String

Tabla 2: Sintaxis de los atributos 

Nombre

Contexto

Descripción

booleanMatch equality Boolean
objectIdentiferMatch equality OID
distinguishedNameMatch equality DN
uniqueMemberMatch equality DN with optional UID
numericStringMatch equality numerical
numericStringOrdering ordering numerical
numericStringSubstringsMatch substrings numerical
caseIgnoreMatch equality case insensitive, space insensitive
caseIgnoreOrderingMatch ordering case insensitive, space insensitive
caseIgnoreSubstringsMatch substrings case insensitive, space insensitive
caseExactMatch equality case sensitive, space insensitive
caseExactOrderingMatch ordering case sensitive, space insensitive
caseExactSubstringsMatch substrings case sensitive, space insensitive
caseIgnoreIA5Match equality case insensitive, space insensitive
caseIgnoreIA5OrderingMatch ordering case insensitive, space insensitive
caseIgnoreIA5SubstringsMatch substrings case insensitive, space insensitive
caseExactIA5Match equality case sensitive, space insensitive
caseExactIA5OrderingMatch ordering case sensitive, space insensitive
caseExactIA5SubstringsMatch substrings case sensitive, space insensitive

Tabla 3: Reglas de plantillas de atributos

 

Regresando nuevamente a la clase de objeto contribuyente y con la base de los conceptos para crear las clases de objetos y atributos en una especificación de esquema, se define el esquema en el archivo de texto con el nombre contribuyente.schema en el directorio schema de la ruta donde está instalado OpenLDAP, con el siguiente contenido:

#
# OID prefix: 1.3.6.1.4.1.10018
#
# Attributes: 1.3.6.1.4.1.10018.1.1
#

attributetype ( 1.3.6.1.4.1.10018.1.1.1 NAME 'ruc'
	DESC 'Registro Único del Contribuyente'
	EQUALITY numericStringMatch
	SUBSTR numericStringSubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.36{11} )

attributetype ( 1.3.6.1.4.1.10018.1.1.2 NAME 'razonSocial'
	DESC 'Razón Social del Contribuyente'
	SUP name )

attributetype ( 1.3.6.1.4.1.10018.1.1.3 NAME 'dni'
	DESC 'Documento Nacional de Identidad de la Persona'
	EQUALITY numericStringMatch
	SUBSTR numericStringSubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.36{8} )

attributetype ( 1.3.6.1.4.1.10018.1.1.4 NAME 'dniRepLegal'
	DESC 'Documento Nacional de Identidad del Representante Legal del contribuyente'
	EQUALITY numericStringMatch
	SUBSTR numericStringSubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.36{8} )

attributetype ( 1.3.6.1.4.1.10018.1.1.5 NAME 'estadoDomicilio'
	DESC 'Estado del Domicilio del contribuyente'
	SUP name )

attributetype ( 1.3.6.1.4.1.10018.1.1.6 NAME 'direccion'
	DESC 'Domicilio de la Persona'
	SUP name )

#
# Objects: 1.3.6.1.4.1.10018.1.2
#

objectclass ( 1.3.6.1.4.1.10018.1.2.1 NAME 'contribuyente'
	DESC 'contribuyente'
	SUP top AUXILIARY
	MUST ( ruc $ dni )
	MAY ( dniRepLegal $ estadoDomicilio $ razonSocial $ direccion) )
 

La especificación de esquema contribuyente debe ser agregado en el archivo de configuración slapd.conf la siguiente línea.

include		./schema/contribuyente.schema

Una vez creado el archivo y guardado reiniciamos nuestro servicio de directorio OpenLDAP.

Antes de continuar con agregar el directorio definido anteriormente en el fichero mapaza.ldif es necesario crear las unidades organizacionales, tal como se ha visto en el árbol LDAP del gráfico, sino creamos estas unidades organizacionales no es posible agregar esta entrada de directorio. Para esto creamos un archivo de texto con el nombre ounspsac.ldif con el siguiente contenido.

dn: ou=Admin,dc=nspsac,dc=com
objectClass: top
objectClass: organizationalUnit
ou: Admin

dn: ou=People,dc=nspsac,dc=com
objectClass: top
objectClass: organizationalUnit
ou: People

dn: ou=Developer,dc=nspsac,dc=com
objectClass: top
objectClass: organizationalUnit
ou: Developer
 

Para agregar un directorio de entrada LDAP en formato LDIF ejecutaremos el siguiente comando.

slapadd -v -f slapd.conf -l ounspsac.ldif

De otra forma también es posible insertar los datos de entrada del directorio con el siguiente comando.

ldapadd -x -D "cn=root,dc=nspsac,dc=com" -w abc -f ounspsac.ldif

De modo similar ahora añadimos al directorio LDAP lo que habíamos definido inicialmente.

slapadd -v -f slapd.conf -l mapaza.ldif

Y así añadimos otras entradas de directorio LDAP, pero ahora la contraseña del usuario será encriptado con {SSHA} y es de la siguiente manera.

dn: uid=jmamani,ou=People,dc=nspsac,dc=com
givenName: Juan Antonio
sn: Mamani Choque
mail: jmamani@nspsac.com
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: contribuyente
uid: jmamani
cn: Juan Antonio Mamani Choque
dni: 01847569
ruc: 10018475691
employeeNumber: 2097
mobile: 0519535353
direccion: Av. Titicaca Nro. 458
st: Puno
l: Juli
userPassword: {SSHA}IabIHNeVpLkbzDxCANEMj47OJ9QRh9Gj

Para generar una cadena de texto encriptada se hace uso del comando slappasswd que trae OpenLDAP de la siguiente manera:

slappasswd -h {SSHA} -s abc

Y continuando con agregar una entrada de directorio LDAP.

slapadd -v -f slapd.conf -l jmamani.ldif

Como se ha visto se ha tenido que agregar en tres veces las entradas de directorio LDAP definidos, pero no es necesario realizar para cada entrada de directorio, es posible juntar las tres entradas de directorio en un solo formato LDIF denominado nspsac.ldif.

Luego de haber insertado datos de entrada de directorio podemos hacer uso del comando slapcat para mostrar todas las entradas de directorio que se encuentra en nuestro directorio LDAP en formato LDIF, esto mismo nos puede servir para guardar estas entradas para lo que sea necesario.

Si se desea realizar una búsqueda mediante un DN es mediante el comando ldapsearch.

ldapsearch -x -b "uid=jmamani,ou=People,dc=nspsac,dc=com"

Asimismo es posible eliminar entradas de directorio LDAP mediante el comando ldapdelete.

ldapdelete -x -D "cn=root,dc=nspsac,dc=com" -w abc "uid=jmamani,ou=People,dc=nspsac,dc=com"

 

 

 

Otros Artículos en esta sección

¿Alguna duda? Sientete libre de hacer tus pruntas en nuestro:
foro deProgramación »