Control de acceso granular en OpenSSH

A veces nos podemos encontrar con que queremos restringir el acceso por SSH a determinados usuarios evitando el acceso al resto o por ejemplo que el usuario root se pueda conectar directamente pero sólo desde una determinada ip o desde un host determinado…

PAM (Pluggable Authentication Modules)

Uno de los métodos para conseguir este objetivo es usar el módulo de PAM, pam_access.

El fichero de configuración por defecto de este módulo es /etc/security/access.conf pero, puesto que el módulo puede estar siendo usado por otros servicios (tipicamente crond), para no romper nada crearemos un fichero específico para sshd (por ej: /etc/security/access-sshd.conf).

La sintaxis a usar en este tipo de ficheros es:

permiso : usuario : origen

permiso: Puede ser el signo «+» (acceso permitido) o el signo «-» (permiso denegado)

usuario: Nombre de usuario o también grupo. Existen palabras clave como ALL (todos)

origen: Puede ser la IP origen pero también el nombre de host o el dominio desde el que se hace la conexión.

El orden en el que se ponen las líneas es importante ya que son evaluadas de arriba-abajo hasta encontrar una que «machea».

Por ejemplo para permitir unicamente el acceso root desde la ip 172.16.100.25 y al resto de usuarios, desde cualquier IP:

[root@desdelaconsola.es]# cat /etc/security/access-sshd.conf
+ : root : 172.16.100.25
- : root : ALL
+ : ALL : ALL

(Verificar que no lo dejamos con permiso de escritura para otros)

Para aplicar la configuración, necesitaremos especificar a PAM que, para el servicio sshd, evalúe el fichero que acabamos de configurar.

Para ello, en el fichero /etc/pam.d/sshd añadimos la línea:

account    required     pam_access.so accessfile=/etc/security/access-sshd.conf

dejándolo de la siguiente manera:

[root@desdelaconsola.es]# cat /etc/pam.d/sshd
#%PAM-1.0
auth       include      system-auth
account    required     pam_nologin.so
account    required     pam_access.so accessfile=/etc/security/access-sshd.conf
account    include      system-auth
password   include      system-auth
session    optional     pam_keyinit.so force revoke
session    include      system-auth
session    required     pam_loginuid.so
[root@desdelaconsola.es]#

OJO! ya que una vez que guardemos el fichero, empieza a aplicarse y dependiendo de la configuración podemos quedarnos sin conexión…

Logicamente para que esta configuración funcione deberemos tener:

PermitRootLogin yes

en el fichero de configuración del servidor SSH (/etc/ssh/sshd_config).

Configuración sshd

La configuración explicada anteriormente puede extrapolarse a muchos de los servicios listados en el directorio /etc/pam.d y para el servidor SSH funciona correctamente por lo que no está de más conocerla, pero el propio demonio SSH incorpora un método para lograr una configuración granular en cuanto al acceso y lo hace mediante las directivas DenyUsers, AllowUsers, DenyGroups y AllowGroups.

En estas directivas podemos especificar nombres de usuario (incluso mediante patrones) separados por espacios, también con la posibilidad de incluir la ip de origen.

Hay que destacar que las directivas se evalúan en orden, primero DenyUsers, luego AllowUsers, luego DenyGroups y por último AllowGroups.

Simplemente configurando AllowUsers restringimos el acceso a todos los demás usuarios que no estén listados en esta directiva sin necesidad de «tocar» DenyUsers. Por ejemplo configurando:

AllowUsers admin@172.16.100.25

podremos ver los intentos fallidos de conexión con este mismo usuario desde otra ip en el fichero /var/log/auth.log:

[root@desdelaconsola.es]# tail /var/log/auth.log
Oct 24 17:36:06 desdelaconsola.es sshd[16227]: User admin from 192.168.9.98 not allowed because not listed in AllowUsers

Directiva «Match»

Esta directiva de la configuración del demonio sshd nos ofrece aún más posibilidades que las vistas anteriormente pudiendo especificar bloques de directivas que aplicarán tan sólo a los criterios que «macheen».

Podemos buscar en función de usuario, grupo, host o IP pudiendo además negar con el símbolo «!». Por ejemplo:

User miguel, juan, !angel

Una vez se cumple el criterio de búsqueda se aplican las directivas que tengamos a continuación hasta el siguiente Match, por eso es conveniente configurar esta característica al final del fichero ssdh_config.

Por ejemplo, para permitir el acceso de root desde una determinada IP:

Match Address 172.16.100.25
    PermitRootLogin yes

Otro ejemplo, para controlar el «Port Forwarding» según grupos:

Match Group admin
    AllowTcpForwarding yes
Match Group users
    AllowTcpForwarding no

Como veis, es realmente potente. No obstante, no todas las directivas están permitidas en los bloques «Match». Según el man:

Only a subset of keywords may be used on the lines following a Match keyword. Available keywords are
AllowAgentForwarding, AllowTcpForwarding, Banner, ChrootDirectory, ForceCommand, GatewayPorts,
GSSAPIAuthentication, HostbasedAuthentication, KbdInteractiveAuthentication, KerberosAuthentication,
MaxAuthTries, MaxSessions, PasswordAuthentication, PermitEmptyPasswords, PermitOpen, PermitRootLogin,
PubkeyAuthentication, RhostsRSAAuthentication, RSAAuthentication, X11DisplayOffset, X11Forwarding and
X11UseLocalHost.

tags: , ,
Escrito en Seguridad por Ignacio Vazquez

Follow comments via the RSS Feed | Deja un comentario | Trackback URL

Leave Your Comment

 
desdelaconsola.es