Está en la página 1de 45

UNIVERSIDAD DE EL SALVADOR FACULTAD MULTIDISCIPLINARIA DE OCCIDENTE DEPARTAMENTO DE INGENIERIA

CATEDRA: Protocolos de comunicaci ón TRABAJO: “Cluster de replicación de datos” DOCENTE: Ing. Juan Carlos
CATEDRA:
Protocolos de comunicaci ón
TRABAJO:
“Cluster de replicación de datos”
DOCENTE:
Ing. Juan Carlos Pe ña
PRESENTAN:
Maga ña Dahbura, Jos é Rodrigo
Minero Morales, Roberto Orlando
Rodr í guez Uma ña, V íctor Manuel
FECHA DE ENTREGA:
Santa Ana 18 de junio de 2009

CLUSTER REPLICACION DE DATOS CON LDAP SOBRE DEBIAN LENNY/SQUEEZE

Introducción

En el presente material se explica, de forma concisa, un esquema de migración y replica de datos entre servidores LDAP. El esquema involucra tres servidores LDAP, un servidor inicial con un esquema básico realizado a la medida de la organización; un segundo servidor que a su contenido agregará el del primero, sea por referencia o por migración; y un tercer servidor de réplica de datos del segundo por medio de una relación maestro-esclavo.

del segundo por medio de una relación maestro-esclavo. Aunque es obvio, aclaramos que los equipos deben

Aunque es obvio, aclaramos que los equipos deben estar interconectados y ser ruteables entre ellos.

Para el caso, hemos supuesto la existencia de un servidor DNS. Este servicio puede ser provisto desde otro equipo físico, sin embargo, en nuestro caso lo hemos configurado en un equipo que también corre el servicio de LDAP, aunque dicha configuración es un tema adicional y no se aborda aquí. El servicio de DNS debe responder con las siguientes resoluciones:

Dirección IP

FQDN

192.168.1.3

ldap.amnet.tigo.com.sv

192.168.1.4

slave.amnet.tigo.com.sv

192.168.1.100

Ldap.tigo.com.sv

Creación del archivo de definición del esquema

LDAP incluye archivos de esquema por defecto, sin embargo, se pueden crear definiciones de atributos y clases a la medida dentro de un fichero que, como buena práctica, suele ser llamado “local.schema” y estar contenido en el directorio “/etc/ldap/schema”.

Par crear tanto un atributo como una clase, se debe hacer uso de un OID, el cual no es mas que un identificador de los elementos; su sintaxis es de numeros separados por puntos. Los OID son únicos y se pueden registrar los creados por cada organización estructuralmente bajo un OID asignado a la organización, sin embargo, para fines experimentales se pueden crear OIDs experimentales bajo 1.1, específicamente, se debe utilizar como base 1.1.2.1 para los atributos y 1.1.2.2 para las clases. La sintaxis para la creación de atributos se define de la siguiente manera:

AttributeTypeDescription = "(" whsp numericoid whsp

[

"NAME" qdescrs ]

; AttributeType identifier ; name used in AttributeType

[

"DESC" qdstring ]

; description

[

"OBSOLETE" whsp ]

[

"SUP" woid ]

; derived from this other

