SSH jumpserver

Guía sobre cómo desplegar un jumpserver para centralizar y securizar el acceso por SSH con MFAS

Planificación y diseño

Un jumpserver (o bastion host) es un servidor intermedio que actúa como punto de acceso seguro a una red privada desde una red externa. Su función principal es controlar y monitorear el acceso a los sistemas internos, proporcionando una capa adicional de seguridad.

En este proyecto, el objetivo es desplegar un jumpserver que permita a los administradores de sistemas acceder de forma segura a los servidores internos mediante SSH, implementando autenticación multifactor (MFA) para mejorar la seguridad.

El jumpserver permitirá el acceso a los servidores internos solo a través de este punto centralizado. Además, se implementará MFA utilizando Google Authenticator para añadir una capa extra de seguridad durante el proceso de autenticación SSH.

Configuración ssh

Configuración ssh (/etc/ssh/sshd_config)

# === Configuracion de red ===
ListenAddress {ip}
Port {puerto ssh} # Puerto no estandar

# === Protocolos permitidos ===
Protocol 2
HostKey /etc/ssh/ssh_host_ed25519_key # Modern, fast, secure
# Regenerate keys: ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -N ""

# Solo usar algoritmos modernos
KexAlgorithms curve25519-sha256,curve25519-sha256@libssh.org
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com

# === Autenticacion ===
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
UsePAM yes

# === Politicas de sesion ===
X11Forwarding
PermitTunnel no
PermitUserEnvironment no
TCPKeepAlive no # Prevent connection hijacking
ClientAliveInterval 300 # 5 minute idle timeout
ClientAliveCountMax 2
IgnoreRhosts yes
UseDNS no

# === Logging ===
SyslogFacility AUTH
LogLevel VERBOSE # Logs fingerprints for key tracking

# === Restricciones de usuarios ===
MaxAuthTries 3
MaxSessions 2
LoginGraceTime 30
AllowGroups ssh-user

# No permite a los usuarios logearse en el propio jumpserver
Match Group ssh-user
  ForceCommand /sbin/nologin

Creación de usuarios y gestión de claves

El primer paso es crear el usuario y añadirlo al grupo ssh-user

groupadd ssh-user
useradd -m -G ssh-user usuario_prueba

El siguiente paso es crear un par de claves y mover la clave pública al directorio de claves del usuario (/home/nombre_de_usuario/.shh/authorized_keys)

ssh-keygen -t ed25519

Configuración de firewall

Para acabar de configurar el servidor tenemos que configurar el firewall, y además, para forzar que las conexiones SSH se realicen únicamente a través del jumpserver, debemos permitir solo las conexiones entrantes al puerto {puerto ssh} (el puerto no estándar configurado en sshd_config) desde la dirección IP del cliente que se conectará al jumpserver.

# Configuración en el jumpserver
sudo ufw allow from {Rango de red permitido en CIDR} to any port {puerto ssh} proto tcp

# Configuración en el resto de servidores
sudo ufw allow from {IP del jumpserver} to any port 22 proto tcp

Configuración de usuario

Y por último, la configuración del usuario (~/.ssh/config)

# SSH Jump Server
Host jumpserver
  HostName {ip}
  User {usuario}
  Port {puerto ssh}
  IdentityFile ~/.ssh/id_ed25519

# Servidores internos via jumpserver
Host *.tudominio.com
  ProxyJump jumpserver
  User {usuario}
  IdentityFile ~/.ssh/id_ed25519

Host ejemplo1.tudominio.com
  HostName 1.2.3.4

Host ejemplo2.tudominio.com
  HostName 2.3.4.5

Configuración MFA

El multifactor es un estandar de seguridad que requiere múltiples formas de autenticación antes de permitir el acceso a un sistema. Es mejor práctica aplicarlo también al acceso SSH.

En este caso usaremos Google Authenticator, que genera códigos TOTP (Time-based One-Time Password) en el móvil. Para ello instalamos el paquete libpam-google-authenticator en el jumpserver

apt-get install libpam-google-authenticator

Después editamos el archivo /etc/pam.d/sshd para añadir la siguiente línea al final del archivo:

auth required pam_google_authenticator.so

Finalmente editamos el archivo /etc/ssh/sshd_config para asegurarnos de que la autenticación por PAM está habilitada:

UsePAM yes
ChallengeResponseAuthentication yes
AuthenticationMethods publickey,keyboard-interactive

Cada usuario debe configurar su MFA ejecutando el comando google-authenticator. Esto generará un código QR que puede escanearse con la aplicación Google Authenticator en el móvil.

google-authenticator

# Make tokens “time-base””: yes
# Update the .google_authenticator file: yes
# Disallow multiple uses: yes
# Increase the original generation time limit: no
# Enable rate-limiting: yes

Conclusiones y posibles mejoras

Con este proyecto hemos conseguido reducir la superficie de ataque y mejorar la seguridad general del entorno de red, sin comprometer la funcionalidad del sistema. El resto de servidores son accesibles únicamente a través del jumpserver y el propio jumpserver no permite acceso directo.

Posibles mejoras: