En este post vamos a ver como se pobla un servidor LDAP desde un fichero «.json» creado para añadir todos lo usuarios necesarios. Uno de los atributos que añadiremos será “Clave pública ssh” de cada usuario la cual usaremos posteriormente para configurar el servicio ssh para que obtenga las claves públicas de los usuarios del servidor LDAP.

El primer paso es crear el arbol de LDAP, proceso que realizamos en este post Configuracion sistema centralizado con LDAP una vez creado.

Añadir esquema openssh-ldk

Dicho esquema nos permite añadir el atributo clave publica.

Vamos a añadir el esquema mediante un .ldif mediante la api de OpenLDAP

dn: cn=openssh-lpk,cn=schema,cn=config
objectClass: olcSchemaConfig
cn: openssh-lpk
olcAttributeTypes: ( 1.3.6.1.4.1.24552.500.1.1.1.13 NAME 'sshPublicKey'
  DESC 'MANDATORY: OpenSSH Public key'
  EQUALITY octetStringMatch
  SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 )
olcObjectClasses: ( 1.3.6.1.4.1.24552.500.1.1.2.0 NAME 'ldapPublicKey' SUP top AUXILIARY
  DESC 'MANDATORY: OpenSSH LPK objectclass'
  MAY ( sshPublicKey $ uid )
  )

Una vez tengamos el fichero lo añadimos con la api de «OpenLDAP» ldapadd -H ldapi:/// -Y EXTERNAL -f openssh-lpk.ldif:

SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry "cn=openssh-lpk,cn=schema,cn=config"

Una vez añadido ya podremos usar el atributo “sshPublicKey”.

Agregamos el grupo «2asir» con «gidNumber=2002», para ello creamos un fichero grupo.ldif

dn: cn=grupo1,ou=Group,dc=jlramirez,dc=gonzalonazareno,dc=org
objectClass: top
objectClass: posixGroup
gidNumber: 2002
cn: 2asir 

Y lo añadimos al árbol ldapadd -x -D "cn=admin,dc=jlramirez,dc=gonzalonazareno,dc=org" -W -f grupos.ldif

Creación de script en python para cargar fichero «.json»

Vamos a crear un script en python el cual podrás encontrar en mi Python-LDAP Juanlu Ramirez, para poblar mediante el fichero JSON creado entre todos mi árbol de LDAP, para ello instalamos el siguiente paquete apt install python-ldap, para obtener un correcto funcionamiento del script en python:

Y ejecutamos nuestro «Poblar-LDAP.py»:

root@servidor:/home/vagrant# python Poblar-LDAP.py 
Contraseña del usuario admin LDAP: 
Usuario juanluis.ramirez insertado.
Info! Importante nuestro dominio va a variar en este caso segun nuestro nombre pero podeis poner el nombre que querais.

Autentificación usuarios con LDAP + PAM

Vamos a autentificar los usuarios con «LDAP + PAM» para ello vamos a proceder a instalar los siguientes paquetes apt install libnss-ldapd:

Una vez instalados los paquetes configuramos el fichero para las autentificaciones /etc/nsswitch.conf y añadimos lo siguiente:

# /etc/nsswitch.conf
#
# Example configuration of GNU Name Service Switch functionality.
# If you have the `glibc-doc-reference' and `info' packages installed, try:
# `info libc "Name Service Switch"' for information about this file.

passwd:         compat ldap
group:          compat ldap
Info! Puede venir configurado, si es así no toques nada, sino, añadir «ldap» al final.

Y ahora vamos a configurar para que se creen la carpeta de directorio de cada usuario al vuelo para ello configuramos el fichero /etc/pam.d/common-session y añadamos la siguiente linea:

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

Una de las directivas añadidas concretamente la primera la de creación del usuario no funcionará correctamente ya que debemos generar un fichero de configuración el cual añadirá la directiva.

Vamos a crear el fichero de configuración de PAM /usr/share/pam-configs/mkhomedir para que cree los home al vuelo con el inicio de sesión.

Name: Create home directory during login
Default: yes
Priority: 900
Session-Type: Additional
Session:
   required        pam_mkhomedir.so umask=0022 skel=/etc/skel

Configurar servicio SSH para acceder con los usuarios añadidos

Para poder autentificar los usuarios que tenemos en ldap con su clave publica vamos a realizar el siguiente script autentificacion_ssh.sh que se encuentra en mi github Python-LDAP Juanlu Ramirez:

Y añadimos las siguientes lineas a /etc/ssh/sshd_config, para que «sshd» ejecute el script automáticamente cuando intentes conectarte al usuario:

AuthorizedKeysCommand       /etc/ssh/ssh.sh
AuthorizedKeysCommandUser   nobody
Info! El script debe estar alojado en la ruta que podemos observar arriba /etc/ssh/ssh.sh, pero el script se puede llamar diferente.

Y reiniciamos el servicio service sshd restart:

Una vez configurado el apartado anterior, para crear al vuelo el «home» del usuario y ya desde un cliente donde tengamos la clave privada nos conectamos al servidor «barney» y observamos se crea el home y ya tenemos acceso al usuario:

juanlu@Juanlu-PC:~/.ssh$ ssh -i openstack juanluis.ramirez@172.22.200.137
Creating directory '/home/juanluis.ramirez'.
juanluis.ramirez@barney:~$

Eliminar usuarios del arbol

Desde el servidor LDAP ejecutamos el script en python Eliminar-LDAP.py que encontraras en mi github Python-LDAP Juanlu Ramirez el cual debemos hacer pequeñas modificaciones para que funcione en nuestro dominio, dado que cada uno va a tener un dominio distinto.
Vamos a modificar cn=admin,dc=barney,dc=jlramirez,dc=gonzalonazareno,dc=org, por el nuestro, es importante que dicho script se encuentre en el mismo directorio que el fichero .json