[

"EQUALITY" woid

; AttributeType ; Matching Rule name

[

"ORDERING" woid

; Matching Rule name

[

"SUBSTR" woid ]

; Matching Rule name

[

"SYNTAX" whsp noidlen whsp ] ; Syntax OID

[

"SINGLE-VALUE" whsp ]

; default multi-valued

[

"COLLECTIVE" whsp ]

; default not collective

[

"NO-USER-MODIFICATION" whsp ]; default user modifiable

[ "USAGE" whsp AttributeUsage ]; default userApplications whsp ")"

Donde whsp equivale a un espacio.

Otra práctica muy utilizada y con fines distintivos, aunque no obligatoria es iniciar el nombre de los atributos con “x-”.

Para ejemplificar lo dicho, mostramos la definición de un atributo utilizado para los documentos de identificación personal:

attributetype ( 1.1.2.1.1 NAME 'x-numDocumento' DESC 'Numero de Documento Personal' EQUALITY caseIgnoreMatch ORDERING caseIgnoreOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{20}

)

Podemos notar que se utiliza el primer OID utilizado para atributos (1.1.2.1.1) y al atributo se le asigna el nombre “x-numDocumento” y la descripción “Numero de Documento Personal”. Se establen criterios de igualdad y ordenamiento para cadenas ignorando la existencia de mayúsculas y se define la sintaxis como Cadena de caracteres con longitud 20.

Los tipos de sintaxis, así como las reglas de igualación y ordenación se pueden encontrar en la documentación de OpenLDAP (http://www.openldap.org).

Los atributos también pueden heredar de otros atributos; aspecto que es notorio en el ejemplo completo mostrado con posterioridad.

Por su parte, la sintaxis de definición de las clases es:

ObjectClassDescription = "(" whsp

numericoid whsp

; ObjectClass identifier

[

"NAME" qdescrs ]

[

"DESC" qdstring ]

[

"OBSOLETE" whsp ]

[

"SUP" oids ]

; Superior ObjectClasses

[

( "ABSTRACT" / "STRUCTURAL" / "AUXILIARY" ) whsp ]

; default structural

[

"MUST" oids ]

; AttributeTypes

[ "MAY" oids ] whsp ")"

; AttributeTypes

Para el caso, citamos el ejemplo de la clase de definición de una persona:

objectclass ( 1.1.2.2.1 NAME 'persona' DESC 'Clase persona, generica para diversos fines organizacionales' SUP person MUST ( x-id $ x-numDUIoPasaporte $ x-NIT $ x- fechaNacimiento $ x-nacionalidad $ x-sexo $ x-direccionResidencial )

MAY ( x-correoElectronico $ x-telefonoResidencial $ x- telefonoMovil )

)

En primer lugar, se hace uso del primer OID asignable para clases (1.1.2.2.1) y se le asigna como nombre “persona”, especificando que se heredará de la clase “person”. Además, podemos notar que se hace uso de los atributos que han sido creados con anterioridad. Los atributos incluídos dentro de MUST son obligatorios, mientras que los incluídos dentro de MAY son opcionales.

Lo que habría que hacer entonces para tener un fichero que defina esquemas propios es crear y editar el archivo “local.schema”:

# nano /etc/ldap/schema/local.schema

El fichero completo debe quedar de una manera similar a la siguiente:

########################### # DEFINICION DE ATRIBUTOS # ###########################

#Atributos referentes a documentos de identificacion personal

attributetype ( 1.1.2.1.1 NAME 'x-numDocumento' DESC 'Numero de Documento Personal' EQUALITY caseIgnoreMatch ORDERING caseIgnoreOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{20}

)

attributetype ( 1.1.2.1.2 NAME 'x-numDUIoPasaporte'

DESC 'Numero Unico de Identidad o Numero de Pasaporte' SUP x-numDocumento SINGLE-VALUE

)

attributetype ( 1.1.2.1.3 NAME 'x-NIT'

DESC 'Numero de Identificacion Tributaria' SUP x-numDocumento SINGLE-VALUE

)

attributetype ( 1.1.2.1.4 NAME 'x-numISSS' DESC 'Numero de carnet de Seguro Social'

SUP x-numDocumento SINGLE-VALUE

)

attributetype ( 1.1.2.1.5 NAME 'x-NUP' DESC 'Numero Unico de Prevision' SUP x-numDocumento SINGLE-VALUE

)

attributetype ( 1.1.2.1.6 NAME 'x-licConducir' DESC 'Numero de Licencia de Conducir' SUP x-numDocumento

)

#Atributos referentes a datos personales diversos

attributetype ( 1.1.2.1.7 NAME 'x-fechaNacimiento' DESC 'Fecha de Nacimiento en formato DD/MM/AAAA' EQUALITY caseIgnoreMatch ORDERING caseIgnoreOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{10} SINGLE-VALUE

)

attributetype ( 1.1.2.1.8 NAME 'x-nacionalidad' DESC 'Pais de nacionalidad en codigo de dos letras' SUP countryName SINGLE-VALUE

)

attributetype ( 1.1.2.1.9 NAME 'x-sexo'

DESC 'Sexo de la persona (M|F)' EQUALITY caseIgnoreMatch ORDERING caseIgnoreOrderingMatch

SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{1} SINGLE-VALUE

)

#Atributos de Identificacion

attributetype ( 1.1.2.1.10 NAME 'x-id'

DESC 'Identificador alfanumerico del objeto para fines organizacionales' EQUALITY caseIgnoreMatch ORDERING caseIgnoreOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{10} SINGLE-VALUE

)

#Atributos de contacto

attributetype ( 1.1.2.1.11 NAME 'x-correoElectronico' DESC 'Direccion del buzon de correo electronico' SUP emailAddress

)

attributetype ( 1.1.2.1.12 NAME 'x-telefonoResidencial' DESC 'Numero telefonico residencial' SUP telephoneNumber

)

attributetype ( 1.1.2.1.13 NAME 'x-telefonoMovil' DESC 'Numero telefonico movil'

SUP telephoneNumber

)

attributetype ( 1.1.2.1.14 NAME 'x-telefonoLaboral' DESC 'Numero telefonico del lugar de trabajo' SUP telephoneNumber

)

attributetype ( 1.1.2.1.15 NAME 'x-direccionResidencial' DESC 'Direccion postal residencial' SUP postalAddress

)

attributetype ( 1.1.2.1.16 NAME 'x-direccionLaboral' DESC 'Direccion postal laboral' SUP postalAddress

)

#Atributos de informacion adicional

attributetype ( 1.1.2.1.17 NAME 'x-fechaAceptacionCliente' DESC 'Fecha de inicio como cliente en formato DD/MM/AAAA' EQUALITY caseIgnoreMatch ORDERING caseIgnoreOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{10} SINGLE-VALUE

)

attributetype ( 1.1.2.1.18 NAME 'x-ingresoMensual' DESC 'Ingreso monetario promedio mensual' EQUALITY integerMatch ORDERING integerOrderingMatch

SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE

)

######################## # DEFINICION DE CLASES # ########################

objectclass ( 1.1.2.2.1 NAME 'persona' DESC 'Clase persona, generica para diversos fines organizacionales' SUP person

MUST ( x-id $ x-numDUIoPasaporte $ x-NIT $ x-fechaNacimiento $ x-nacionalidad $ x-sexo $ x-direccionResidencial ) MAY ( x-correoElectronico $ x-telefonoResidencial $ x- telefonoMovil )

)

objectclass ( 1.1.2.2.2 NAME 'empleado' DESC 'Empleado de la organizacion' SUP persona

MUST ( x-numISSS $ x-NUP $ x-licConducir )

)

objectclass ( 1.1.2.2.3 NAME 'cliente' DESC 'Empleado de la organizacion' SUP persona MUST ( x-fechaAceptacionCliente $ x-ingresoMensual ) MAY ( x-telefonoLaboral $ x-direccionLaboral )

Instalación y configuración inicial del servidor LDAP

En primer lugar, debemos instalar el software requerido para levantar el servicio de LDAP.

# apt-get install slapd

Al momento de instalar, nos pedirá algunos parámetros de configuración como la contraseña para el uso de LDAP.

Por defecto, el árbol se estructura a partir del nombre del dominio al que pertenece el equipo, si se desea cambiar esto o alguna otra configuración como compatibilidad con versiones anteriores de LDAP, entre otras, se puede hacer uso de:

# dpkg-reconfigure slapd

Ahora, podemos pasar a editar el principal archivo de configuración de LDAP, nombrado “slapd.conf”:

# nano /etc/ldap/slapd.conf

En primera instancia, encrontraremos la inclusión de los archivos contenedores de la definición del esquema. Debemos crear una entrada de inclusión para el fichero que con anterioridad ha sido creado para la definición de atributos y clases propias

# Inclusion de esquemas locales

include

/etc/ldap/schema/local.schema

El siguiente paso fundamental de configuración es establecer un súper usuario para los fines del uso de LDAP:

rootdn

"cn=admin,dc=amnet,dc=com,dc=sv"

rootpw

{SSHA}PuYGSwerIy/NgXGE4gkf7/GlV8WozboD

En este caso particular, se ha hecho uso de una contraseña encriptata para esto utilizamos la siguiente línea de comandos:

# slappasswd

Luego introducimos la contraseña y copiamos el texto equivalente encriptado que nos devuelve para instroducirlo como valor de “rootpw” dentro del fichero slapd.conf.

Guardamos los cambios realizados sobre el archivo de configuración y cerramos.

Para simplificar las tareas y tener un software de administración relativamente sencillo y con interfaz gráfica podemos instalar phpLDAPadmin:

# apt-get install phpldapadmin

Para poder hacer uso de esta aplicación de administración web para LDAP, abrimos un navegador y vamos a la url “localhost/phpldapadmin”, nos logueamos y podemos hacer uso del explorador del árbol hubicado en el lado izquierdo para seleccionar un área específica de la estructura de árbol de nuestro servidor LDAP y utilizamos las opciones de la parte derecha para hacer modificaciones.

La siguiente imagen muestra la interfaz de phpLDAPadmin:

las opciones de la parte derecha para hacer modificaciones. La siguiente imagen muestra la interfaz de

Si deseamos agregar un objeto de las clases que hemos creado con anterioridad para nuestro esquema, seleccionamos la entrada en la que estará contenida y vamos a la opción “Create a child entry”, con la variante que la clase no aparecerá listada por lo que tenemos que seleccionar la opción “Default”:

por lo que tenemos que seleccionar la opción “Default”: Nos aparecerá un cuadro de diálogo en

Nos aparecerá un cuadro de diálogo en el que debemos seleeciona la calse que hemos creado y de cuyo tipo queremos agregar un objeto. Para el caso, hemos ubicado la clase “empleado” definida en el fichero “local.schema”:

Nos aparecerá la pantalla en que podemos asignar valores a los atributos del objeto. Para

Nos aparecerá la pantalla en que podemos asignar valores a los atributos del objeto.

Para

http://phpldapadmin.sourceforge.net.

documentación

adicional

sobre

el

uso

de

phpLDAPadmin,

remítase

a

Uso de referencias como opción a la migración de datos

En el caso planteado, se tiene un servidor LDAP del que se desea obtener la información por medio de otro servidor de nivel superior. Una opción sería hacer una copia de todos los datos contenidos en el primero al segundo, sin embargo, en bases de datos con gran cantidad de contenido, esto puede tener algún costo considerable de recursos, por lo que puede desearse tener un directorio de datos “particionado” como se le suele llamar. Para poder realizar esta tarea, contamos con la clase “referral”, incluída en el core de LDAP.

Em primer lugar, debemos crear un fichero con la siguiente estructura LDIF para especificar los valores para los atributos del objeto:

$ nano agregarReferencia.ldif

El fichero debe contener la siguiente estructura:

dn:ou=empleadosAmnet,ou=empleados,dc=tigo,dc=com,dc=sv dc:empleadosAmnet objectClass: referral objectClass: extensibleObject ref: ldaps://ldap.amnet.tigo.com.sv/ou=empleados,dc=amnet,dc=com,dc=sv

En primer lugar, se especifica el dn del lugar del árbol en que estará contenida la referencia, para el caso, dentro de la unidad organizacional “empleados” se ha creado una nueva unidad organizacional llamada “empleadosAmnet”, nombre que pasa a ser el mismo componente de dominio. Luego, se especifica que indica que va a ser una instancia de las clases “referral” y “extensibleObjetc”. Por

último, se especifica hacia donde estará apuntando la referencia por medio de la URI del recurso al que

se hace referencia. Vale aclarar que es la URI la que define si se hará uso de transporte seguro o no, en este caso particular, se está haciendo uso de TLS.

Guardamos el fichero y cerramos el editor.

A este momento, ya existe la referencia y podemos acceder a datos del otro servidor. Si estamos

utilizando ldapsearch, será necesario utilizar el parámetro -C para indicar que la búsqueda debe seguir las referencias. Por ejemplo, la sentencia para la búsqueda podría quedar de la siguiente manera:

$ ldapsearch -x -b dc=tigo,dc=com,dc=sv -D cn=admin,dc=tigo,dc=com,dc=sv “(objectclass=*)” * -H ldap://ldap.tigo.com.sv -W -C

Con esta sentencia estaríamos obteniendo como resultado todos los objetos que se encuentren estructuralmente debajo de la raíz del árbol de tigo.

Si se desea eliminar la referencia, se debe hacer por medio del dn de la misma y haciendo uso del

parámetro -M, así por ejemplo:

$ ldapdelete ou=clientesAmnet,ou=clientes,dc=tigo,dc=com,dc=sv -D cn=admin,dc=com,dc=sv -W -M

Servidor OpenLDAP con SSL/TLS

Software utilizado:

Debian Lenny/Squeeze OpenLDAP OpenSSL gnuTLS

1.Instalación de paquetes adicionales:

# apt-get install openssl gnutls-bin

2.Creación de certificados:

Para habilitar la conexión SSL/TLS en el servidor, se necesita un certificado de servidor. Además, en un saludo SSL el certificado de servidor solo provee una conexión segura y encriptada al servidor. Si se desea autenticación del cliente, entonces se le debe presentar al servidor LDAP un certificado de cliente y su llave. Para crear estos certificados utilizaremos comandos de OpenSSL. Cuando se le pregunte por el 'Common Name', se debe introducir el nombre distinguido calificado del servidor, ej:

tigo.com.sv y no 'su nombre' como lo sugiere OpenSSL. Este es un error que causa la gran mayoría de fallas de certificados de servidor.

Certificado dado por un CA Para crear un CA y los certificados de servidor y su llave privada, se siguen los siguientes pasos:

1)Crear un directorio para crear y firmar los certificados.

#mkdir ~/certs

2)Cambiarse al directorio recién creado y correr el script CA de OpenSSL.

#cd ~/certs #/usr/lib/ssl/misc/CA.pl -newca

Esto crea el cacert.pem y el cakey.pem en el directorio donde se tiene especificado que

el CA.

estará

3)Crear la petición de firmado para el certificado de servidor (Certificate Signing Request)

#openssl req -newkey rsa:1024 -nodes -keyout newreq.pem -out newreq.pem

El resultado es newreq.pem

4)Hacer que la CA firme la CSR

