
# Directorios centralizados con LDAP y NFS
# Introducción
En este post vamos a ver como crear un directorio centralizado con LDAP y NFS.
# Instalación de LDAP
Para instalar LDAP vamos a usar el paquete slapd, que es el servidor LDAP.
apt install slapd
Una vez instalado vamos a configurarlo, para ello ejecutamos el comando:
dpkg-reconfigure slap-utils
Nos pedirá que introduzcamos la contraseña de del usuario root del servidor slapd, y nos preguntará si queremos usar el dominio de la máquina o no, en este caso vamos a usar el dominio de la máquina.
Con el siguiente comando podremos ver la información del usuario root en el dominio gonzanonazareno.org
ldapsearch -x -D "cn=admin,dc=antonio,dc=gonzalonazareno,dc=org" -b "dc=antonio,dc=gonzalonazareno,dc=org" -W

Ahora crearemos una unidad organizativa, en este caso la llamaremos Organizacion.ldif, y le daremos el siguiente contenido:
dn: ou=Personas,dc=antonio,dc=gonzalonazareno,dc=org
objectClass: organizationalUnit
ou: Personas
dn: ou=Grupos,dc=antonio,dc=gonzalonazareno,dc=org
objectClass: organizationalUnit
ou: Grupos
“dn” significa Distinguished Name, e indica el nombre distintivo que el objeto tendrá dentro de la jerarquía de directorios, y “objectClass” es la clase de objeto, en este caso es una unidad organizativa.
Procedemos a ejecutar el siguiente comando para inyectar los nuevos objetos en el árbol de slapd:
ldapadd -x -D "cn=admin,dc=antonio,dc=gonzalonazareno,dc=org" -f UnidadesOrganizativas.ldif -W

Ahora si volvemos a ejecutar el comando
ldapsearch -x -D "cn=admin,dc=antonio,dc=gonzalonazareno,dc=org" -b "dc=antonio,dc=gonzalonazareno,dc=org" -W
Podremos ver que se han creado los nuevos objetos llamados Personas y Grupos.

Ahora vamos a crear un usuario, para ello crearemos un fichero llamado usuarios.ldif, y le daremos el siguiente contenido:
dn: uid=prueba,ou=Personas,dc=antonio,dc=gonzalonazareno,dc=org
objectClass: posixAccount
objectClass: inetOrgPerson
objectClass: top
cn: prueba
gidNumber: 2001
homeDirectory: /home/prueba
loginShell: /bin/
sn: prueba
uid: prueba
uidNumber: 2001
userPassword: {SSHA}sfqp8j+/1HHe7N6qcbDIrLkf3T2c4wIW
dn: uid=macarena,ou=Personas,dc=antonio,dc=gonzalonazareno,dc=org
objectClass: posixAccount
objectClass: inetOrgPerson
objectClass: top
cn: macarena
gidNumber: 2002
homeDirectory: /home/macarena
loginShell: /bin/
sn: macarena
uid: macarena
uidNumber: 2002
userPassword: {SSHA}sCwMT7CqCloD4bzvED/1QB9xvUnZ0N5P
Para los hash de contraseñas la hemos creado con la utilidad slappasswd, que viene instalada con slapd.
root@alfa:/home/antonio# slappasswd
New password:
Re-enter new password:
{SSHA}sfqp8j+/1HHe7N6qcbDIrLkf3T2c4wIW
Para agregar al usuario prueba y al usuario macarena debemos de volver a inyectar el fichero Usuario.ldif en el árbol de slapd, para ello ejecutamos el siguiente comando:
ldapadd -x -D "cn=admin,dc=antonio,dc=gonzalonazareno,dc=org" -f usuarios.ldif -W

Lo que hemos hecho ha sido insertar registros en el objeto de personas, ahora vamos a crear un grupo, para ello crearemos un fichero llamado grupos.ldif, y le daremos el siguiente contenido:
dn: cn=desarrollo,ou=Grupos,dc=antonio,dc=gonzalonazareno,dc=org
objectClass: top
objectClass: groupOfNames
cn: desarrollo
member:
dn: cn=sistemas,ou=Grupos,dc=antonio,dc=gonzalonazareno,dc=org
objectClass: top
objectClass: groupOfNames
cn: sistemas
member:
A continuación vamos a inyectar el fichero grupos.ldif en el árbol de slapd, para ello ejecutamos el siguiente comando:
ldapadd -x -D "cn=admin,dc=antonio,dc=gonzalonazareno,dc=org" -f grupos.ldif -W

Luego vamos a añadir a los usuarios a los grupos, para ello crearemos un fichero llamado personas-grupos.ldif, y le daremos el siguiente contenido:
# Al grupo de desarrollo
dn: cn=desarrollo,ou=Grupos,dc=antonio,dc=gonzalonazareno,dc=org
changetype:modify
add: member
member: uid=prueba,ou=Personas,dc=antonio,dc=gonzalonazareno,dc=org
# Al grupo de desarrollo y sistemas
dn: cn=desarrollo,ou=Grupos,dc=antonio,dc=gonzalonazareno,dc=org
changetype:modify
add: member
member: uid=macarena,ou=Personas,dc=antonio,dc=gonzalonazareno,dc=org
dn: cn=sistemas,ou=Grupos,dc=antonio,dc=gonzalonazareno,dc=org
changetype:modify
add: member
member: uid=macarena,ou=Personas,dc=antonio,dc=gonzalonazareno,dc=org
A continuación vamos a inyectar el fichero personas-grupos.ldif en el árbol de slapd, para ello ejecutamos el siguiente comando:
ldapmodify -x -D "cn=admin,dc=antonio,dc=gonzalonazareno,dc=org" -f personas-grupos.ldif -W

Podríamos usar también ldapmodify que es una herramiente enfocada a la modificación, pero para nuestro caso ambas nos sirven.
Usando el comando ldapsearch podemos ver que los usuarios están en los grupos:
ldapsearch -x -D "cn=admin,dc=antonio,dc=gonzalonazareno,dc=org" -b "cn=desarrollo,ou=Grupos,dc=antonio,dc=gonzalonazareno,dc=org" -W
root@alfa:/home/antonio# ldapsearch -x -b ou=Grupos,dc=antonio,dc=gonzalonazareno,dc=org
# extended LDIF
#
# LDAPv3
# base <ou=Grupos,dc=antonio,dc=gonzalonazareno,dc=org> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#
# Grupos, antonio.gonzalonazareno.org
dn: ou=Grupos,dc=antonio,dc=gonzalonazareno,dc=org
objectClass: organizationalUnit
ou: Grupos
# sistemas, Grupos, antonio.gonzalonazareno.org
dn: cn=sistemas,ou=Grupos,dc=antonio,dc=gonzalonazareno,dc=org
objectClass: top
objectClass: groupOfNames
cn: sistemas
member:
member: uid=macarena,ou=Personas,dc=antonio,dc=gonzalonazareno,dc=org
# desarrollo, Grupos, antonio.gonzalonazareno.org
dn: cn=desarrollo,ou=Grupos,dc=antonio,dc=gonzalonazareno,dc=org
objectClass: top
objectClass: groupOfNames
cn: desarrollo
member:
member: uid=prueba,ou=Personas,dc=antonio,dc=gonzalonazareno,dc=org
member: uid=macarena,ou=Personas,dc=antonio,dc=gonzalonazareno,dc=org
# search result
search: 2
result: 0 Success
# numResponses: 6
# numEntries: 5
Si queremos borrar un elemento del árbol podemos realizarlo gracias a la siguiente instrucción:
ldapdelete -x -D 'cn=admin,dc=antonio,dc=gonzalonazareno,dc=org' -W cn=reabastecimiento,ou=Grupos,dc=antonio,dc=gonzalonazareno,dc=org
Desplegar árbol a través de NFS:
apt-get install nfs-kernel-server -y
Nos vamos a /etc/exportfs y añadimos la siguiente línea:
/home/antonio/nfs *(rw,fsid=0,subtree_check,no_root_squash)
Ahora ejecutamos exportfs -a
root@alfa:/home/antonio# mkdir nfs
root@alfa:/home/antonio# mkdir nfs/almacenamiento
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.
apt install libnss-ldapd libpam-ldapd nscd -y
Luego de configurar el instalador de forma que capture la ip 127.0.0.1 y el nombre dc=antonio,dc=gonzalonazareno,dc=org, debemos editar el fichero /etc/nsswitch.conf, y añadir las siguientes líneas:

# Cliente Ubuntu
apt-get install libnss-ldapd libpam-ldapd nscd nfs-kernel-server -y
Introducimos la dirección IP del servidor LDAP y el nombre del dominio:

En el fichero /etc/ldap/ldap.conf se establecen los parámetros de configuración del cliente LDAP. En este fichero se establece la dirección del servidor LDAP, el puerto, el dominio, el tipo de autenticación, etc.
#
# LDAP Defaults
#
# See ldap.conf(5) for details
# This file should be world readable but not world writable.
BASE dc=antonio,dc=gonzalonazareno,dc=org
URI ldap://192.168.0.1
SIZELIMIT 12
TIMELIMIT 15
DEREF never
# TLS certificates (needed for GnuTLS)
TLS_CACERT /etc/ssl/certs/ca-certificates.crt
Ahora necesitaremos configurar el cliente para que al iniciar sesión cree el home del usuario. Para ello editamos el fichero /etc/pam.d/common-account y añadimos la siguiente línea:
session required pam_mkhomedir.so skel=/etc/skel/ umask=0022
Vamos a probar montando de manera efímera el directorio en el cual se va a crear el home del usuario macarena:
mount -t nfs 192.168.0.1:/home/antonio/nfs/ /home
Ahora cuando el usuario macarena inicie sesión este se verá reflejado en nuestro servidor nfs, probaremos creando un documento txt:

Ahora vamos a hacer que este recurso funcione de manera permanente, para ello podríamos editar el fichero fstab, o bien crear una unidad de systemd, que en este caso es lo que vamos a emplear.
nano /etc/systemd/system/home.mount
[Unit]
Description= Montaje de carpeta home para NFS
[Mount]
What=192.168.0.1:/home/antonio/nfs
Where=/home
Type=nfs
Options=defaults
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl enable home.mount
systemctl start home.mount
systemctl status home.mount

# Cliente Rocky Linux
dnf install openldap-clients sssd sssd-ldap oddjob-mkhomedir sssd-tools -y
authselect list
[root@bravo antonio]# authselect list
- minimal Local users only for minimal installations
- sssd Enable SSSD for system authentication (also for local users only)
- winbind Enable winbind for system authentication
authselect select sssd with-mkhomedir --force
volvemos a especificar la dirección IP del servidor LDAP y el nombre del dominio en /etc/openldap/ldap.conf:
BASE dc=antonio,dc=gonzalonazareno,dc=org
URI ldap://172.16.0.1
SIZELIMIT 12
TIMELIMIT 15
DEREF never
sudo nano /etc/sssd/sssd.conf
[domain/default]
id_provider = ldap
autofs_provider = ldap
auth_provider = ldap
chpass_provider = ldap
ldap_uri = ldap://172.0.16.1
ldap_search_base = dc=antonio,dc=gonzalonazareno,dc=org
ldap_id_use_start_tls = True
ldap_tls_cacertdir = /etc/openldap/cacerts
cache_credentials = True
ldap_tls_reqcert = allow
[sssd]
services = nss, pam, autofs
domains = default
[nss]
homedir_substring = /home/nfs
chmod 0600 /etc/sssd/sssd.conf
systemctl restart sssd
authconfig --enablemkhomedir --updateall
authconfig --enableldap \
--enableldapauth \
--ldapserver=antonio.gonzalonazareno.org \
--ldapbasedn="dc=antonio,dc=gonzalonazareno,dc=org" \
--enablemkhomedir \
--update
