Skip to Content

SSH Seguridad

Warning

26.10: no realice una purga masiva de los paquetes OpenSSH en el estado rc. Los paquetes de reemplazo pueden seguir usando la configuración anterior y la purga puede dañar SSH. Verifique 26.10 problemas conocidos y conserve el acceso de recuperación antes del mantenimiento remoto.

SSH es la herramienta principal para la administración remota de servidores Linux y uno de los objetivos más comunes de los atacantes. Este artículo explica cómo reforzar de manera integral la seguridad de SSH en Ubuntu 26.04.

Autenticación de claves

Generando un par de claves SSH

Genere un par de claves en el cliente (su computadora local):

# Generate an Ed25519 key (recommended, more secure and faster) ssh-keygen -t ed25519 -C "your_email@example.com" # If you need compatibility with older systems, use RSA 4096-bit ssh-keygen -t rsa -b 4096 -C "your_email@example.com" # You will be prompted: # Enter file in which to save the key (/home/user/.ssh/id_ed25519): # Enter passphrase (empty for no passphrase): # It is strongly recommended to set a passphrase

Implementación de la clave pública en el servidor

# Method 1: Using ssh-copy-id (recommended) ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server # Method 2: Manual copy cat ~/.ssh/id_ed25519.pub | ssh user@server "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys" # Method 3: Manual operation # On the server: mkdir -p ~/.ssh chmod 700 ~/.ssh nano ~/.ssh/authorized_keys # Paste the public key content chmod 600 ~/.ssh/authorized_keys

Inicio de sesión con clave de prueba

# Log in using the key ssh -i ~/.ssh/id_ed25519 user@server # If configured as the default key, log in directly ssh user@server

SSH Gestión de claves de agente

# Start SSH Agent eval "$(ssh-agent -s)" # Add a key to the Agent (enter the passphrase once to cache it) ssh-add ~/.ssh/id_ed25519 # List loaded keys ssh-add -l # Remove all cached keys ssh-add -D
Warning

Antes de modificar la configuración de SSH, asegúrese de que la autenticación de clave se haya probado correctamente y mantenga abierta su sesión actual de SSH. Solo cierre la conexión anterior después de verificar que puede iniciar sesión normalmente desde una nueva terminal; de lo contrario, una mala configuración podría bloquearlo permanentemente del servidor.

Fortalecimiento de la configuración del servidor SSH

Edite el archivo de configuración del servidor SSH:

sudo nano /etc/ssh/sshd_config

Deshabilitar el inicio de sesión con contraseña

Desactive el inicio de sesión con contraseña solo después de confirmar que el inicio de sesión con clave funciona:

# Disable password authentication PasswordAuthentication no # Disable empty passwords PermitEmptyPasswords no # Disable keyboard-interactive authentication KbdInteractiveAuthentication no

Deshabilitar el inicio de sesión root

# Completely prohibit root from logging in via SSH PermitRootLogin no # Or only allow root to log in with keys (not recommended) # PermitRootLogin prohibit-password

Cambiar el puerto predeterminado

# Use a non-standard port (reduces automated scanning) Port 2222

Después de cambiar el puerto, actualice las reglas de su firewall:

sudo ufw allow 2222/tcp sudo ufw delete allow 22/tcp

Restringir usuarios que inician sesión

# Only allow specific users to log in AllowUsers admin deployer # Only allow specific groups to log in AllowGroups sshusers # Deny specific users DenyUsers guest test

Otras configuraciones de seguridad

# Limit authentication attempts MaxAuthTries 3 # Limit concurrent unauthenticated connections MaxStartups 3:50:10 # Session timeout (disconnect after 300 seconds of inactivity) ClientAliveInterval 300 ClientAliveCountMax 2 # Disable X11 forwarding (servers usually don't need it) X11Forwarding no # Disable Agent forwarding (unless actually needed) AllowAgentForwarding no # Disable TCP forwarding (unless actually needed) AllowTcpForwarding no # Use strong encryption algorithms # Note: OpenSSH 10.2 (26.04) already prefers the post-quantum KEX mlkem768x25519-sha256 by default. # Avoid overriding KexAlgorithms — hardcoding a list freezes the algorithm set # and may end up dropping newly added post-quantum defaults in the future. Keep the secure defaults. # # Only override for troubleshooting or temporary interop with old clients, and always put the post-quantum algorithm first: # KexAlgorithms mlkem768x25519-sha256,sntrup761x25519-sha512@openssh.com,curve25519-sha256@libssh.org,curve25519-sha256 Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com # Display a login banner Banner /etc/ssh/banner.txt # Login grace time LoginGraceTime 30

Aplicar la configuración

# Check configuration syntax sudo sshd -t # Restart SSH service (on Ubuntu the unit is ssh.service; sshd is just an alias) sudo systemctl restart ssh # Note: on 26.04 ssh listens via socket activation by default, # so after changing the port you must reload the socket unit: sudo systemctl daemon-reload sudo systemctl restart ssh.socket # Important: Test the connection in a new terminal window -- do not close the current one! ssh -p 2222 user@server