#/usr/lib/ssl/misc/CA.pl -sign

Esto crea el newcert.pem (certificado de servidor firmado por la CA) con una llave primaria newreq.pem.

5)Mover los certificados al lugar deseado:

#cp /etc/ssl/CA/cacert.pem /etc/ldap/ssl/cacert.pem #mv newcert.pem /etc/ldap/ssl/servercrt.pem #mv newreq.pem /etc/ldap/ssl/serverkey.pem

Tiene que estar seguro que el dueñ o de los certificados es el mismo usuario que ejecuta slapd. Los certificados deben poder ser le ídos pú blicamente.

6)Hacer el certificado de CA disponible a los clientes LDAP. Si el cliente esta en la misma máquina, tiene que copiar el cacert.pem a un lugar que sea accesible por el cliente. Si los clientes están en otras computadoras, entonces el cacert.pem debe ser copiado a esas computadoras y hacerlo accesible.

Certificados de cliente

Los certificados de clientes se crean de forma similar a los certificados de servidor. Usando los mismos pasos anteriormente descritos, los ú nicos cambios son los siguientes:

Paso 1 y 2: Saltarlo, la CA no tiene que ser creado de nuevo.

Paso 3: El mismo comando pero ingrese el nombre del cliente en vez del nombre del servidor cuando se le pregunte por el Common Name. Paso 4: El mismo comando resultando con los archivos para el certificado y la llave primaria. Paso 5: Mover los certificados al lugar deseado por el usuario y renombrarlos:

