lunes, 13 de agosto de 2012

Servidor LDAP (slapd)


1. LDAP

2. SERVIDOR LDAP


LDAP (Lightweight Directory Access Protocol), Protocolo de Acceso Ligero a Directorios es un protocolo de tipo cliente-servidor para acceder a un servicio de directorio. Un servidor LDAP es un servidor de datos optimizado para la realización rápida de consultas de lectura y orientado al almacenamiento de datos de usuarios a modo de directorio.


La principal utilidad de un directorio LDAP es como servidor de autentificación para los distintos servicios de un sistema informático como puedan ser: autentificación para entrar en un PC, para entrar en una aplicación web, para acceder a un servidor ftp, para acceder a servidores de correo entrante POP3 y saliente SMTP, etc.


3. SISTEMA OPERATIVO


La presente instalación, se la hará en un Sistema Operativo Linux, Distribución Debian, Versión 6 (Squeeze).


4. PAQUETES INSTALADOS


slapd, ldaputils, phpldapadmin

5. INSTALACIÓN DEL SERVIDOR LDAP


Se comenzará instalando en el servidor con los paquetes slapd y ldap-utils.


Para instalar únicamente el servidor y sus utilidades ejecutar:

# apt-get install slapd ldap-utils


Si hay algún inconveniente con la instalación debido a falta de dependencias, ejecutar lo siguiente, ya que se trata de todos los paquetes de los cuales depende en servidor ldap:


# apt-get install slapd ldap-utils php5-ldap phpldapadmin libnss-ldapd libpam-ldapd libsasl2-modules-ldap sasl2-bin db4.8-util


Seguido de esto, el asistente solicitará una contraseña para el administrador del servidor, para lo cual se introduce una contraseña y en el siguiente paso vuelve a pedirla para verificarla.




Durante la instalación, se presentarán algunas pantallas que permitirán configurar una serie de parámetros, pero en el caso que no aparecieran las pantallas de configuración y al final nos lance a la terminal nuevamente, hay que ejecutar la configuración del servidor LDAP de la siguiente manera:


# dpkg-reconfigure slapd


El primer paso será seleccionar NO, para volver a configurar el servidor


Introducir el nombre del dominio que usará LDAP.


5.1. INSTALACIÓN Y CONFIGURACIÓN DEL CLIENTE


apt-get install libnss-ldapd libpam-ldapd nscd nslcd


5.2. ADMINISTRAR OBJETOS DE DIRECTORIO (USUARIOS Y GRUPOS)


En esta sección se explicará como administrar objetos del directorio LDAP desde la consola de Linux Debian.

Lo primero que se debe hacer es crear un archivo con extensión .LDIF. Luego se creará una “Unidad Organizacional”, para lo cuál el archivo que se haya creado, debe contener lo siguiente:


dn: ou=Usuarios,dc=dominio,dc=com
objectclass: top
objectclass: organizationalUnit
ou: Usuarios

Antes de proceder a agregar el objeto al directorio LDAP, se debe detener el servidor LDAP de la siguiente manera:


# /etc/init.d/slapd stop


Ahora si se procederá a añadir el objeto al servidor, de la siguiente manera:


# slapadd -v -l -c /directorio/archivo.ldif

El servidor debe responder con la siguiente salida:

added ou= Nombre_Grupo, dc=dominio,dc=com”


De igual manera se va a crear un archivo persona.ldif, que contendrá únicamente el nombre y apellido de un persona y los datos de una cuenta el usuario y contraseña.


dn: uid=User1,ou=Usuarios,dc=dominio,dc=com
uid: User1
objectclass: top
objectclass: person
objectclass: uidObject
cn: Nombre
sn: Apellido
userPassword: password


Y se lo agrega de la misma forma al servidor:

# slapadd -v -l /directoro/persona.ldif


Se pueden agregar los usuarios que sean necesarios siguiendo el mismo esquema.

Posterior a ello reiniciar el servidor

# /etc/init.d/slapd start


Finalmente para visualizar lo que se ha agregado al servidor, se lo puede hacer con un


# slapcat


Para realizar un backup de una base de datos existente en otro servidor LDAP, basta con importar a un archivo el contenido al hacer un slapcat de la siguiente manera:



# slapcat -v -l ../directorio_destino/respaldo.ldif


Y para importarla a otro servidor LDAP, basta con hacer un ldapadd cómo se explico anteriormente.



5.2.1 ADMINISTRACIÓN DEL SERVIDOR LDAP CON PHPLDAPADMIN


Para administrar el servidor LDAP de una manera un poco más sencilla y gráfica, se puede instalar una aplicacion web, que funciona localmente que se llama PHPLDAPADMIN. Para instalarla, ejecutar lo siguiente (ya que también se encuentra en los repositorios)



