• Crear entre todos los alumnos de la clase que vayan a hacer esta tarea un fichero CSV que incluya información personal de cada uno incluyendo los siguientes datos:

    • Nombre

    • Apellidos

    • Dirección de correo electrónico

    • Nombre de usuario

    • Clave pública ssh

  • Otro fichero con la siguiente información de los alumnos:

    • Hostname

    • IPv4

    • Clave pública de la máquina

  • Añadir el esquema openssh-lpk al directorio para poder incluir claves públicas ssh en un directorio LDAP.

  • Hacer un script en bash o en python que utilice el fichero como entrada y pueble el directorio LDAP con un objeto para cada alumno utilizando los ObjectClass posixAccount e inetOrgPerson.

  • Configurar el sistema para que sean válidos los usuarios del LDAP.

  • Configurar el servicio ssh para que permita acceder a los usuarios del LDAP utilizando las claves públicas que hay allí, en lugar de almacenarlas en .ssh/authorized_keys, que sólo permita acceder a los equipos que estén en el LDAP en lugar del fichero .ssh/known_hosts y que se cree el directorio “home” al vuelo.


Creación del fichero CSV.

  • Tenenmos un fichero csv con los siguientes usuarios:

  • Ahora necesitamos que añadir el esquema openssh-lpk. Tendremos que crear un fichero ldif en /etc/ldap/schema/ con este contenido:
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 )
  )
  • Ejecutamos este fichero.
usuario@apolo:/etc/ldap/schema$ sudo ldapadd -Y EXTERNAL -H ldapi:/// -f openssh-lpk.lidf 
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"

Script:

  • La forma más comoda que he encotrado para crear este script es usando python, puesto que tiene una librería sencilla de usar llamada pyhton3-ldap
import ldap3
from ldap3 import Connection, ALL
from getpass import getpass
from sys import exit

# VARIABLES


# Directorio donde estarán los home de los usuarios.
home_dir = '/home/'

# Valor inicial del UID que se asignan al añadir un usuarios.
uid_number = 5000

# GID de usuarios.
gid = 5000

# Shell de los usuarios.
shell = '/bin/bash'


# PROGRAMA


# Lista de cada línea del csv.
with open('usuarios.csv', 'r') as usuarios:
  usuarios = usuarios.readlines()

# Parametros para realizar la conexión.
ldap_server = 'ldaps://apolo.alexgv.gonzalonazareno.org:636'
dominio = 'dc=alexgv,dc=gonzalonazareno,dc=org'
user_admin = 'admin' 
pass = getpass('Contraseña: ')

# Intento de conexión.
conn = Connection(ldap_server, 'cn={},{}'.format(user_admin, dominio),pass)

# Comprobación de que la conexión se realiza correctamente.

if not conn.bind():
  print('No se ha podido conectar con ldap') 
  if conn.result['description'] == 'invalidCredentials':
    print('Credenciales no validas.')
  # Termina el script.
  exit(0)

# Recorre la lista de usuarios.
for user in usuarios:
  # Separa la información de cada línea y la añade a su correspondiente variable.
  user = user.split(',')
  cn = user[0]
  sn = user[1]
  mail = user[2]
  uid = user[3]
  ssh = user[4]

  # Añade el usuario.
  conn.add(
    'uid={},ou=Personas,{}'.format(uid, dominio),
    object_class = 
      [
      'inetOrgPerson',
      'posixAccount', 
      'ldapPublicKey'
      ],
    attributes =
      {
      'cn': cn,
      'sn': sn,
      'mail': mail,
      'uid': uid,
      'uidNumber': str(uid_number),
      'gidNumber': str(gid),
      'homeDirectory': '{}{}'.format(home_dir,uid),
      'loginShell': shell,
      'sshPublicKey': str(ssh)
      })

  if conn.result['description'] == 'entryAlreadyExists':
    print('El usuario {} ya existe.'.format(uid))

  # Aumentamos el valor de UID para que no de problemas al crearse dos usuarios con uid iguales.
  uid_number += 1

#Cierra la conexion.
conn.unbind()

Configurar que los usuarios sean validos.

  • Configuramos el fichero /etc/ldap/ldap.conf y configuramos esta línea.
BASE    dc=alexgv,dc=gonzalonazareno,dc=org
URI ldaps://127.0.0.1
  • Para que nuestro sistema pueda validar los UID y GID de ldap debemos añadir al fichero /etc/nsswitch.conf el servicio ldap de la siguiente forma:
passwd:         files systemd ldap
group:          files systemd ldap
shadow:         files ldap
  • Ahora instalamos el paquete apt install libnss-ldap.