Existen diferentes formas de autenticar usuarios en una red linux, pero una de las más usadas es la combinación de tres herramientas diferentes: NSS, PAM y LDAP.

La idea consiste en disponer de un servidor que facilite la acción de autenticar usuarios, de modo, que éstos recurran al servidor cada vez que un cliente necesite identificarse. De esta forma, la cuenta de usuario no es específica de un equipo cliente, si no que será válida en cualquier equipo de la red que haya sido debidamente configurado.

A continuación encontrarás la definición de los distintos servicios involucrados y como configurarlos.

Autenticar usuarios. NSS, PAM y LDAP.

Autenticar usuarios. NSS.

Es un servicio que permite la resolución de nombres de usuario y contraseñas mediante el acceso a diferentes orígenes de la información. En condiciones normales, esta información se encuentra en los archivos locales del sistema operativo, en concreto en,

/etc/passwd /etc/shadow /etc/group

Pero puede proceder de otras fuentes, como DNS, NIS, LDAP o WINS.

Autenticar usuarios. PAM.

Establece una interfaz entre los programas de usuario y distintos métodos de autenticación. De esta forma, el método de autenticación, se hace transparente para los programas.

La idea se basa en la creación de módulos de autenticación. Esto hace que, sin realizar modificaciones en el sistema, podamos utilizar métodos que vayan desde el uso típico de un nombre de usuario y una contraseña, hasta dispositivos que faciliten la identificación biométrica de los usuarios (lectores de huellas, de voz, de imagen, etc….). Incluso incorpora opciones para aceptar contraseñas de un solo uso, restringir el acceso a determinados horarios o establecer políticas de autenticación específicas para cada usuario o grupos de usuarios.

En la actualidad, PAM es el método que utilizan la mayoría de las aplicaciones y herramientas de LINUX para autenticar usuarios.

Autenticar usuarios. LDAP.

LDAP, es un protocolo que ofrece el acceso a un servicio de directorio implementado sobre un entorno de red, con el objeto de acceder a una determinada información. Puede ejecutarse sobre TCP/IP o sobre cualquier otro servicio de transferencia orientado a la conexión.

Podemos considerarlo como un sistema de almacenamiento de red al que se pueden realizar consultas.

Como funcionan LDAP y OPENLDAP

El modelo de información de LDAP se basa en entradas, entendiendo por entrada un conjunto de atributos identificados por nombre global único (DN), que se utiliza para identificarla de forma específica. Las entradas se organizan de forma lógica y jerárquica mediante un esquema de directorio, que contiene la definición de los objetos que pueden formar parte del directorio.

Cada entrada del directorio representa un objeto, que puede ser abstracto o real.

Cada atributo de una entrada tendrá un tipo y un valor con el formato atributo/valor que permite caracterizar un aspecto del objeto que define la entrada. Estos atributos tienen nombres que hacen referencia a su contenido y pueden ser de dos tipos:

Atributos normales: Son los atributos que identifican al objeto

Atributos operativos: Son los atributos que utiliza el servidor para administrar el directorio

Las entradas se indexan mediante el nombre completo (DN), que facilita la identificación singular a cada elemento del árbol. El nombre completo se formará con una serie de pares atributo/valor, separados por comas, que reflejan la ruta inversa desde la posición lógica del objeto hasta la raíz del arbol.

Entre los atributos que suelen utilizarse habitualmente, encontramos los siguientes, aunque puede haber

muchos mas:

UID (user id): Identificación única de la entrada del arbol

Object class: Indica el tipo de objeto al que pertenece la entrada

CN (common name): Nombre de la persona representada en el objeto

Givenname: Nombre de pila

SN (surname): Apellido de la persona

O (Organization): Entidad a la que pertenece la persona

U (Organizational Unit): El departamento en el que trabaja la persona

Mail: Dirección de correo electrónico de la persona

Como instalar OpenLDAP en el servidor

Aquí instalaremos el paquete slapd , y un paquete adicional que contiene las utilidades de administración de LDAP, ldap-utils.

Como ambos paquetes se encuentren en los repositorios oficiales de Ubuntu, sólo tenemos que escribir en la terminal el siguiente comando:

sudo apt install slapd ldap-utils

Durante la instalación, aparece en la consola un mensaje que nos solicita la contraseña de administración para LDAP.

Como suele ocurrir cuando escribimos una contraseña, para evitar que hayamos cometido algún error tipográfico que después nos impida entrar, el sistema nos pide que volvamos a escribirla.

Al hacerlo, volveremos al aspecto normal de la terminal y comprobaremos que la instalación sigue su curso.

Configuración básica de OpenLDAP

Comenzaremos por modificar el contenido del archivo /etc/hosts . Abrimos dicho archivo con el editor nano,

sudo nano /etc/hosts

Dentro del archivo, añadimos una nueva línea que relacione la dirección IP estática del servidor con los nombres lógicos que tenemos previstos utilizar, por ejemplo

192.168.0.1 ldapserver.lluis.local ldapserver

A continuación, instalaremos la librería NSS para LDAP. Esta librería ofrece una interfaz para acceder y configurar distintas bases de datos utilizadas para almacenar cuentas de usuario.

Para instalar el paquete libnss-ldap usaremos el siguiente comando:

sudo apt install libnss-ldap

En el primer paso, nos solicita la dirección URI del servidor LDAP. Es importante dejar el principio tal y como lo encontramos y poner la IP de nuestro servidor:

ldapi:///192.168.0.1

A continuación escribiremos el nombre global único:

dc=lluis,dc=local

En el siguiente paso, indicaremos la versión del protocolo LDAP que vamos a utilizar. Lo normal es elegir el valor más alto:

3

Indicaremos si las utilidades que utilicen PAM deberán comportarse del mismo modo que cuando cambiamos contraseñas locales. Tendremos que pulsar sobre Si .

El sistema nos preguntará si queremos que sea necesario identificarse para realizar consultas en la base de datos de LDAP. En este caso, diremos que No .

Ya solo nos queda indicar el nombre de la cuenta LDAP que tendrá privilegios para realizar cambios en las contraseñas. Tenemos que volver a escribir un nombre global único:

cn=admin,dc=lluis,dc=local

En el último paso, el asistente nos solicita la contraseña que usará la cuenta anterior. Deberá coincidir con la que escribimos en el apartado Como instalar OpenLDAP en el Servidor.

Configurar como autenticar usuarios

Lo primero que haremos será utilizar auth-client-config , un script que nos ayuda a modificar los archivos de configuración de PAM y NSS. Para usar este script, ejecutamos el siguiente comando:

sudo auth-client-config -t nss – p lac_ldap

La ejecución de este comando no debe de ofrecer ningun tipo de error. De lo contrario, deberíamos repasar la configuración ejecutando de nuevo ldap-auth-config .

Seguidamente, deberemos actualizar la configuración de las políticas de autenticación predeterminadas de PAM, esto nos permitirá autenticar usuarios. Para ello, usaremos el siguiente comando:

sudo pam-auth-update

Al ejecutarlo, aparecerá un asistente, que nos muestra una primera pantalla informativa sobre la función de los módulos PAM.

En la siguiente pantalla nos indicará los módulos disponibles, y tendremos que seleccionar aquellos que queremos habilitar para autenticar usuarios. De forma predeterminada, aparecen todos los módulos disponibles para autenticar usuarios como marcados.

Una vez acabada la configuración automática, podremos hacer algunos cambios editando el archivo /etc/ldap.conf .

Tenemos que mirar que los siguientes datos son correctos:

host 192.168.0.1 base dc=lluis,dc=local uri ldapi://192.168.0.1/ rootbinddn cn=admin,dc=lluis,dc=local Ldap_version 3 bind_policy soft

Con esto habremos terminado la configuración del servidor LDAP. Ahora está listo para autenticar usuarios.

Configurar el demonio SLAPD

Para configurar este demonio, usamos el siguiente comando:

sudo dpkg-reconfigure slapd

Seguidamente aparecerá un asistente cuyo cometido es evitar que tengamos que cambiar a mano el archivo slapd.conf.

La primera pantalla que se muestra, actúa como medida de seguridad, para asegurarse de que no hacemos cambios por error. Hay que tener cuidado por que la pregunta se hace al revés, es decir, nos pregunta si queremos omitir la configuración del servidor. En este caso, deberemos de elegir la opción “No”

En la siguiente pantalla, deberemos de escribir el nombre DNS que utilizamos para crear el DN base del directorio LDAP:

lluis.local

Después, escribiremos el nombre de la entidad en la que estamos instalando el directorio LDAP.

lluis

En este paso, deberemos escribir la contraseña de administración del directorio.

lluisa1b2c3d4

Elegimos el motor de la base de datos que usaremos para el directorio. Se recomienda HDB por que nos permitirá, en el futuro, cambiar el nombre de los subarboles, si fuera necesario

Lo siguiente que nos pregunta el asistente es que si queremos que se borre la base de datos anterior del directorio cuando terminemos la configuración del sldap. Le tenemos que decir que NO.

Como hemos decidido no borrar la base de datos antigua, el asistente nos pregunta si queremos cambiarla de sitio. Le decimos que SI.

En algunas redes, con usuarios muy antiguos, puede ser necesario mantener la versión 2 del protocolo LDAP. Por ese motivo, antes de terminar, el asistente nos preguntará si queremos permitir el protocolo LDAPv2. Le diremos que NO.

Con esto habremos terminado la configuración del servidor LDAP. Ahora está listo para autenticar usuarios

Crear la estructura de un directorio

Una vez configurado el servidor, debemos configurar la estructura básica del directorio. Es decir, crearemos la estructura jerárquica del árbol (DIT -Directory Information Tree)

Ahora tenemos que crear un archivo que contenga los tipos de objeto básicos del directorio. Abriremos el editor de textos nano indicándole el nombre de nuestro archivo:

sudo nano ~/base.ldif

Una vez abierto el editor, escribimos el siguiente contenido:

dn : ou = usuarios , dc = lluis , dc = local objectClass : organitzationalUnit ou : usuarios dn : ou = grupos , dc = lluis , dc = local objectClass : organitzationalUnit ou : usuarios

A continuación, debemos añadir la información a la base de datos OpenLDAP, para ello usamos el siguiente comando:

sudo ldappad -x D cn=admin,dc=lluis,dc=local -W -f base.ldif

Añadir un usuario y un grupo

Añadir un usuario

Para añadir un nuevo usuario, usaremos el gedit.

sudo gedit ~/usuario.ldif

En el área de trabajo del editor, escribiremos un contenido como este:

dn : uid = jlopez , ou = usuarios , dc = maquinon , dc = local objectClass : inetOrgPerson objectClass : posixAccount objectClass : shadowAccount uid : jlopez sn : Lopez givenName : Juan cn : Juan Lopez displayName : Juan Lopez uidNumber : 1000 gidNumber : 10000 userPassword : lluisa1b2c3d4 gecos : Juan Lopez loginShell : /bin/ bash homeDirectory : /home/ jlopez shadowExpire : - 1 shadowFlag : 0 shadowWarning : 7 shadowMin : 8 shadowMax : 999999 shadowLastChange : 10877 mail : juan . lopez @ maquinon . com postalCode : 29000 o : lluis initials : JL

Con esto, ya estamos listos para cargar el nuevo usuario en el directorio. Sólo tenemos que escribir el siguiente comando:

sudo ldapadd -x -D cn=admin,dc=lluis,dc=local -W -f usuario.ldif

Añadir un grupo

Para añadir el grupo, repetimos el proceso anterior:

sudo gedit ~/grupo.ldif

Una vez abierto el editor, escribiremos este contenido para crear el grupo SMR2:

dn : cn = SMR2 , ou = grupos , dc = lluis , dc = local objectClass : posixGroup cn : SMR2 gidNumber : 10000

Usamos el siguiente comando:

sudo ldapadd -x -D cn=admin,dc=maquinon,dc=local -W -f grupo.ldif

Con esto, ya tendremos en la base de datos un nuevo usuario y un nuevo grupo

Comprobar que todo es correcto

Ahora podemos comprobar que el contenido anterior se ha añadido correctamente, para ello, usamos el siguiente comando:

ldapsearch -xLLL -b "dc=maquinon,dc=local" uid=jlopez sn givenName cn

Instalación de phpLDAPadmin

La única circunstancia a tener en cuenta son las dependencias. Como se trata de una aplicación escrita en php, para funcionar correctamente necesita disponer de un servidor LAPM instalado y activo en el servidor. Sin embargo, esta circunstancia, se soluciona de la siguiente manera, usando el siguiente comando,

