====== 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