#mv newcert.pem ~/certs/ldap.client.pem

#mv newreq.pem ~/certs/ldap.client.key.pem

Paso 6: Saltarlo.

3.Configuració n de LDAP.

Para configurar OpenLDAP, hay que considerar dos áreas: el servidor (slapd.conf) y el cliente(ldap.conf)

Servidor:

Modificar el archivo slapd.conf de manera que incluya por lo menos las siguientes directivas:

TLSCipherSuite TLS_RSA_AES_256_CBC_SHA1 TLSCACertificateFile /etc/ldap/ssl/cacert.pem TLSCertificateFile /etc/ldap/ssl/servercrt.pem TLSCertificateKeyFile /etc/ldap/ssl/serverkey.pem

# Si se requiere autenticación de clientes #TLSVerifyClient demand … o si no se desea TLSVerifyClient never

Cliente:

El archivo ldap.conf contiene valores por defecto para todos los clientes LDAP de un sistema. Si se requiere valores específicos para un usuario, entonces se aplican las mismas

directivas para el archivo ldaprc o .ldaprc en el home del usuario. Si se está implementando autenticació n de cliente, es requerido que se añ ada el certificado de cliente y su llave al archivo ldaprc or .ldaprc

Ejemplo de ldap.conf

#

#

Global LDAP settings

#

#

See ldap.conf(5) for details

#

This file should be world readable but not world writable.

HOST ldap.tigo.com.sv PORT 636

TLS_CACERT /etc/ldap/ssl/cacert.pem TLS_REQCERT demand

Esta configuració n se conectar á a ldaps://ldap.tigo.com.sv:636 sin la necesidad de especificar el host y el puerto en los comandos del cliente.

Ejemplo de ldaprc

Este archivo se usa para sobreescribir valores globales de LDAP y para establecer el certificado y llave privada usada para establecer autenticació n del cliente.

#

#

User specific LDAP settings

#

#

Override global directive (if set)

TLS_REQCERT demand