sudo apt-get install phpldapadmin

Acceder al servidor LDAP con phpLDAPadmin

Acceder a phpLDAPadmin es tan sencillo como abrir cualquier navegador web en el servidor y, en la barra de direcciones, escribir la siguiente URL:

http://localhost/phpldapadmin/” o “http://192.168.0.1/phpldapadmin/

Ahora, para comenzar a trabajar con el servidor, bastará con hacer clic en el enlace conectar que encontramos en el panel izquierdo.

Lo primero que llama la atención es que, en el cuadro Login, aparece un texto de ejemplo que deberemos cambiar por los datos particulares de nuestro directorio. Debajo, escribimos la contraseña para el servidor LDAP.

Crear usuarios y grupos con phpLDAPadmin

Según la versión de PHP que tengamos, es posible que durante el proceso de creación de usuarios

os aparezca el siguiente error:

Error trying to get a non-existant value (appearance,password_hash)

Para solucionar ese error, deberéis editar el fichero /usr/share/phpldapadmin/lib/TemplateRender.php

Y en aproximadamente (puede variar entre versiones) la línea 2469 cambiar el valor password_hash a password_hash_custom .

Añadir usuarios

En el panel izquierdo de la ventana del navegador, haremos clic sobre el elemento “Crear nuevo objeto”, dentro de la categoría “usuarios”..

Al hacerlo, cambiará el panel derecho de la ventana. En él, haremos clic sobre el elemento “Predeterminado”.

De nuevo, el panel derecho cambiará para mostrar el primer paso de la creación de usuarios. En él disponemos de dos elementos: El contenedor y los tipos de objeto a los que puede pertenecer el usuario que vamos a crear. En nuestro caso, el contenedor lo dejamos tal y como aparece. En cuanto a los tipos de objetos, deberemos seleccionar dos: account y posixAccount.

Al hacerlo, el panel derecho volverá a cambiar para mostrar el siguiente paso. Aquí tendremos que elegir el RDN (Relative Distinguished Name) del cliente en la lista superior y justo debajo, sus atributos. Cuando hayamos completado los datos, haremos clic sobre el botón Crear objeto.

A continuación, el panel derecho de la ventana volverá a cambiar para mostrarnos un resumen de los datos que hemos introducido .Si todo es correcto le daremos al botón “Cometer”. Un instante después, el panel derecho mostrará los datos del usuario que acabamos de crear, para que podamos modificarlos (si fuese necesario).

Añadir grupos

Comenzaremos por hacer clic sobre el enlace Crear nuevo objeto dentro de la categoría grupos.

A continuación, en el panel derecho, hacemos clic sobre el elemento Predeterminado. Como antes, el panel derecho cambiará para mostrarnos el primer paso de la creación del nuevo grupo. Como en el caso anterior, el Contenedor lo dejamos tal cual aparece. En cuanto a Clases de objeto, en este caso sólo seleccionamos posixGroup.

Después de esto, el panel derecho nos muestra un resumen de los datos que hemos introducido. Si todo es correcto, haremos clic sobre el botón Cometer.

Configurar un cliente con lubuntu para autenticarse en servidor OPENLDAP

En Ubuntu, necesitaremos ajustar el comportamiento de los servicios NSS y PAM en cada cliente que debamos configurar.. Para ello ejecutamos el siguiente comando:

sudo apt-get install libpam-ldap libnss-ldap nss-updatedb libnss-db nscd ldap-utils

Durante el proceso, se activa un asistente que nos permite configurar el comportamiento de ldap-atutconfig .

En el primar paso, nos solicita la dirección URi del servidor LDAP que es 192.168.0.1

En el siguiente paso, debemos indicar el nombre global único. Inicialmente aparece en valor

dc=example,dc=net pero nosotros lo sustituiremos por dc=lluis,dc=local

A continuación, el asistente nos pide el número de versión del protocolo LDAP que estamos utilizando. De forma predeterminada aparece seleccionada la versión 3.

Indicaremos si las utilidades que utilicen PAM deberán comportarse del mismo modo que cuando cambiamos contraseñas locales. Esto hará que las contraseñas se guarden en un archivo independiente que sólo podrá ser leído por el superusuario. Diremos que si .