Protección fail2ban

fail2ban monitorea los archivos de registro y prohíbe automáticamente las direcciones IP con múltiples intentos fallidos de inicio de sesión.

Instalación y configuración

# Install sudo apt install fail2ban # Start and enable at boot sudo systemctl enable --now fail2ban

Crear una configuración local

No edite directamente /etc/fail2ban/jail.conf; cree una configuración local en su lugar:

sudo nano /etc/fail2ban/jail.local
[DEFAULT] # Ban duration (seconds) bantime = 3600 # Detection time window (seconds) findtime = 600 # Maximum failed attempts maxretry = 3 # Ban action banaction = ufw # Ignored IPs (whitelist) ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24 # Email notifications # destemail = admin@example.com # sendername = Fail2Ban # mta = sendmail # action = %(action_mwl)s [sshd] enabled = true port = 2222 filter = sshd logpath = /var/log/auth.log maxretry = 3 bantime = 3600

Gestión de fail2ban

# View status sudo fail2ban-client status # View SSH jail status sudo fail2ban-client status sshd # View banned IPs sudo fail2ban-client status sshd | grep "Banned IP" # Manually ban an IP sudo fail2ban-client set sshd banip 203.0.113.50 # Manually unban an IP sudo fail2ban-client set sshd unbanip 203.0.113.50 # View fail2ban logs sudo tail -f /var/log/fail2ban.log # Reload configuration sudo fail2ban-client reload

Configuración avanzada de fail2ban

Proteger otros servicios:

# Nginx authentication protection [nginx-http-auth] enabled = true filter = nginx-http-auth port = http,https logpath = /var/log/nginx/error.log maxretry = 3 # Nginx malicious requests [nginx-botsearch] enabled = true filter = nginx-botsearch port = http,https logpath = /var/log/nginx/access.log maxretry = 2

SSH Configuración del cliente

Cree un archivo de configuración SSH en el cliente para simplificar las conexiones:

nano ~/.ssh/config
# Global settings Host * ServerAliveInterval 60 ServerAliveCountMax 3 AddKeysToAgent yes # Production server Host prod HostName 203.0.113.10 User admin Port 2222 IdentityFile ~/.ssh/id_ed25519_prod # Jump host Host bastion HostName 203.0.113.20 User jump Port 2222 IdentityFile ~/.ssh/id_ed25519 # Connect to an internal server via jump host Host internal HostName 10.0.1.50 User admin ProxyJump bastion IdentityFile ~/.ssh/id_ed25519

Conexiones simplificadas después de la configuración:

ssh prod ssh internal

Autenticación de dos factores

Agregue la autenticación de dos factores de Google Authenticator a SSH:

# Install sudo apt install libpam-google-authenticator # Each user runs the initialization google-authenticator # Follow the prompts to complete setup and scan the QR code # Configure PAM sudo nano /etc/pam.d/sshd # Add: # auth required pam_google_authenticator.so # Configure SSH sudo nano /etc/ssh/sshd_config # Set: # AuthenticationMethods publickey,keyboard-interactive # KbdInteractiveAuthentication yes sudo systemctl restart ssh

OpenSSH Intercambio de claves poscuántico

Ubuntu 26.04 envía OpenSSH 10.2, cuyo intercambio de claves predeterminado prefiere el esquema híbrido poscuántico mlkem768x25519-sha256 (ML-KEM-768 combinado con X25519), que protege contra Ataques de “cosechar ahora-descifrar-más tarde”.

# Confirm the KEX algorithms supported by your OpenSSH (should include mlkem768x25519-sha256) ssh -Q kex # Inspect the KEX algorithm actually negotiated for a connection ssh -v user@server 2>&1 | grep "kex:"
Note

El KEX poscuántico solo se utiliza cuando ambas partes lo apoyan. Al interoperar con clientes/servidores más antiguos (OpenSSH debajo de 9.0), automáticamente recurre al algoritmo clásico curve25519-sha256, sin necesidad de configuración manual. A menos que tenga un problema de compatibilidad real, no anule el valor predeterminado KexAlgorithms para evitar eliminar accidentalmente la protección poscuántica.

Monitoreo y Auditoría

# View successful login records last -n 20 # View failed login records lastb -n 20 # View SSH authentication logs journalctl -u ssh.service --since today | grep -E "Accepted|Failed" # Count failed login IPs journalctl -u ssh.service | grep "Failed" | awk '{print $(NF-3)}' | sort | uniq -c | sort -rn | head -20 # View current SSH connections who w ss -tnp | grep :22

Lista de verificación de seguridad

Antes de aplicar cambios, confirme lo siguiente:

  1. La autenticación de claves ha sido configurada y probada.
  2. Tienes un método de acceso de respaldo (acceso a la consola, otro usuario, etc.)
  3. El firewall se ha actualizado con las reglas de puerto correspondientes.
  4. La lista blanca de fail2ban incluye sus IP de uso común
  5. Has probado la conexión desde un terminal nuevo antes de cerrar el antiguo
  6. La sintaxis de configuración de SSH ha sido validada con sshd -t.