# apt-get install phpldapadmin

Para comenzar a administrar los elementos del LDAP pulsar arriba a la izquierda donde indica
"Conectar", luego se ingresa el usuario administrador en el siguiente formato (cn=admin,dc=dominio,dc=com) y su contraseña.


Si no permitiera el logueo al servidor y desplegara un mensaje de error que dice: Error Could not start TLS. Please check your LDAP server configuration.” , En las versiones más recientes de phpldapadmin viene configurado por defecto que la conexión con el servidor ldap se haga mediante TLS, y si el servidor de LDAP que se ha montado no está configurado para usar TLS, al introducir el usuario y la contraseña, mostrará dicho error, y para solucionarlo, o bien hay que configurar el servidor ldap con soporte TLS o desactivar el uso de tls en el archivo de configuración de phpldapadmin.


Para desactivar tls en phpldapadmin, ediar el archivo de configuración:


# nano /etc/phpldapadmin/config.php

Y modificar la línea que dice:

$ldapservers->SetValue($i,'server','tls',true);

Por:

$ldapservers->SetValue($i,'server','tls',false);


Otro problema que puede darse al momento de administrar el servidor LDAP es que no se despliegue el árbol del directorio, y envés de ello, aparezca un mensaje de adverencia que dice: This base entry does not exist. Create it?”; Esto se debe a que en el archivo de configuración de phpLDAPadmin hay un parámetro que define el dominio del servidor LDAP, el mismo que al momento de la instalación y configuración no quearon registrados los cambios (y no se entiende porque razón). Para lo cual, hay que editar nuevamente dicho archivo:


# nano /etc/phpldapadmin/config.php

Y buscar la línea


/* Array of base DNs of your LDAP server. Leave this blank to have phpLDAPadmin
auto-detect it for you. */
$servers->setValue('server','base',array('dc=example,dc=com'));

Y obviamente en “dc=example” reempazarla con el nombre de dominio y demás componentes que tenga este.


Una vez ingresado al phpLDAPadmin, pulsar en el signo + que hay a la izquierda del dominio para poder desplegar las opciones.


Y se desplegará sólo un elemento, el administrador.  También se verá un icono para permitir crear más elementos. Pulsar en crear nuevo objeto, y se creará dos Unidades Organizativas, una para los grupos y otra para los usuarios.


Ahora se crearán los grupos como objeto hijo de la unidad organizativa "Grupos". En la plantilla elegimos Grupo Posix .

Asigar un nombre para el grupo y aceptar el GID que nos sugiere. Si se desea o no hay un GID disponible, se puede espeficar uno que se desee especificar, en ese caso, si la casilla está desactivada se debe editar la plantilla.


Para lo cual, hay que editar el archivo /etc/phpldapadmin/templates/creation/posixGroup.xml y eliminar la linea que dice <readonly>1</readonly>.



Ahora se procederá a crear los usuarios, para lo cual clickear en ou=Usuarios y crear un hijo del tipo Generico:


Cuenta de Usuarios.


En el formulario que aparece, llenar todas las opciones del usuario. Con el campo UID pasará
igual que con el GID explicado en el punto anterior. Si se necesita insertar un número de preferencia, editar el archivo posixAccount.xml en el mismo directorio mencionado anteriormente. y eliminar la línea <readonly>1</readonly>.

Si se desea que el “home” del usuario se cree automáticamente al iniciar la sesión por primera vez, esto lo realiza agregando la siguiente línea al archivo /etc/pam.d/common-session:


session optional pam_mkhomedir.so skel=/etc/skel umask=0022


5.2.2 ADMINISTRACION DE USUARIOS LDAP CON LDAPSCRIPTS


La herramienta phpLDAPadmin es muy útil a la hora de visualizar la organización del árbol LDAP, pero no es una buena opción a la hora de crear usuarios LDAP porque no crea los homes. Para esto existe un conjunto de scripts que provee LDAP. Para ello, lo primero que se ha de hacer es instalar el paquete que contiene dichos scripts:


# apt-get install ldapscripts


Una vez instalado, editar el archivo de configuración de ldapscripts /etc/ldapscripts/ldapscripts.conf para indicarle todos los valores del servidor LDAP, como se muestra a continuación:


SERVER=localhost
BINDDN='cn=admin,dc=nom_dom,dc=com'
BINDPWDFILE="/etc/ldapscripts/ldapscripts.passwd"
SUFFIX='dc=nom_dom,dc=com'
GSUFFIX='ou=Grupos' (grupo organizacional creado con phpldapadmin)
USUFFIX='ou=Usuarios'(grupo organizacional creado con phpldapadmin)
MSUFFIX='ou=Maquinas'(grupo organizacional creado con phpldapadmin)
GIDSTART=10000
UIDSTART=10000
MIDSTART=10000
# User properties
USHELL="/bin/bash"
UHOMES="/home/users/%u"
CREATEHOMES="yes"
HOMESKEL="/etc/skel"
HOMEPERMS="700"


Ahora se ha de indicar cual es el password del administrador del servidor LDAP, para que los scripts puedan modificar lo que sea necesario, para ello, ejecutamos:


# sh -c "echo -n 'secret' > /etc/ldapscripts/ldapscripts.passwd"
# chmod 700 /etc/ldapscripts/ldapscripts.passwd


Ahora ya se pueden utilizar los scripts para la creación y configuración de usuarios:

Lo primero que se tiene que hacer es crear un grupo, ya que para crear usuarios será imprescindible agregarlos a un grupo dentro del arbol LDAP, para ello ejecutar la siguiente orden:


# ldapaddgroup nombre_grupo


Y para crear usuarios (incluido la creación del directorio home):


# ldapadduser usuario nombre_grupo


Los usuarios se crean sin password, para asignarle un password al usuario creado, ejecutar:


# ldapsetpasswd usuario
New Password:
New Password (verify):

Para ver el resto de scripts que ofrece ldapscripts, ejecutar:


dpkg -L ldapscripts | grep bin


5.2.3 MODIFICACIONES ÚTILES A LOS SCRIPTS


Al momento de la creación de un usuario con ldapscripts, este no configura una contraseña inicial para el usuario, para lo cual se debe ejecutar el script ldapsetpasswd luego de haber creado el usuario para establecer la contraseña de inicio. Para el efecto, como se verá a continuación, basta con realizar unas modificaciones al script /usr/sbin/ldapadduser para que al momento de ejecutar la orden de creación del usuario, se establezca la contraseña de inicio:


Buscar y eliminar las líneas


# Generate or ask for user password
if is_like "$PASSWORDGEN" "<ask>"
then
warn_log "Setting password for user $_USER"
_askpassword
else
_genpassword "$_USER"
fi


# Add user password
if [ -n "$_PASSWORD" ]
then
_changepassword "$_PASSWORD" "uid=$_USER,$USUFFIX,$SUFFIX"
[ $? -eq 0 ] && echo_log "Successfully set password for user $_USER"
else
[ -n "$PASSWORDGEN" ] && warn_log "Warning : got invalid password for user $_USER (password not set)"
fi


Luego agregar las siguienes líneas al final del archivo


# Para setear contraseña
# Find username : $1 must exist in LDAP !
_findentry "$USUFFIX,$SUFFIX" "(&(objectClass=posixAccount)(|(uid=$1)(uidNumber=$1)))"
[ -z "$_ENTRY" ] && end_die "User $1 not found in LDAP"


if [ -z "$3" ] # Have to prompt for a *clear* password
then
warn_log "Changing password for user $_ENTRY"
# Ask for password
_askpassword
[ -z "$_PASSWORD" ] && end_die "Invalid password, please try again"
# Change user's password
_changepassword "$_PASSWORD" "$_ENTRY"
[ $? -eq 0 ] || end_die "Error setting password for user $_ENTRY"
end_ok "Successfully set password for user $_ENTRY"
else # Have to use the *encoded* password given on the command line
# Use LDIF info to modify the password
_PASSWORD="$3"
_extractldif 2 | _filterldif | _utf8encode | _ldapmodify
[ $? -eq 0 ] || end_die "Error setting encoded password for user $_ENTRY"
end_ok "Successfully set encoded password for user $_ENTRY"
fi


También se pensó en la necesidad de al momento de eliminar un usuario del directorio LDAP, también sea eliminado su directorio home y todo su contenido, para ello se ha de agregar las siguientes líneas al final del archivo /usr/sbin/ldapdeleteuser:


# Borrar carpeta home del usuario con todo su contenido
if [ "$2" = "-r" ]
then
rm -dfr "$_HOMEDIR"/"$1"
echo "El directorio del usuario $1 ha sido eliminado con todo su contenido"
fi


Como se puede observar se ha programado un segundo argumento que debe ser “-r” para que al momento de eliminar al usuario, sea eliminado su directorio home con todo su contenido.


6. RECOMENDACIONES


Se recomienda que al momento de crear un usuario, en el campo “login shell”, escribir “/null”, si es que este usuario no será utilizado para loguearse a otro servidor.


No hay comentarios:

Publicar un comentario