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 desactivarPermitEmptyPasswords
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ámetroPubkeyAuthentication 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 de advertencia
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.