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