Servidor SSH: sshd_config, AllowUsers, PermitRootLogin, autenticación por clave

Introducción

El demonio sshd gestiona las conexiones entrantes SSH. Su fichero de configuración /etc/ssh/sshd_config controla qué usuarios pueden conectarse, qué métodos de autenticación se aceptan y qué opciones de seguridad aplican. Una configuración correcta reduce drásticamente la superficie de ataque del servidor.

/etc/ssh/sshd_config — Directivas principales


# Puerto de escucha (cambiar el 22 reduce el ruido de bots)
Port 22

# Interfaz en la que escucha (por defecto todas)
ListenAddress 0.0.0.0
ListenAddress ::

# Versión del protocolo (solo SSHv2 está permitido hoy)
# Protocol 2    # ya no es necesario en versiones modernas

# ── Autenticación ─────────────────────────────────────
# Deshabilitar login de root (recomendado)
PermitRootLogin no
# Alternativa: solo root con clave, sin contraseña
# PermitRootLogin prohibit-password

# Deshabilitar autenticación por contraseña (solo claves)
PasswordAuthentication no
PermitEmptyPasswords no

# Habilitar autenticación por clave pública
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys

# Tiempo máximo para autenticarse antes de cortar la conexión
LoginGraceTime 30

# Intentos de autenticación por conexión
MaxAuthTries 3

# ── Control de acceso ─────────────────────────────────
# Solo estos usuarios pueden conectarse (separados por espacio)
AllowUsers deploy monitoring

# Solo usuarios de estos grupos
AllowGroups sshusers admins

# Denegar usuarios específicos
DenyUsers testuser tempuser

# ── Sesiones ──────────────────────────────────────────
# Sesiones simultáneas por conexión
MaxSessions 5

# Keepalive: enviar paquete cada N segundos
ClientAliveInterval 300
ClientAliveCountMax 2

# ── Opciones adicionales ───────────────────────────────
X11Forwarding no
AllowTcpForwarding no
Banner /etc/issue.net      # mostrar aviso legal antes del login
PrintLastLog yes
          

Nota: las directivas AllowUsers y AllowGroups son restrictivas: si se define alguna, solo los usuarios/grupos listados pueden conectarse, el resto queda bloqueado aunque tenga clave instalada.

Configurar autenticación solo por clave

Proceso completo para deshabilitar contraseñas y forzar el uso de claves:


# 1. En el CLIENTE: generar la clave si no existe
ssh-keygen -t ed25519 -C "$(whoami)@$(hostname)"

# 2. Copiar la clave pública al servidor (aún con contraseña)
ssh-copy-id usuario@servidor

# 3. Verificar que la autenticación por clave funciona
ssh usuario@servidor   # no debe pedir contraseña

# 4. En el SERVIDOR: editar sshd_config
# PasswordAuthentication no
# PubkeyAuthentication yes

# 5. Verificar la sintaxis antes de reiniciar
sshd -t

# 6. Recargar la configuración (sin cerrar sesiones activas)
systemctl reload ssh      # Debian/Ubuntu
systemctl reload sshd     # Red Hat/CentOS

# ¡IMPORTANTE! Mantener la sesión abierta y probar desde otra terminal
# antes de cerrar la sesión actual
          

authorized_keys — Gestión de claves autorizadas


# Cada línea de ~/.ssh/authorized_keys es una clave pública autorizada
# Formato: tipo clave comentario
# Ejemplo:
# ssh-ed25519 AAAA... usuario@equipo-trabajo
# ssh-rsa AAAA... usuario@equipo-viejo

# Opciones por clave (al principio de la línea):
# Restringir a un comando específico
command="/usr/local/bin/backup.sh" ssh-ed25519 AAAA...

# Restringir por IP de origen
from="192.168.1.0/24" ssh-ed25519 AAAA...

# Sin reenvío de puertos ni X11
no-port-forwarding,no-X11-forwarding ssh-ed25519 AAAA...

# Combinar restricciones
from="10.0.0.5",command="/usr/bin/rsync --server",no-pty ssh-ed25519 AAAA...

# Ver qué claves están autorizadas para un usuario
cat /home/usuario/.ssh/authorized_keys

# Revocar acceso: eliminar la línea correspondiente
# o mover el fichero fuera del lugar esperado
          

Permisos de ficheros SSH

SSH es muy estricto con los permisos. Si son incorrectos, ignora las claves silenciosamente.


# Permisos correctos en el servidor
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chmod 644 ~/.ssh/*.pub          # claves públicas (opcional)

# Permisos correctos en el cliente
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519     # clave privada
chmod 644 ~/.ssh/id_ed25519.pub # clave pública
chmod 600 ~/.ssh/config

# El directorio home tampoco puede ser escribible por otros
chmod 755 ~

# Diagnosticar problemas de permisos (activar verbose en sshd)
# En /etc/ssh/sshd_config:
# LogLevel DEBUG3
# Luego: journalctl -u ssh -f
          

Gestión del servicio sshd


# Verificar sintaxis de sshd_config (SIEMPRE antes de reiniciar)
sshd -t
sshd -T   # mostrar configuración efectiva completa

# Recargar configuración sin cerrar conexiones activas
systemctl reload ssh       # Debian/Ubuntu
systemctl reload sshd      # Red Hat/CentOS/Fedora

# Reiniciar el servicio (cierra conexiones activas)
systemctl restart ssh

# Ver estado
systemctl status ssh

# Habilitar inicio automático
systemctl enable ssh

# Ver logs en tiempo real
journalctl -u ssh -f
journalctl -u ssh --since "1 hour ago"
          

# Crear el fichero de banner
cat > /etc/issue.net <<'EOF'
*******************************************************************
*  ACCESO RESTRINGIDO — SOLO PERSONAL AUTORIZADO                  *
*  Las conexiones son monitorizadas y registradas.                *
*  El acceso no autorizado será perseguido legalmente.            *
*******************************************************************
EOF

# Activar en sshd_config
# Banner /etc/issue.net

# Recargar
systemctl reload ssh
          

Regla de oro: antes de aplicar cambios en sshd_config, siempre ejecutar sshd -t y probar desde una segunda terminal. Un error puede dejar el servidor inaccesible remotamente.

Firewalls: iptables, nftables, ufw, firewalld

Índice de la sección

Índice del curso