El sistema nos pregunta si queremos que sea necesario identificarse para realizar consultas en la base de datos de LDAP. Diremos que no .

Ya sólo nos queda indicar el nombre de la cuenta LDAP que tendrá privilegios para realizar cambios en las contraseñas. Como antes, deberemos escribir un nombre global único, sustituyendo el valor predeterminado por que usamos en la configuración del servidor (cn=admin,dc=lluis,dc=es) .

En el último paso, el asistente nos solicita la contraseña que usará la cuenta anterior (como siempre, habrá que escribirla por duplicado para evitar errores tipográficos). Deberá coincidir con la que escribimos en el apartado Instalar OpenLDAP en el servidor.

Asimismo nos pedirá por último lugar la encriptación utilizada al cambiar los passwords. Elegiremos crypt .

Realizar ajustes en los archivos de configuración

Para completar la tarea, deberemos cambiar algunos parámetros en los archivos de configuración del cliente. En concreto, deberemos editar,

/etc/ldap.conf /etc/ldap/ldap.conf /etc/nsswitch.conf.

Después, actualizaremos NSS y configuraremos PAM para que utilicen LDAP,

Editar el archivo /etc/ldap.conf

Para abrir el archivo, usamos el siguiente comando:

sudo nano /etc/ldap.conf

Las modificaciones a realizar en el archivo son estas:

Buscamos una línea como esta #bind_policy hard y la sustituimos por bind_policy soft

y la sustituimos por Buscamos una línea como esta pam_password md5 y la sustituimos por pam_password crypt

y la sustituimos por Buscamos una línea que comience por uri ldapi:// y la sustituimos por uri ldap://192.168.0.1/

Editar el archivo /etc/ldap/ldap.conf

Usamos el siguiente comando para abrir el archivo:

sudo nano /etc/ldap/ldap.conf

Cuando se abra el archivo, podremos observar que, algunas de sus líneas, tienen el siguiente aspecto:

#BASE dc=example,dc=com #URI ldap://ldap.example.com ldap://ldap-master.example.com:666 #SIZELIMIT 12 #TIMELIMIT 15 #DEREF never

Lo primero será borrar el carácter que hace que la línea permanezca comentada (#). Después, cambiaremos su contenido por este otro:

BASE dc=maquinon,dc=local URI ldap://192.168.0.1 SIZELIMIT 0 TIMELIMIT 0 DEREF never

Editar el archivo /etc/nsswitch.conf

Usamos el siguiente comando para abrir el archivo:

sudo nano /etc/nsswitch.conf

Al abrir el archivo, observaremos que, algunas de sus líneas, tienen el siguiente aspecto:

passwd : compat group : compat shadow : compat hosts : files mdns4_minimal [ NOTFOUND = return ] dns mdns4 networks : files protocols : db files services : db files ethers : db files rpc : db files

Debemos cambiar las líneas necesarias para que su contenido final sea como este:

passwd : files ldap group : files ldap shadow : files ldap hosts : files dns networks : files protocols : db files services : db files ethers : db files rpc : db files

Actualizar NSS y configurar PAM para que utilicen LDAP

Por una parte, deberemos actualizar la caché local con la información de usuarios y grupos correspondientes a LDAP. Para conseguirlo, recurriremos al comando nss-updatedb que instalamos al principio de este apartado:

sudo nss_updatedb ldap

Lo siguiente será actualizar la configuración de las políticas de autenticación predeterminadas de PAM, lo que conseguimos con el siguiente comando,

sudo pam-auth-update

Para que la autentificación funcione nos quedará reiniciar el servicio nscd,

sudo /etc/init.d/nscd restart

Un ajuste más

Un inconveniente que tiene la configuración actual es que los usuarios LDAP no podrán cambiar sus propias contraseñas. Aunque esto en principio puede parecer una ventaja, lo cierto es que a la hora de autenticar usuarios, es recomendable que sean los propios usuarios los que cambien sus contraseñas. Para solucionarlo, deberemos cambiar el archivo /etc/pam.d/common-password.

Cuando veamos el contenido del archivo, buscaremos una línea como esta (recuerda que puedes usar la combinación de teclas crtl +w):

password [success=1 user_unknown=ignore default=die] pam_ldap.so use_authtok try_first_pass

y eliminamos su parte final, de modo que quede así: