Table of Contents

SSH contra LDAP

Antecedentes

Objetivo: iniciar una sesion SSH con un usuario almacenado en un servidor LDAP (OpenLDAP en este caso) externo en lugar de en un archivo /etc/passwd local

Nota 1: la configuracion es 100% local, no hay que tocar el servidor LDAP

Nota 2: mejor usar /bin/bash como consola (editar ese campo en el servidor LDAP). Tiene autocompletion, colores, etc…

En este ejemplo:

* Servidor OpenLDAP v3
* El servidor requiere un usuario bind (no permite busquedas anonimas)
* Requiere TLS, pero el certificado esta autofirmado, por lo que el error debe ser ignorado por el cliente
* Detalle de los usuarios y grupos que usaremos en el ejemplo:

Servidor de LDAP

Usuarios

MUY IMPORTANTE QUE ESTÉN CREADOS ASÍ!!! (tiene que tener el campo uid)

dn: ou=people,dc=example,dc=com
objectclass: organizationalUnit
ou: people

dn: cn=user1,ou=people,dc=example,dc=com
cn: user1
gidnumber: 500
givenname: Name
homedirectory: /home/user1
loginshell: /bin/bash
objectclass: inetOrgPerson
objectclass: posixAccount
objectclass: top
sn: Surename
uid: user1
uidnumber: 1001
userpassword: {MD5}MD5hashedpassword

Grupos

dn: ou=groups,dc=example,dc=com
objectclass: organizationalUnit
objectclass: top
ou: groups

dn: cn=user1,ou=groups,dc=example,dc=com
cn: user1
gidnumber: 500
memberuid: user1 
objectclass: posixGroup
objectclass: top

Procedimiento

Cliente SSH

1. Instalar paquetes:

sudo aptitude update; sudo aptitude install libnss-ldapd

2. Pulsar “enter” en todas las preguntas, y si podemos elegir siempre “no”. Luego refinamos la configuracion

3. Detener el demonio que cachea los valores:

sudo /etc/init.d/nscd stop

4. Editar:

sudo cp /etc/nsswitch.conf /etc/nsswitch.conf.bak
sudo vim /etc/nsswitch.conf

Y dejar las siguientes lineas asi:

passwd:         compat ldap
group:          compat ldap
shadow:         compat ldap

5. Editar:

sudo rm -fr /etc/nslcd.conf; sudo vim /etc/nslcd.conf

Y anyadir el siguiente contenido:

# /etc/nslcd.conf
# nslcd configuration file. See nslcd.conf(5)
# for details.

# The user and group nslcd should run as.
uid nslcd
gid nslcd

# The location at which the LDAP server(s) should be reachable.
uri ldaps://ldap.local.example.org:636

# The search base that will be used for all queries.
base ou=people,dc=example,dc=com
base ou=groups,dc=example,dc=com

# The LDAP protocol version to use.
ldap_version 3

# The DN to bind with for normal lookups.
binddn cn=readonly,dc=example,dc=com
bindpw secretpassword

# SSL options
tls_reqcert allow

5. Reiniciar el servicio:

sudo /etc/init.d/nslcd restart

6. Probamos:

Para ver los usuarios del LDAP que no estén en /etc/passwd:

getent passwd

Probamos de conectar:

ssh -l user1 servidor1.example.com

Método 2

Actualmente se configura al instalar el paquete:

#apt-get install libpam-ldapd

Ponemos el servidor de LDAP, el dominio (por ejemplo dc=matarosensefils,dc=net) y marcamos los servicios:

passwd
group
shadow

sudo como grupo LDAP

Seguimos el ejemplo anterior, y ahora queremos:

* Crear un grupo en LDAP que se llame por ejemplo “ldapsudo”

# LDIF Export for cn=ldapsudo,ou=groups,dc=jamgo,dc=org
# Server:  (ldap.local.jamgo.org)
# Search Scope: sub
# Search Filter: (objectClass=*)
# Total Entries: 1
#
# Generated by phpLDAPadmin (http://phpldapadmin.sourceforge.net) on August 24, 2015 8:36 pm
# Version: 1.2.3

version: 1