# client authentication

TLS_CERT /home/usuario/certs/ldap.client.pem TLS_KEY /home/usuario/certs/ldap.client.key.pem

Iniciamos el servidor en modo debug con el comando:

#slapd -d127 -h "ldap:/// ldaps:///"

As í iniciamos el servidor escuchando en los puertos 389 y 636. Para hacer que OpenLDAP inicie autom áticamente en ambos puertos se tiene que modificar el archivo /etc/default/slapd,

quitando el comentario a la línea siguiente:

SLAPD_SERVICES="ldaps://127.0.0.1:636/ ldap://127.0.0.1:389/"

Podemos probar la conexió n segura con b ú squedas, por ejemplo si el cliente está en la computadora que el servidor escribimos:

$ldapsearch -x -b 'dc=tigo,dc=com,dc=sv' -D "cn=admin,dc=tigo,dc=com,dc=sv" '(objectclass=*)' -W

Si el cliente es una computadora distinta:

$ldapsearch -x -b 'dc=tigo,dc=com,dc=sv' -D "cn=admin,dc=tigo,dc=com,dc=sv" '(objectclass=*)' -H ldaps://ldap.tigo.com.sv -W

misma

Réplica de un servidor de OpenLDAP con Syncrepl y SSL/TLS

El motor de replicacion LDAP Sync (Syncrepl por sus siglás en inglés), es un motor de replicación que permite a un consumidor mantener una copia de un directorio. Para configurar una computadora que contenga una réplica sincronizada exacta de un directorio de OpenLDAP se tienen que configurar dos partes: el servidor y la réplica.

1.Servidor

Como utilizaremos una conexión SSL/TLS, el servidor tiene que estar configurado como lo hicimos en la sección de configuración de SSL/TLS. Además de esto se tiene que modificar el archivo slapd.conf para que incluya las siguientes directivas:

moduleload syncprov.la overlay syncprov syncprov-checkpoint 100 05 syncprov-sessionlog 100

2.Réplica

Como utilizaremos una conexión SSL/TLS, la réplica tiene que estar configurada como un cliente, de la misma manera como lo hicimos en la sección de configuración de SSL/TLS. Además se tiene que modificar el archivo slapd.conf para que incluya las siguientes directivas:

moduleload syncprov.la

overlay syncprov syncprov-checkpoint 100 05 syncprov-sessionlog 100

##Define la dirección de ldap del servidor maestro que puede aceptar

##las solicitudes de actualización. rootdn "cn=admin,dc=tigo,dc=com,dc=sv" rootpw {SSHA}tjbT+uoHBgqAsnGseYJN/Gmgu3XgjtP0

syncrepl rid=123 provider=ldaps://ldap.tigo.com.sv:636 #el servidor o proveedor type=refreshOnly

interval=00:00:00:10

searchbase="dc=tigo,dc=com,dc=sv" #desde donde se replicará bindmethod=simple binddn="cn=admin,dc=tigo,dc=com,dc=sv" #quién se conecta credentials=rootroot #contraseña

#se hará refrezco cada 10 segundos

updateref ldaps://ldap.tigo.com.sv #indica el servidor y tipo de conexión

Creación de aplicación Inteligente de Migración y aplicación de Búsqueda en Servidores OpenLDAP

Para el desarrollo de las aplicaciones se utilizó Java Naming and Directory Interface (JNDI). JNDI es una Interfaz de Programación de Aplicaciones (API) para servicios de directorio. Esto permite a los clientes descubrir y buscar objetos y nombres a través de un nombre. La API JNDI define un contexto que especifica donde buscar un objeto. El contexto inicial se usa normalmente como punto de partida. El contexto inicial será usado para buscar un nombre. El contexto inicial es análogo a la raíz de un árbol de directorios para un sistema de ficheros. La aplicación inteligente de migración y la de búsqueda comparten las mismas clases básicas: Entrada, LDAPConexion, LDAPManager. El migrador inteligente utiliza además la clase MigrationAssitant.

Descripción General de la clase Entrada

Descripción

Class Entrada

java.lang.Object

la clase Entrada Descripción Class Entrada java.lang.Object java.util.Dictionary<K,V> java.util.Hashtable

java.util.Dictionary<K,V>

Entrada java.lang.Object java.util.Dictionary<K,V> java.util.Hashtable arabrab.clases.Entrada All Implemented

java.util.Hashtable

java.util.Dictionary<K,V> java.util.Hashtable arabrab.clases.Entrada All Implemented Interfaces:

arabrab.clases.Entrada

All Implemented Interfaces:

java.io.Serializable, java.lang.Cloneable, java.util.Map

public class Entrada extends java.util.Hashtable

Esta clase representa una entrada con atributos en un servidor OpenLDAP.

Constructores

Entrada

public Entrada()

Crea un nuevo objeto Entrada. Los parámetros por defecto son: dn= "", nombreCorto="", padre=null.

Entrada

public Entrada(Entradaentry) Crea un nuevo objeto Entrada.

Parameters:

entry - Es la representación de una entrada en el servidor.

Métodos en Detalle

setDN

public void setDN(java.lang.String dn)

Establece el DN de esta Entrada.

Parameters:

dn - El nombre distintivo de esta Entrada.

getDN

public java.lang.String getDN()

Obtiene el DN de ésta Entrada.

Returns:

El nombre distintivo para esta Entrada.

getNombreCorto

public java.lang.String getNombreCorto()

Obtiene el nombre corto de esta Entrada.

Returns:

El nombre corto de esta Entrada.

