Bloques Match: Configurando SSH server al detalle

Publicado por Diego Córdoba en

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:

bloques match opciones keywords

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:

bloques match testeando 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:

bloques match testeando direcciones

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!


¿Preguntas? ¿Comentarios?

Si tenés dudas, o querés dejarnos tus comentarios y consultas, sumate al grupo de Telegram de la comunidad JuncoTIC!
¡Te esperamos!

Categorías: LinuxRedes

Diego Córdoba

- Ingeniero en Informática - Mg. Teleinformática - Tesis pendiente - Docente universitario - Investigador