# Entry 1: cn=ldapsudo,ou=groups,dc=jamgo,dc=org
dn: cn=ldapsudo,ou=groups,dc=jamgo,dc=org
cn: ldapsudo
gidnumber: 10003
memberuid: user1.surename1
memberuid: user2.surename2
objectclass: posixGroup
objectclass: top

* Que ese grupo sea el que determine que un usuario pertenece al selecto grupo de los “sudoers”

1. (Necesario en Ubuntu) Asignar una contrasenya al usuario “root”:

sudo passwd

2. Instalar paquetes:

sudo aptitude install sudo-ldap

Nota 1: instala como dependencia “nscd”, que al cachear usuarios es mejor detener para hacer pruebas

Nota 2: modifica el archivo /etc/nsswitch.conf y le anyade la siguiente linea:

sudoers:        files ldap

3. Convertirse en root:

su -

4. Editar archivo sudoers:

visudo

5. Dejar la linea asi:

%ldapsudo       ALL=(ALL:ALL) ALL

6. (Comprobar) Creo que es necesario cerrar todas las sesiones abiertas y ya se puede comprobar

Crear directorio /home al hacer primer login

https://wiki.debian.org/LDAP/PAM

Requisito: tener instalado el paquete libpam-ldapd

1. Editar:

sudo cp /etc/pam.d/common-session /etc/pam.d/common-session.bak
sudo vim /etc/pam.d/common-session

Con la siguiente linea:

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

SSH solo a los miembros de un grupo

https://wiki.debian.org/LDAP/PAM

TODO: hacer que funcione con grupos LDAP de tipo “posixGroup” en lugar de “nisNetgroup”

NOTA: mientras estamos haciendo pruebas nos aseguramos de que el demonio 'nscd' esta parado

0. (Servidor SSH) Instalar libpam-modules (seguramente ya instalados):

sudo aptitude update; sudo aptitude install libpam-modules

1. (Servidor LDAP) crear un grupo de tipo “nisNetgroup”:

dn: cn=ldapssh,ou=groups,dc=example,dc=com
cn: ldapssh
description: Users allowed to login via SSH
nisnetgrouptriple: (,user1,)
objectclass: nisNetgroup
objectclass: top

El usuario 'user1' es un usuario LDAP de tipo 'posixAccount'

TODO: para poder añadir mas de un usuario he tenido que modificar el schema de nis:

olcAttributeTypes: {12}( 1.3.6.1.1.1.1.14 NAME 'nisNetgr
 oupTriple' DESC 'Netgroup triple' SYNTAX 1.3.6.1.1.1.0.0 )

Por:

olcAttributeTypes: {12}( 1.3.6.1.1.1.1.14 NAME 'nisNetgroupTriple' DESC 'Netgr
 oup triple' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) 

2. (Servidor SSH) Editamos:

sudo cp /etc/pam.d/common-auth /etc/pam.d/common-auth.bak  
sudo vim /etc/pam.d/common-auth

Y dejamos la linea asi:

auth    required                        pam_access.so
auth    required                        pam_permit.so

NOTA: si solo dejamos “pam_access.so” las tareas cron dejan de funcionar. Con esa configuracion los efectos en mi caso son los deseados: cron funciona y los usuarios que no son miembros del grupo LDAP (se hace mas adelante) no pueden iniciar sesion por SSH

3. (Servidor SSH) Nos aseguramos que los netgroups de esta maquina se van a consultar tambien del servidor LDAP. Editamos:

sudo cp /etc/nsswitch.conf /etc/nsswitch.conf.bak
sudo vim /etc/nsswitch.conf

Y dejamos la linea asi:

netgroup:       nis     ldap

4. (Servidor SSH) Comprobamos que los netgroup tambien los toma del servidor LDAP:

sudo getent netgroup ldapssh

Salida esperada:

ldapssh              ( ,user1,)

5. (Servidor SSH) Especificamos quien puede acceder y quien no. En este caso damos acceso al usuario local 'localuser' y a los miembros del netgroup (ojo, ni 'posixGroup' de LDAP ni grupos locales) llamado 'ldapssh':

sudo cp /etc/security/access.conf /etc/security/access.conf.bak
sudo vim /etc/security/access.conf

Con el siguiente contenido:

+ : @ldapssh localuser : ALL
- : ALL : ALL