setNombreCorto

public void setNombreCorto(java.lang.String nombreCorto)

Establece el nombre corto de ésta Entrada.

Parameters:

nombreCorto - El nombre corto para esta Entrada.

getPadre

public Entrada getPadre() Obtiene la Entrada padre de esta Entrada.

Returns:

La entrada superior de esta Entrada en el servidor. Retorna null si no tiene superior.

setPadre

public void setPadre(Entrada padre) Establece quien es la entrada padre de ésta Entrada.

Parameters:

padre - La entrada superior para esta Entrada en el servidor.

toString

public java.lang.String toString()

Representa en texto esta Entrada. La representación textual de esta Entrada es su nombre corto.

Overrides:

toString in class java.util.Hashtable Returns:

Un texto que representa esta Entrada en el servidor.

Descripción General de la clase LDAPConexion

Descripción

Class LDAPConexion

java.lang.Object

Descripción Class LDAPConexion java.lang.Object lucia.clases.LDAPConexion public class LDAPConexionextends

lucia.clases.LDAPConexion

public class LDAPConexionextends java.lang.Object Esta clase representa una conexión con un servidor OpenLDAP.

Constructores

LDAPConexion

public LDAPConexion(java.lang.String host, int puerto, java.lang.String dnUser, java.lang.String psswUser)

Crea un nuevo objeto LDAPConexion.

Parameters:

host - El host con el que se establecerá la conexión. puerto - El número de puerto donde se enlazará la conexión. dnUser - El DN del Usuario con que el que se conectará. psswUser - Es la contrasena del Usuario con que el que se conectará.

Métodos en Detalle

getHost

public java.lang.String getHost()

Obtiene el host de ésta LDAPConexion.

Returns:

El host con el que ha establecido la conexión.

setHost

public void setHost(java.lang.String host)

Establece el host de ésta LDAPConexion.

Parameters:

host - El host con el que se establecerá la conexión.

getPuerto

public int getPuerto()

Obtiene el puerto de ésta LDAPConexion.

Returns:

El puerto con el que se ha enlazado la conexión.

setPuerto

public void setPuerto(int puerto)

Establece el puerto de ésta LDAPConexion.

Parameters:

puerto - El puerto con el que se establecerá la conexión.

getDnUser

public java.lang.String getDnUser()

Obtiene el DN del usuario de ésta LDAPConexion.

Returns:

El DN del Usuario con que el que se ha establecido la conexión.

setDnUser

public void setDnUser(java.lang.String dnUser)

Establece el DN del usuario para ésta LDAPConexion.

Parameters:

dnUser - El DN del Usuario con que el que se establecerá la conexión.

getPsswUser

public java.lang.String getPsswUser()

Obtiene la contraseña de usuario para ésta LDAPConexion.

Returns:

El contrasena del Usuario con que el que se ha establecido la conexión.

setPsswUser

public void setPsswUser(java.lang.String psswUser)

Establece el passwor del usuario para ésta LDAPConexion.

Parameters:

psswUser - La contraseña del usuario con que el que se establecerá

la conexión.

open

public javax.naming.directory.DirContext open() throws javax.naming.NamingException

Abre la conexión con el servidor LDAP.

Returns:

La interfaz de servicio de directorio. Este contiene los métodos

para examinar y actualizar los atributos asociados con los objetos, además de buscar en el servidor. Throws:

javax.naming.NamingException

close

public void close(javax.naming.directory.DirContext dc)

Cierra la conexión con el servidor LDAP.

Parameters:

dc - La interfaz de servicio de directorio.

Descripción General de la clase LDAPManager

Descripción

Class LDAPManager

java.lang.Object

Descripción Class LDAPManager java.lang.Object lucia.clases.LDAPManager public class LDAPManagerextends java.lang.Object

lucia.clases.LDAPManager

public class LDAPManagerextends java.lang.Object

Esta clase representa un objeto que administra el acceso a un servidor OpenLDAP. Esta permite realizar búsquedas y agregar nuevas entradas al directorio.

Constructores

LDAPManager

public LDAPManager()

Crea un nuevo objeto LDAPManager.

Métodos en Detalle

getDirectoryContext

public javax.naming.directory.DirContext getDirectoryContext()

Obtiene la interfaz de servicio de directorio de este LDAPManager.

Returns:

El DirContext de éste LDAPManager.

setDirectoryContext

public void setDirectoryContext(javax.naming.directory.DirContext directoryContext)

Establece la interfaz de servicio de directorio de este LDAPManager.

Parameters:

directoryContext - La interfaz de servicio de directorio

getLDAPConexion

public LDAPConexion getLDAPConexion()

Obtiene la LDAPConexion de este LDAPManager.

Returns:

La conexión LDAP con el servidor.

setLDAPConexion

public void setLDAPConexion(LDAPConexion LDAPConexion)

Establece la LDAPConexion de este LDAPManager.

Parameters:

LDAPConexion - La LDAPConexion a establecer en este LDAPManager.

buscar

public java.util.ArrayList<Entrada> buscar(java.lang.String base, java.lang.String alcance, java.lang.String filtro, java.lang.String[] atributos)

throws

javax.naming.directory.InvalidSearchFilterException,javax.naming.NameNotFou

ndException,javax.naming.NoPermissionException,javax.naming.CommunicationEx

ception,javax.naming.NamingException

Busca una o varias entradas en el directorio OpenLDAP.

Parameters:

