====== 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 [[http://linux.die.net/man/5/netgroup|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