Guía de Configuración de Usuario y Seguridad SSH

Al arrancar nuestro servidor, lo primero que deberemos hacer será realizar una configuración básica de nuestro entorno. Lo primero será crear un usuario que no sea el usuario root por defecto. A dicho usuario podremos asignarle permisos de sudo para que pueda escalar privilegios y realizar puntualmente tareas administrativas.

1. Crear el usuario exampleuser con permisos de sudo

Ejecuta los siguientes comandos en la terminal:

# Crea el usuario 'exampleuser'
sudo adduser exampleuser

Durante este proceso, se te pedirá que configures una contraseña para el nuevo usuario y que completes información adicional (que puedes omitir presionando Enter).

Para agregar el usuario exampleuser al grupo sudo, usa el siguiente comando:

# Agrega 'exampleuser' al grupo sudo para permisos de administrador
sudo usermod -aG sudo exampleuser

Este comando le da al usuario exampleuser permisos de sudo, lo que le permitirá ejecutar comandos administrativos.

2. Cambiar la contraseña de root

Puede que hayamos adquirido el servidor en una compañía de Hosting que nos ha proporcionado los datos básicos de conexión al servidor, entre ellos la contraseña del usuario root la cual deberíamos conocer solo nosotros, por lo que es muy recomendable cambiar la contraseña por defecto. Para cambiar la contraseña del usuario root, utiliza el siguiente comando:

sudo passwd root

Luego, ingresa la nueva contraseña para el usuario root y confirma la contraseña.

Verificación

Puedes iniciar sesión como exampleuser o utilizar el comando su - exampleuser para cambiar a este usuario dentro de la terminal actual. También puedes usar sudo -i después de iniciar sesión como exampleuser para confirmar que tienes permisos administrativos.

3. Securización de la configuración de SSH

Nuestra vía principal de conexión/acceso a un servidor Linux será a través de una conexión SSH. Normalmente el puerto de conexión será el puerto 22 TCP.

Al ser ésta la principal vía de acceso, conviene securizarla al máximo posible para evitar accesos no deseados. Pensemos que los servidores suelen ser máquinas expuestas a Internet y funcionando los 365 días del año y son un objetivo fácil para cualquier atacante, por lo que deberemos tratar de reducir lo máximo posible la superficie de ataque con una buena configuración de los servicios del servidor que se expongan, como en este caso el servicio SSH.

Configuración del fichero /etc/ssh/sshd_config

Configuración básica y personalizada de SSH para securizarlo. Esta configuración es muy mejorable, por ejemplo utilizando y limitando el método de autenticación por clave pública, desactivando la autenticación por contraseña.

# Puerto SSH (puedes elegir otro puerto alto no reservado en el rango 1024-65535).
Port 8492

# Permitir solo ciertos usuarios.
AllowUsers exampleuser

# Deshabilitar el inicio de sesion directo de root.
PermitRootLogin no

# Habilitar autenticacion mediante contrasena y deshabilitar contrasenas vacias.
PasswordAuthentication yes
PermitEmptyPasswords no

# Desactivar autenticacion de teclado interactivo si no es necesario.
KbdInteractiveAuthentication no

# Usar solo el protocolo SSH version 2, que es mas seguro.
Protocol 2

# Mejorar el registro para capturar eventos de autenticacion.
SyslogFacility AUTH
LogLevel VERBOSE

# Opcional: Limitar el tiempo de gracia para inicio de sesion y numero de intentos fallidos.
LoginGraceTime 30
MaxAuthTries 3
MaxSessions 2

# Limitar los algoritmos criptograficos a opciones fuertes.
Ciphers aes256-ctr,aes192-ctr,aes128-ctr
MACs hmac-sha2-512,hmac-sha2-256
KexAlgorithms [email protected]

# Deshabilitar el reenvio de agente y de TCP para reducir vectores de ataque.
AllowAgentForwarding no
AllowTcpForwarding no

# Desactivar X11 forwarding a menos que sea necesario.
X11Forwarding no

# Deshabilitar la importacion de variables de entorno para mayor seguridad.
PermitUserEnvironment no

# Mostrar un banner de advertencia personalizado (opcional).
Banner /etc/issue.net

# Configurar tiempo de espera para desconectar sesiones inactivas.
ClientAliveInterval 300
ClientAliveCountMax 2

# Subsistema SFTP habilitado.
Subsystem sftp /usr/lib/openssh/sftp-server

# Permitir solo variables de entorno especificas (si es necesario).
AcceptEnv LANG LC_*

# Ocultar la version de SSH en el banner para evitar exposicion de informacion.
VersionAddendum none

Reinicio del servicio SSH para aplicar los cambios

Reinicio del servidio SSH para aplicar la configuración

sudo systemctl restart ssh

A continuación, se detalla una configuración segura para el servicio SSH, explicando cada parámetro y su impacto en la seguridad del sistema. Además, se incluyen recomendaciones adicionales para reforzar la seguridad de la conexión SSH.

Detalle de los parámetros configurados en SSH

Puerto SSH

Port 8492
  • Descripción: Define el puerto en el que el servicio SSH estará a la escucha.
  • Recomendación de Seguridad: Usa un puerto alto no reservado (en el rango 1024-65535) para evitar ataques automatizados en el puerto estándar (22). En este caso, hemos configurado el puerto 8492.
  • Consejo Adicional: Cambiar periódicamente el puerto puede reducir la exposición a ataques, aunque no sustituye otras medidas de seguridad.
  • Nota: Si tenemos un firewall activado en la propia máquina o un firewall externo previo al servidor (entre Internet y la máquina) deberemos asegurarnos de abrir el puerto TCP que hayamos configurado en este parámetro para permitir el tráfico de entrada.

Permitir solo ciertos usuarios

AllowUsers exampleuser
  • Descripción: Restringe el acceso SSH a usuarios específicos.
  • Recomendación de Seguridad: Limitar los usuarios permitidos reduce el riesgo de acceso no autorizado al sistema. Aquí, solo exampleuser puede iniciar sesión.
  • Consejo Adicional: Limita aún más el acceso al permitir solo usuarios específicos del sistema y evita usuarios con privilegios elevados.

Deshabilitar el inicio de sesión directo de root

PermitRootLogin no
  • Descripción: Prohíbe el inicio de sesión directo con el usuario root.
  • Recomendación de Seguridad: Obligar a los administradores a usar un usuario menos privilegiado y luego escalar permisos reduce la exposición del usuario root.
  • Consejo Adicional: Configura un usuario administrativo con permisos de sudo y mantén el inicio de sesión de root siempre desactivado.

Autenticación mediante contraseña y contraseñas vacías

PasswordAuthentication yes
PermitEmptyPasswords no
  • Descripción: Permite el inicio de sesión con contraseña y prohíbe contraseñas vacías.
  • Recomendación de Seguridad: Activar PasswordAuthentication pero desactivar PermitEmptyPasswords garantiza que todos los accesos con contraseña requieran credenciales seguras.
  • Consejo Adicional: Considera desactivar PasswordAuthentication completamente (PasswordAuthentication no) y usa solo autenticación de clave pública para mejorar la seguridad ya que es más segura que la autenticación por contraseña y reduce el riesgo de ataques de fuerza bruta. Para activar la autenticación por clave pública añade el parámetro PubkeyAuthentication yes a este fichero de configuración.
  • Nota autenticación clave pública: La autenticación por clave pública requiere previamente de la creación de un par de claves (privada/pública) y su correcta configuración en el usuario, lo cual se tratará específicamente en otro artículo.

Autenticación de teclado interactivo

KbdInteractiveAuthentication no
  • Descripción: Desactiva la autenticación de teclado interactivo.
  • Recomendación de Seguridad: Si no es necesario, desactivar esta opción reduce los métodos de autenticación y fortalece la seguridad.
  • Consejo Adicional: Limita los métodos de autenticación activos en SSH a los estrictamente necesarios para reducir la superficie de ataque.

Protocolo SSH

Protocol 2
  • Descripción: Establece el uso del protocolo SSH versión 2.
  • Recomendación de Seguridad: SSH-2 es más seguro y moderno, mientras que SSH-1 tiene vulnerabilidades conocidas.
  • Consejo Adicional: Asegúrate de que todos los clientes SSH en la red también estén configurados para usar SSH-2.

Registro de eventos de autenticación

SyslogFacility AUTH
LogLevel VERBOSE
  • Descripción: Configura el nivel de registro para capturar eventos de autenticación.
  • Recomendación de Seguridad: LogLevel VERBOSE proporciona detalles de intentos de autenticación, útil para auditorías y detección de ataques.
  • Consejo Adicional: Revisa regularmente los logs de SSH para detectar intentos de acceso no autorizado y considera integrar los logs en un sistema centralizado de monitoreo.

Tiempo de gracia e intentos fallidos

LoginGraceTime 30
MaxAuthTries 3
MaxSessions 2
  • Descripción: Controla el tiempo de espera para el inicio de sesión y limita el número de intentos fallidos y sesiones.
  • Recomendación de Seguridad: Configurar tiempos breves y límites bajos reduce los intentos de fuerza bruta y el abuso de sesiones.
  • Consejo Adicional: Configura LoginGraceTime a 20 segundos o menos para reducir la exposición a conexiones ociosas.

Algoritmos criptográficos fuertes

Ciphers aes256-ctr,aes192-ctr,aes128-ctr
MACs hmac-sha2-512,hmac-sha2-256
KexAlgorithms [email protected]
  • Descripción: Limita los algoritmos a opciones criptográficas seguras.
  • Recomendación de Seguridad: Restringir algoritmos garantiza el uso de métodos de encriptación robustos, protegiendo la integridad de la comunicación.
  • Consejo Adicional: Revisa y actualiza regularmente la lista de algoritmos para evitar el uso de algoritmos obsoletos.

Reenvío de agente y de TCP

AllowAgentForwarding no
AllowTcpForwarding no
  • Descripción: Desactiva el reenvío de agentes y de conexiones TCP.
  • Recomendación de Seguridad: Reducir estos vectores minimiza el riesgo de ataques que aprovechen el reenvío de conexiones.
  • Consejo Adicional: Evita estas opciones a menos que se requiera específicamente para una aplicación segura.

X11 Forwarding

X11Forwarding no
  • Descripción: Deshabilita el reenvío X11.
  • Recomendación de Seguridad: Desactivar X11 evita la exposición de aplicaciones gráficas en sistemas sin necesidad de interfaz gráfica.

Importación de variables de entorno

PermitUserEnvironment no
  • Descripción: Impide la importación de variables de entorno.
  • Recomendación de Seguridad: Evitar la importación de variables reduce posibles inyecciones de variables maliciosas.
Banner /etc/issue.net
  • Descripción: Muestra un banner de advertencia personalizado.
  • Recomendación de Seguridad: Un banner disuade a usuarios no autorizados y advierte sobre la política de acceso.

Tiempo de espera para sesiones inactivas

ClientAliveInterval 300
ClientAliveCountMax 2
  • Descripción: Configura el tiempo de inactividad para desconectar sesiones inactivas.
  • Recomendación de Seguridad: Forzar la desconexión de sesiones ociosas reduce el riesgo de uso indebido si una sesión queda desatendida.
  • Consejo Adicional: Ajusta ClientAliveInterval a un intervalo más corto (ej. 120 segundos) para mayor seguridad en sesiones críticas.

Subsistema SFTP

Subsystem sftp /usr/lib/openssh/sftp-server
  • Descripción: Habilita el subsistema SFTP.
  • Recomendación de Seguridad: Activar SFTP proporciona una alternativa segura para la transferencia de archivos, en lugar de FTP.

Variables de entorno permitidas

AcceptEnv LANG LC_*
  • Descripción: Permite solo ciertas variables de entorno.
  • Recomendación de Seguridad: Restringir a variables específicas minimiza el riesgo de exposición de información sensible.

Ocultar versión de SSH

VersionAddendum none
  • Descripción: Elimina la versión de SSH del banner.
  • Recomendación de Seguridad: Ocultar la versión del servicio dificulta la identificación del sistema y posibles ataques dirigidos.

Recomendaciones de seguridad SSH generales

  • Monitoreo Activo: Revisa los registros de SSH periódicamente y utiliza herramientas de monitoreo para detectar intentos de acceso no autorizados.
  • Firewall: Configura reglas de firewall para restringir el acceso al puerto SSH solo desde IPs confiables o redes específicas.
  • Fail2Ban: Considera usar Fail2Ban para bloquear IPs automáticamente después de múltiples intentos fallidos de inicio de sesión. Posiblemente lo tratemos en otro artículo específicamente.
  • Desactivar SSH si no es necesario: En entornos donde SSH no es necesario permanentemente, considera detener el servicio y activarlo solo cuando se necesite.