base - Es el DN a partir de donde se empezará a buscar. alcance - Es el nivel que baja el LDAPManager en el servidor para encontrar las entradas que correspondan con el criterio de búsqueda. Los valores que puede tomar el alcance son: base cuando se desea buscar todas las entradas que correspondan exactamente con el DN de la base. one cuando se desea buscar un nivel por debajo de la base. Y sub cuando se quiere buscar todas las entradas que se encuentran por debajo de la base, incluyendo las entradas anidadas. Si no se pasa un valor de estos, el valor por defecto es sub . filtro - Es un filtro de búsqueda. atributos - Es la lista de atributos de las entradas que nos interesa que la búsqueda arroje. Returns:

Una lista de Entradas encontradas en el servidor que corresponde con el criterio de la búsqueda. Throws:

javax.naming.directory.InvalidSearchFilterException - Excepción lanzada cuando el filtro de la búsqueda en un valor inválido. javax.naming.NameNotFoundException - Excepción lanzada cuando el DN de la base a partir de donde deseamos buscar, no se ha encontrado en el servidor. javax.naming.NoPermissionException - Excepción lanzada cuando el usuario con el se conectó al servidor no posee los privilegios para realizar búsquedas. javax.naming.CommunicationException - Excepción lanzada cuando al realizar la búsqueda ha existido un error de conexión con el servidor. javax.naming.NamingException - Excepción lanzada cuando la base de búsqueda no corresponde a un DN válido.

agregar

public void agregar(Entrada entrada, java.util.ArrayList<javax.naming.directory.Attribute> a

tributosExtra) throws javax.naming.directory.SchemaViolationException, javax.naming.directory.InvalidAttributesException, javax.naming.NameAlreadyBoundException, javax.naming.NoPermissionException, javax.naming.CommunicationException, javax.naming.NamingException

Agrega una nueva Entrada al directorio LDAP.

Parameters:

entrada - Es el objeto Entrada que deseamos agregar al servidor. atributosExtra - Son otros atributos agregados que deseamos que esta entrada aloje en el servidor. Por ejemplo esto es útil cuando una entrada tiene varios cn o varios ou. Throws:

javax.naming.directory.SchemaViolationException - Excepción lanzada cuando se está tratando de agregar atributos a una Entrada, cuyo esquema dentro del servidor no lo soporta. javax.naming.directory.InvalidAttributesException - Excepción lanzada cuando se trata agregar un atributo desconocido a la entrada en el servidor. javax.naming.NameAlreadyBoundException - Excepción lanzada cuando la entrada que se desea agregar, ya existe en el servidor. javax.naming.NoPermissionException - Excepción lanzada cuando el usuario con el que se conectó al servidor no posee los privilegios para agregar entradas. javax.naming.CommunicationException - Excepción lanzada cuando al tratar de agregar la entrada ha existido un error de conexión con

el servidor. javax.naming.NamingException - Excepción lanzada en cualquier otro tipo de error.

Descripción General de la clase MigrationAssistant Descripción

Class MigrationAssistant

java.lang.Object

Descripción Class MigrationAssistant java.lang.Object lucia.clases.MigrationAssistant public class

lucia.clases.MigrationAssistant

public class MigrationAssistantextends java.lang.Object

Esta clase representa un Asistente de migración entre dos servidores OpenLDAP.

Constructores

MigrationAssistant

public MigrationAssistant(LDAPManager origen, LDAPManager destino)

Crea un nuevo objeto para la asistencia de migración entre servidores.

Parameters:

origen - El administrador de acceso para el servidor de origen. destino - El administrador de acceso para el servidor de destino.

Métodos en Detalle

getLdapManagerOrigen

public LDAPManager getLdapManagerOrigen()

Obtiene el administrador de acceso del servidor de origen.

Returns:

El administrador de acceso del servidor de origen.

setLdapManagerOrigen

public void setLdapManagerOrigen(LDAPManager ldapManagerOrigen)

Establece el administrador de acceso para servidor de origen.

Parameters:

ldapManagerOrigen - El administrador de acceso para el servidor de origen.

getLdapManagerDestino

public LDAPManager getLdapManagerDestino()

Obtiene el administrador de acceso del servidor de destino.

Returns:

El administrador de acceso del servidor de destino.

setLdapManagerDestino

public void setLdapManagerDestino(LDAPManager ldapManagerDestino)

Establece el administrador de acceso para servidor de destino.

Parameters:

ldapManagerDestino - El administrador de acceso para el servidor de destino.

getEntradas

public java.util.ArrayList<Entrada> getEntradas()

Obtiene las entradas que migrará este asistente.

Returns:

Las entradas a migrar por este asistente.

setEntradas

public void setEntradas(java.util.ArrayList<Entrada> entradas)

Establece las entradas que migrará este asistente.

Parameters:

entradas - Las entradas que migraŕa este asistente.

getDestino

public Entrada getDestino()

Obtiene la Entrada dentro del servidor de destino donde se alojarán las entradas a migrar.

Returns:

La entrada dentro del servidor de destino donde se migrarán los datos.

setDestino

public void setDestino(Entrada destino)

Establece la Entrada dentro del servidor de destino donde se alojarán las entradas a migrar.

Parameters:

destino - La entrada dentro del servidor de destino donde se migrarán los datos.

getNotificaciones

public java.util.ArrayList<java.lang.String> getNotificaciones()

Obtiene las notificaciones de estado para cada entrada migrada.

Returns:

Las notificaciones de estado de migración para cada entrada migrada.

isConsevarAtributos

public boolean isConsevarAtributos()

Obtiene la decisión actual del asistente respecto a conservar los atributos en el destino.

