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"
Banner de aviso legal
# 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