Sistema de cuentas centralizadas con LDAP y NFS
Basándonos en el directorio LDAP básico creado en anteriormente y documentado en la entrada Instalar OpenLDAP en Debian Jessie y crear un directorio LDAP básico, crearemos un sistema de cuentas centralizados en el que se puedan identificar usuarios remotamente y hacer uso de un servicio NFS.
Partiremos de dos máquinas virtuales sobre Vagrant: un servidor llamado ldap con dirección IP 192.168.100.1 y un cliente llamado cliente con dirección IP 192.168.100.10.
Comenzamos comprobando nuestra estructura de directorio LDAP con el comando slapcat
en nuestro servidor LDAP, que devolverá los objetos en formato LDIF.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
dn: dc=egarcia,dc=gonzalonazareno,dc=org objectClass: top objectClass: dcObject objectClass: organization o: IES Gonzalo Nazareno dc: egarcia structuralObjectClass: organization entryUUID: c316c65a-2e78-1036-936b-7f7c8846f610 creatorsName: cn=admin,dc=egarcia,dc=gonzalonazareno,dc=org createTimestamp: 20161024210122Z entryCSN: 20161024210122.137803Z#000000#000#000000 modifiersName: cn=admin,dc=egarcia,dc=gonzalonazareno,dc=org modifyTimestamp: 20161024210122Z dn: cn=admin,dc=egarcia,dc=gonzalonazareno,dc=org objectClass: simpleSecurityObject objectClass: organizationalRole cn: admin description: LDAP administrator userPassword:: e1NTSEF9YWNsZVArMnNsUTB5QTNSNjZXUVR2QVh3RzlWN1VOaU8= structuralObjectClass: organizationalRole entryUUID: c316e950-2e78-1036-936c-7f7c8846f610 creatorsName: cn=admin,dc=egarcia,dc=gonzalonazareno,dc=org createTimestamp: 20161024210122Z entryCSN: 20161024210122.138724Z#000000#000#000000 modifiersName: cn=admin,dc=egarcia,dc=gonzalonazareno,dc=org modifyTimestamp: 20161024210122Z dn: ou=People,dc=egarcia,dc=gonzalonazareno,dc=org objectClass: top objectClass: organizationalUnit ou: People structuralObjectClass: organizationalUnit entryUUID: 92b9af00-2e86-1036-8967-215a971f3b83 creatorsName: cn=admin,dc=egarcia,dc=gonzalonazareno,dc=org createTimestamp: 20161024224013Z entryCSN: 20161024224013.951313Z#000000#000#000000 modifiersName: cn=admin,dc=egarcia,dc=gonzalonazareno,dc=org modifyTimestamp: 20161024224013Z dn: ou=Group,dc=egarcia,dc=gonzalonazareno,dc=org objectClass: top objectClass: organizationalUnit ou: Group structuralObjectClass: organizationalUnit entryUUID: 92bb0896-2e86-1036-8968-215a971f3b83 creatorsName: cn=admin,dc=egarcia,dc=gonzalonazareno,dc=org createTimestamp: 20161024224013Z entryCSN: 20161024224013.960170Z#000000#000#000000 modifiersName: cn=admin,dc=egarcia,dc=gonzalonazareno,dc=org modifyTimestamp: 20161024224013Z dn: cn=Usuarios,ou=Group,dc=egarcia,dc=gonzalonazareno,dc=org objectClass: top objectClass: posixGroup gidNumber: 2000 cn: Usuarios structuralObjectClass: posixGroup entryUUID: b577bee2-2e86-1036-8969-215a971f3b83 creatorsName: cn=admin,dc=egarcia,dc=gonzalonazareno,dc=org createTimestamp: 20161024224112Z entryCSN: 20161024224112.239448Z#000000#000#000000 modifiersName: cn=admin,dc=egarcia,dc=gonzalonazareno,dc=org modifyTimestamp: 20161024224112Z dn: uid=EvaristoGZ,ou=People,dc=egarcia,dc=gonzalonazareno,dc=org objectClass: top objectClass: posixAccount objectClass: inetOrgPerson objectClass: person cn:: RXZhcmlzdG8gR2FyY8OtYSBaYW1icmFuYQo= uid: EvaristoGZ uidNumber: 2000 gidNumber: 2000 homeDirectory: /home/EvaristoGZ loginShell: /bin/bash userPassword:: e1NTSEF9WGJmMVhVd3hxZldYd1VRck9BT2k3VDlqWEhtRnVzMxk= sn:: R2FyY8OtYQo= mail: email@gmail.com givenName: Evaristo structuralObjectClass: inetOrgPerson entryUUID: cd12a6d4-2e86-1036-896a-215a971f3b83 creatorsName: cn=admin,dc=egarcia,dc=gonzalonazareno,dc=org createTimestamp: 20161024224151Z entryCSN: 20161024224151.842236Z#000000#000#000000 modifiersName: cn=admin,dc=egarcia,dc=gonzalonazareno,dc=org modifyTimestamp: 20161024224151Z |
Tras comprobar que tenemos una estructura lógica, con al menos un usuario y perteneciente a un grupo, instalamos el servidor de archivos NFS que permite el acceso de forma remota a un sistema de archivos a través de la red.
Configuración del servidor LDAP y NFS
Instalamos el paquete del servidor NFS con apt-get install nfs-kernel-server
El fin es que, cuando un usuario se loguee en nuestro servidor NFS desde un cliente, este monte un directorio personal ubicado en la ruta /home/nfs/ del servidor. Por ello, con usuario root, creamos el directorio, además de asignarle permisos de escritura para el grupo.
En el directorio /home/, con usuario root, creamos el directorio nfs para evitar el solapamiento de los directorios personales de usuarios locales. En su interior creamos el directorio EvaristoGZ y le asignamos a este el UID de usuario y grupo 2000, correspondiente al usuario EvaristoGZ y al grupo Usuarios.
1 2 3 |
root@ldap:/home# mkdir nfs root@ldap:/home# mkdir nfs/EvaristoGZ chown 2000:2000 nfs/EvaristoGZ |
En el fichero /etc/exports añadimos la línea /home/nfs *(rw,fsid=0,subtree_check)
que permitirá el acceso de los clientes NFS al sistema de ficheros. En él se puede especificar la red para la que estará disponible este recurso, cambiando el asterisco por la dirección de la red.
1 2 3 4 5 6 7 8 9 10 11 |
# /etc/exports: the access control list for filesystems which may be exported # to NFS clients. See exports(5). # # Example for NFSv2 and NFSv3: # /srv/homes hostname1(rw,sync,no_subtree_check) hostname2(ro,sync,no_subtree_check) # # Example for NFSv4: # /srv/nfs4 gss/krb5i(rw,sync,fsid=0,crossmnt,no_subtree_check) # /srv/nfs4/homes gss/krb5i(rw,sync,no_subtree_check) # /home/nfs *(rw,fsid=0,subtree_check) |
Tras realizar estas configuraciones, reiniciamos el servicio de NFS con la instrucción /etc/init.d/nfs-kernel-server restart
Instalación Name Service Switch (NSS), Pluggable Authentication Module (PAM) y Name Service Cache Daemon (NSCD)
En el servidor LDAP, instalamos los distintos paquetes que permiten que el sistema sea capaz de resolver nombres de usuarios (UID) y grupos (GID), consultar información a un directorio LDAP, identificarse o cachear la resolución de nombres: apt-get install libnss-ldapd libpam-ldapd nscd
Comenzamos con la configuración del paquete nscd. Este es un demonio de caché para el servicio de nombres, lo cual evitará repetir consultas de las bases de datos de passwd, group y hosts.
En el primer paso de la configuración de este paquete establecemos la URI del servidor LDAP, que en este caso, al tratarse de una instalación en nuestro propio servidor, ponemos la dirección IP 127.0.0.0 para hacer referencia a localhost.
En la siguiente pantalla escribimos el dominio de búsqueda de nuestro servidor LDAP, que bien puede ser escrito como egarcia.gonzalonazareno.org o dc=egarcia,dc=gonzalonazareno,dc=org
A continuación, nos mostrará la pantalla de configuración de libnss-ldapd donde seleccionamos los servicios que estarán disponibles para la consulta de LDAP. Este paquete permite obtener nombres de usuario, grupos y otro tipo de información almacenada en servidores LDAP como redes o servicios. Puede ser configurado nuevamente en /etc/nsswitch.conf o reconfigurando el paquete dpkg-reconfigure libnss-ldapd
Para comprobar el correcto funcionamiento en el servidor, nos logueamos con el usuario y contraseña de nuestro directorio LDAP. En él comprobamos que tenemos permiso de escritura y que hace resolución de nombres en el directorio que se le ha asignado el grupo y usuario 2000.
Configuración del cliente LDAP y NFS
Las siguientes configuraciones son necesarias para cada cliente que desee utilizar el sistema de cuentas descentralizada.
En nuestro cliente Debian Jessie ya se encuentra instalado el paquete nfs-common, el cual incluye programas para hacer uso de NFS. Aún así, debemos instalar igualmente los paquetes libnss-ldapd, libpam-ldapd y nscd: apt-get install libnss-ldapd libpam-ldapd nscd
En la primera pantalla de configuración del paquete nslcd introducimos la dirección IP 192.168.100.1, correspondiente a nuestro servidor LDAP y NFS. La definición del puerto es opcional y la configuración queda guardada en /etc/nslcd.conf
De la misma forma, tenemos que insertar la base de búsqueda del servidor LDAP que podía hacerse con egarcia.gonzalonazareno.org o dc=egarcia,dc=gonzalonazareno,dc=org
En el último paso, marcamos que se consulten los servicios group y passwd al igual que en el servidor LDAP y NFS.
En el fichero /etc/ldap/ldap.conf se establecen las configuraciones por defecto del cliente LDAP, el cual se encuentra configurado por defecto como muestro en la imagen adjunta.
En mi caso he descomentado las líneas de configuración y cambiado los parámetros BASE y URI, siendo este el contenido del fichero:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# # LDAP Defaults # # See ldap.conf(5) for details # This file should be world readable but not world writable. BASE dc=egarcia,dc=gonzalonazareno,dc=org URI ldap://192.168.100.1 SIZELIMIT 12 TIMELIMIT 15 DEREF never # TLS certificates (needed for GnuTLS) TLS_CACERT /etc/ssl/certs/ca-certificates.crt |
Comprobamos que podemos ver la información de montaje ofrecida por el servidor NFS 192.168.100.1, el cual también es el servidor LDAP.
También comprobamos que el logueo mediante libpam-ldapd es correcto, pero en la línea No directory, loggin in with HOME=/ indica que no monta su directorio home. Además, se encuentra en la raíz sin poder listar siquiera el directorio /home/nfs/
Este error se debe a que es necesario montar el directorio /home/nfs/ para que sea accesible por el usuario EvaristoGZ en este caso. Por ello, creamos el directorio /home/nfs/ y realizamos el montaje con la instrucción: mount -t nfs 192.168.100.1:/home/nfs/ /home/nfs/
para comprobar su funcionamiento, ya que si queremos que sea persistente debemos añadir una línea al fichero /etc/fstab/ con el contenido 192.168.100.1:/home/nfs/ /home/nfs/ nfs rw 0 0.
Tras el montaje, volvemos a loguearnos para ver que se encuentra en el directorio correcto, que deja ver el fichero creado desde el servidor y que permite crear ficheros desde el cliente.
Crear el directorio personal del usuario en el primer inicio de sesión
Nuevamente en el servidor LDAP y NFS, configuraremos el módulo libpam-mkhomedir para que se cree automáticamente el directorio personal de un usuario tal como inicie sesión.
Para ello es necesario editar el fichero /etc/pam.d/common-account y añadir la línea: session required pam_mkhomedir.so skel=/etc/skel/ umask=0022
Desde el servidor, añadimos un nuevo usuario LDAP llamado OtroUsuario o hacemos uso de otro cualquiera que no hayamos usado para realizar las pruebas de esta configuración.
Si intentamos loguearnos desde el cliente, veremos que no es posible y mostrará un error Login incorrect a pesar de ser usuario y contraseña correctos. Esto se debe a que no se permite crear la carpeta en el directorio /home/nfs/ del servidor.
Por lo tanto, es necesario modificar el fichero /etc/exports y añadir la cadena no_root_squash quedando la línea añadida anteriormente así: /home/nfs *(rw,fsid=0,subtree_check,no_root_squash)
Finalmente, ya tenemos montado nuestro sistema de cuentas centralizadas haciendo uso de un directorio LDAP y un servidor NFS.
Referencias
- Autenticación LDAP en GNU/Linux (PDF)
- Configurar un equipo cliente con Ubuntu para autenticarse en el servidor OpenLDAP
- Perfiles móviles de usuario usando NFS y LDAP
- Giving users a home directory automatically
- Configurar un sistema de cuentas centralizadas con LDAP y NFS