Bloques Match: Configurando SSH server al detalle
Hemos hablado mucho de SSH en este blog y en mi Curso de SSH, y siempre hay cosas nuevas para aplicar! Hoy aprenderemos a usar los bloques Match para añadir detalles de configuración.
Hemos hablado mucho de SSH en el blog, y siempre surgen configuraciones y detalles nuevos para este genial protocolo.
Hoy, respondiendo a una duda de uno de mis alumnos del curso de SSH, una explicación detallada del uso de los bloques Match
en el archivo de configuración del servidor, sshd_config
, para añadir configuraciones particulares dependiendo del usuario que se intente conectar al servicio.
Bloques Match y configuraciones
El archivo de configuración del servidor SSH, /etc/sshd_config
, permite especificar opciones de configuración globales. Estas opciones son las que generalmente nosotros utilizamos para especificar el comportamiento del servicio.
No obstante, existe un modo de especificar configuraciones particulares dependiendo del usuario que se conecte, o de los usuarios de un grupo determinado, o conexiones provenientes desde un host o dirección, o desde un puerto origen determinado.
Estas configuraciones particulares se especifican mediante los denominados bloques Match
, y estas configuraciones sobreescriben las globales para la entidad que coincida con los criterios de selección de Match
.
Así, por ejemplo, si en las configuraciones globales configuramos un máximo de intentos de login de 3 (MaxAuthTries
), podríamos sobreescribir esa opción y darle 5 intentos al usuario pedro
mediante un bloque Match
.
Bloques Match: criterios de selección
Los argumentos del bloque Match
son uno o pares de patrones de selección, o la directiva All
, que coincide con todos los criterios.
La sintaxis es la siguiente:
Match Criterio Patrón[,patrón)*
Opcion Valor
...
Entre los principales criterios se pueden listar los siguientes:
- User: permtie especificar un nombre de usuario, o varios separados por coma.
- Group: uno o varios grupos de usuarios del sistema.
- Address: una o más direcciones IP origen de la comunicación.
- LocalAddress: una o más direcciones IP destino de la comunicación.
- LocalPort: uno o más puertos destino de la comunicación.
Para cada criterio pueden especificarse varios patrones separándolos por coma. Por ejemplo, para especificar opciones si el usuario que se conecta es juan
o pedro
:
Match User juan,pedro
Opciones...
Otro ejemplo, si el usuario intenta conectarse desde la IP 11.22.33.44
, podemos especificar opciones de esta forma:
Match Address 11.22.34.44
Opciones...
Además, pueden negarse patrones de selección también:
Match Group !usuarios_administradores
Opciones...
Y por si esto fuera poco, pueden añadirse varios patrones y criterios en cada bloque Match
. Supongamos que queremos especificar configuraciones para el usuario diego
o para las conexiones realizadas desde el equipo 192.168.0.150
:
Match User diego Address 192.168.0.150
Opciones...
Aquí también pueden negarse criterios utilizando el operador !
, así, por ejemplo, podría especificarse el criterio Address !10.0.0.1
para matchear con todas las conexiones origen excepto aquellas que provengan desde el equipo 10.0.0.1
.
Bloques Match: Opciones disponibles
No todas las opciones de configuración de SSH están disponibles dentro de bloques Match
. Según el man 5 sshd_config
, en la sección Match
, las opciones disponibles son las siguientes:
Entre las opciones comunes que he utilizado personalmente, y que he explicado en mi curso, podemos mencionar ChrootDirectory
, ForceCommand
, LogLevel
, MaxAuthTries
, MaxSessions
, PasswordAuthentication
, PerrmitEmptyPassword
, PermitRootLogin
, PubkeyAuthentication
y X11Forwarding
.
Un ejemplo simple
Veamos un pequeño ejemplo de uso aplicado a privilegios de diferentes usuarios.
Supongamos que tenemos dos usuarios en el sistema: andy
y uaa
(si, son users que tengo en mi sistema, users que alguna vez creé para algo XD).
Supongamos que el usuario andy
debería poder autenticarse mediante clave pública, y también mediante password en el caso de que la clave no coincida. Podríamos añadir un bloque Match
como el siguiente:
Match User andy
PasswordAuthentication yes
PubkeyAuthentication yes
Además, el usuario uaa
solamente debería poder autenticarse mediante clave pública, pero no por contraseña. Si ya hemos realizado el intercambio de la clave como alguna vez charlamos, podríamos añadir un bloque Match
como el que sigue:
Match User uaa
PasswordAuthentication no
PubkeyAuthentication yes
Se pueden probar las configuraciones disponibles utilizando el modificador -T
del comando sshd
. De esta manera, la opción -C
permite especificar parámetros de conexión, que incluyen variables como addr
, user
o host
. Para más opciones, ver man 8 sshd
.
Veamos qué configuraciones disponibles tenemos, en cuanto a autenticación, para los dos usuarios:
Otro ejemplo simple
Una buena práctica de hardening en el servicio SSH es deshabilitar el login de usuario root. No obstante, supongamos que el equipo 192.168.0.150
, cliente de mi servidor SSH, es mi consola de administración del servidor.
Supongamos que soy un poco holgazán y me resulta muy trabajoso conectarme como usuario común y luego usar herramientas como su
o sudo
para escalar privilegios, y quiero, desde esa consola, conectarme como root directamente.
Una buena opción sería desactivar el login de root de manera global, pero activarlo en un bloque Match
que coincida con la IP de mi host de administración… algo así:
# Opciones globales
PermitRootLogin no
Match Address 192.168.0.150
PermitRootLogin yes
De esta manera quedaría deshabilitado el login de root para todos excepto para las conexiones provenientes desde la IP 192.168.0.150
.
Al igual que en el caso anterior, veamos qué parámetros de configuración tiene disponibles la IP 192.168.0.150
, comparada con otra IP que no disponga el Match
:
Orden de las opciones de configuración
Un detalle a tener en cuenta. Yo he indentado las opciones de los bloques Match
por claridad, pero esto no es Python, y el bloque no cierra cuando termina el indentado. Las opciones siguen vigentes.
Esto quiere decir que, si ponemos un bloque Match
al principio del archivo sshd_config
, todas las opciones restantes estarán dentro de dicho bloque.
Aquí yo he encontrado dos formas de separar o delimitar los bloques Match y las opciones globales.
Una, si los bloques Match
los escribimos al principio del archivo, podríamos crear un bloque Match para todos con las opciones globales, algo así:
Match Criterio Patrón
# Opciones particulares
Match All
# Opciones globales
Otra opción, que para mi resulta más cómoda, es ubicar los bloques Match
al final del archivo de configuraciones:
# Opciones globales
Match Criterio Patrón
# Opciones particulares
Además, se debe considerar qué ocurre si una opción de configuración se repite en varios bloques Match
, solamente se aplicará la primera ocurrencia, por lo que el resto pueden omitirse. Así, podríamos reducir nuestro ejemplo de los dos usuarios a lo siguiente:
Match User andy
PasswordAuthentication yes
PubkeyAuthentication yes
Match User uaa
PasswordAuthentication no
Aquí ambos usuarios tienen habilitada la autenticación por clave pública, y sólo el usuario uaa
desactiva, además, la autenticación por password.
Conclusiones
Hemos visto un par de ejemplos sencillos sobre las configuraciones de patrones Match
, pero pueden haber muchas otras variantes y combinaciones, así que los invito a probar cosas y a jugar con las opciones!
Como siempre, los invito a escribirme por cualquier duda o comentario que tengan!
Será hasta la próxima!