Acceso a LDAP mediante Netscape Directory SDK
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
-
Clase en java que calcula los puntos del contorno de un objeto dentro de una imagen binaria.En este artículo se plantea una introducción, totalmente funcional, a la generación de documentos XML para su posterior creación de fichero XML utilizando DOM (Document Object Model) de Java XERCES Parser v2.7.1Instalación paso a paso de Java Standar Edition Development Kit 7 en Ubuntu, Fedora, CentOS, Mint¿Alguna duda? Sientete libre de hacer tus pruntas en nuestro:
foro deProgramación »