Returns:

La decisión actual del asistente respecto a conservar los atributos de origen de las entradas a migrar en el destino.

setConsevarAtributos

public void setConsevarAtributos(boolean consevarAtributos)

Establece la decisión actual del asistente respecto a conservar los atributos en el destino.

Parameters:

consevarAtributos - La decisión actual del asistente respecto a conservar los atributos de origen de las entradas a migrar en el destino.

reiniciar

public void reiniciar()

Vuelve a un estado por defecto a este asistente. El proceso de reinicio consiste en limpiar la lista de entradas a migra, reiniciar el destino y limpiar la lista de notificaciones.

migrar

public void migrar()

Realiza la acción de migración de las entradas del servidor de origen al servidor de destino.

Creación de aplicación de Backup Anin

La aplicación de Backup utiliza las siguiente clases: Entrada, LDAPManager, LDAPConexion, Script y TransaccionBackup.

Descripción General de la clase Script

Descripción

Class Script

java.lang.Object

la clase Script Descripción Class Script java.lang.Object ldapBackup.clases.Script public class Scriptextends

ldapBackup.clases.Script

public class Scriptextends java.lang.Object

Esta clase un script a ejecutar.

Constructores

Script

public Script()

Crea una nueva instancia de la clase Script

Script

public Script(java.lang.String content)

Crea una nueva instancia de la clase Script.

Parameters:

content - El contenido del script a ejecutar.

Métodos en detalle

executeCommand

public void executeCommand() throws java.lang.Exception

Ejecuta el script.

Throws:

java.lang.Exception

getContenido

public java.lang.String getContenido()

Obtiene el contenido de este script.

Returns:

El contenido del script.

setContenido

public void setContenido(java.lang.String contenido)

Establece el contenido a ejecutar por este script.

Parameters:

contenido - El host con el que se establecerá la conexión.

getSHELL

public java.lang.String getSHELL()

Obtiene el SHELL que ejecutará de este script.

Returns:

El SHELL que ejecutará este script.

setSHELL

public void setSHELL(java.lang.String shell)

Establece el shell que ejecutará este script.

Parameters:

shell - El host con el que se establecerá la conexión.

Descripción General de la clase TransaccionBackup

Descripción

Class TransaccionBackup

java.lang.Object

Descripción Class TransaccionBackup java.lang.Object ldapBackup.clases.TransaccionBackup public class

ldapBackup.clases.TransaccionBackup

public class TransaccionBackupextends java.lang.Object

Esta clase representa un transacción de respaldo de datos de un servidor.

Constructores

TransaccionBackup

public TransaccionBackup()

Crea un nuevo objeto para una transacción de Backup.

Métodos en detalle

getPATH

public java.lang.String getPATH()

Obtiene la ruta dentro del sistema de archivos donde se almacenará el backup

Returns:

La ruta donde se almacenará el archivo de respaldo.

setPATH

public void setPATH(java.lang.String PATH)

Establece la ruta dentro del sistema de archivos donde se almacenará el backup

Parameters:

PATH - La ruta donde se almacenará el archivo de respaldo.

getArchivo

public java.lang.String getArchivo()

Obtiene el nombre del archivo donde se guardará el backup.

Returns:

El nombre del archivo donde se almacenará el respaldo.

setArchivo

public void setArchivo(java.lang.String archivo)

Establece el nombre del archivo donde se guardará el backup.

Parameters:

archivo - El nombre del archivo.

getDnBackup

public java.lang.String getDnBackup()

Obtiene el nombre del dn a partir de donde se ejecutará esta transacción de respaldo.

Returns:

El dn a partir de donde se ejecutará el backup.

setDnBackup

public void setDnBackup(java.lang.String dnBackup)

Establece el dn a partir de donde se ejecutará esta transacción de respaldo.

Parameters:

dnBackup - El dn a partir de donde se ejecutará el backup.

getHoraBackup

public Tiempo getHoraBackup()

Obtiene el tiempo en que se ejecutará esta transacción de respaldo.

Returns:

El tiempo en que se ejecutará la transacción.

setHoraBackup

public void setHoraBackup(Tiempo horaBackup)

Establece si el tiempo en que se ejecutará esta transacción de respaldo.

Parameters:

horaBackup - El tiempo en que se ejecutará la transacción.

getConexionLDAP

public LDAPConexion getConexionLDAP()

Obtiene la LDAPConexion de este transacción.

Returns:

La conexión LDAP con el servidor de esta transacción.

setConexionLDAP

public void setConexionLDAP(LDAPConexion conexionLDAP)

Establece la LDAPConexion de esta transacción.

Parameters:

conexionLDAP - El valor de true si las seguirá y el false sino.

isReferencias

public boolean isReferencias()

Obtiene si la transacción seguirá las referencias o no.

Returns:

El valor de true si las seguirá y el false sino.

setReferencias

public void setReferencias(boolean referencias)

Establece si la transacción seguirá las referencias o no.

Parameters:

referencias - El valor de true si las seguirá y el false sino.

isEstado

public boolean isEstado()

Obtiene el estado de esta transacción de respaldo.

Returns:

El valor de true si ya se ejecutó y false lo contrario

setEstado

public void setEstado(boolean estado)

Establece el estado de esta transacción de respaldo.

Parameters:

estado - El valor de true si ya se ejecutó y false lo contrario.

ejecutar

public void ejecutar() throws java.lang.Exception

Ejecuta la transacción de respaldo

Throws: java.lang.Exception - Excepción lanzada en caso de poder ejecutar el respaldo.