SSH StrictModes, agent forwarding (ssh -A) y ssh -a explicados
SSH StrictModes rechaza las claves si el home, ~/.ssh o authorized_keys son escribibles por otros; se arregla con chmod. Evita ssh -A en hosts no fiables; ssh -a lo desactiva.
Respuesta corta: `StrictModes yes` (el valor predeterminado de OpenSSH) hace que sshd compruebe el propietario y los permisos de tu directorio home, de `~/.ssh` y de `~/.ssh/authorized_keys` antes de aceptar una clave, y rechaza el inicio de sesión con "Authentication refused: bad ownership or modes" si alguno es escribible por el grupo o por otros, o pertenece a otro usuario. Corrige los permisos en lugar de desactivar la comprobación. El agent forwarding con `ssh -A` permite al host remoto usar tus claves locales mientras estás conectado, así que evítalo en hosts en los que no confíes plenamente y usa `ssh -J` (ProxyJump) en su lugar; `ssh -a` en minúscula desactiva explícitamente el agent forwarding.
Esta guía complementa la guía de hardening de SSH y se aplica a Debian 12/13, Ubuntu 24.04 y sistemas de la familia RHEL como AlmaLinux 9 y Rocky 9.
Qué comprueba SSH StrictModes
StrictModes es una opción del lado del servidor en `/etc/ssh/sshd_config`. Su finalidad es sencilla: si otro usuario pudiera escribir en tu `authorized_keys`, podría añadir su propia clave e iniciar sesión como tú. Por eso sshd se niega a confiar en el archivo salvo que toda la ruta esté protegida. Comprueba el archivo y los directorios superiores, incluido el directorio home.
Confirma el valor efectivo con `sshd -T | grep -i strictmodes`. En Ubuntu 24.04 y Debian 13, revisa también los archivos drop-in de `/etc/ssh/sshd_config.d/`.
| Ruta | Exigencia de StrictModes | Modo recomendado |
|---|---|---|
| /home/alice | Propiedad de alice o de root, no escribible por grupo/otros | 755, 750 o 700 |
| /home/alice/.ssh | Propiedad de alice o de root, no escribible por grupo/otros | 700 |
| /home/alice/.ssh/authorized_keys | Propiedad de alice o de root, no escribible por grupo/otros | 600 |
| /root y /root/.ssh (inicio de sesión como root) | Propiedad de root, no escribible por grupo/otros | 700 |
Soluciona "Authentication refused: bad ownership or modes"
El cliente solo muestra un genérico `Permission denied (publickey)`. La razón real está en el log del servidor, que indica la ruta exacta, por ejemplo `Authentication refused: bad ownership or modes for directory /home/alice` o `... for file /home/alice/.ssh/authorized_keys`. Usa la consola de tu VPS u otra sesión para arreglarlo.
- 01.Lee el log: `journalctl -u ssh -n 50` en Debian y Ubuntu, o `journalctl -u sshd -n 50` en AlmaLinux y Rocky.
- 02.Corrige el propietario del directorio SSH del usuario: `chown -R alice:alice /home/alice/.ssh`.
- 03.Corrige los modos: `chmod 700 /home/alice/.ssh` y `chmod 600 /home/alice/.ssh/authorized_keys`.
- 04.Quita el permiso de escritura de grupo y otros del directorio home: `chmod go-w /home/alice`.
- 05.En sistemas con SELinux (AlmaLinux, Rocky, Fedora), restaura las etiquetas: `restorecon -Rv /home/alice/.ssh`.
- 06.Prueba desde una terminal nueva con `ssh -v alice@server` manteniendo abierta la sesión que funciona.
# all-in-one, run as root on the server
chown -R alice:alice /home/alice/.ssh
chmod go-w /home/alice
chmod 700 /home/alice/.ssh
chmod 600 /home/alice/.ssh/authorized_keys
namei -l /home/alice/.ssh/authorized_keys # shows owner and mode of every path componentNote · No pongas `StrictModes no` para que desaparezca el error. Elimina una protección real y oculta la mala configuración en lugar de corregirla.
StrictModes frente a StrictHostKeyChecking
Las búsquedas de "ssh strictmode" suelen confundir dos opciones que no tienen nada que ver. `StrictModes` está en `sshd_config` en el servidor y comprueba los permisos de los archivos. `StrictHostKeyChecking` está en `ssh_config` o `~/.ssh/config` en el cliente y controla qué ocurre cuando la clave de host de un servidor es desconocida o ha cambiado. El cliente también tiene su propia comprobación de permisos: se niega a usar una clave privada que otros usuarios puedan leer, con un aviso sobre un archivo de clave privada desprotegido; `chmod 600 ~/.ssh/id_ed25519` lo soluciona.
Agent forwarding con ssh -A: el riesgo
`ssh -A` (o `ForwardAgent yes`) crea en el host remoto un socket, referenciado por `$SSH_AUTH_SOCK`, que retransmite las peticiones de firma al ssh-agent de tu máquina. Tu clave privada nunca sale de tu máquina, pero cualquiera que pueda acceder a ese socket puede usar tu clave mientras estás conectado. En el host remoto, eso incluye a root y a cualquier proceso que se ejecute con tu usuario.
Si el servidor está comprometido, o lo administra otra persona, un atacante puede iniciar sesión sin que lo notes en cualquier otro host que abra tu clave, incluidos el hosting de Git y los servidores de producción. Por eso el cliente de OpenSSH usa por defecto `ForwardAgent no`.
- ▹Nunca reenvíes tu agente a hosts compartidos, de terceros o recién reinstalados que no hayas bastionado.
- ▹Si no tienes más remedio que reenviarlo, usa `ssh-add -c` para que cada uso de la clave requiera confirmación local.
- ▹OpenSSH 8.9 y posteriores admiten restricciones de destino con `ssh-add -h`, que limitan en qué hosts puede usarse una clave reenviada.
- ▹En el servidor, `AllowAgentForwarding no` en `sshd_config` lo desactiva, aunque los usuarios con acceso a shell todavía pueden montar sus propios reenviadores.
Usa mejor ProxyJump (ssh -J) para los bastiones
La mayor parte del agent forwarding se usa para saltar a través de un bastión a una máquina interna. `ssh -J` lo hace sin exponer tu agente: el bastión solo reenvía un flujo TCP cifrado, y la autenticación en el host interno se hace de extremo a extremo desde tu portátil. Para servidores accesibles solo por una red privada, un túnel WireGuard es otra opción; consulta la guía de VPN con WireGuard o la guía de malla WireGuard, y para los ajustes de keepalive y PSK esta guía de ajuste de WireGuard.
En un VPS de NoctisNode tienes root completo por SSH en una máquina KVM, así que un plan Wisp pequeño puede servir como jump host dedicado sin nada más ejecutándose; consulta los planes VPS.
# one-off
ssh -J [email protected] [email protected]
# ~/.ssh/config
Host bastion
HostName bastion.example.com
User alice
ForwardAgent no
Host db1
HostName 10.88.0.3
User alice
ProxyJump bastionQué hace ssh -a (en minúscula)
`ssh -a` en minúscula desactiva el agent forwarding para esa conexión, lo contrario de `-A`. Es útil cuando tu `~/.ssh/config` activa `ForwardAgent` para un host comodín y quieres asegurarte de que una conexión concreta no lo reenvía, por ejemplo `ssh -a admin@untrusted-host`. No lo confundas con `ssh-agent -a`, que define la ruta del socket del agente, ni con `ssh-add`, que carga claves en el agente.
Preguntas frecuentes
Q¿Qué hace StrictModes en sshd_config?
AHace que sshd compruebe que el directorio home del usuario, ~/.ssh y authorized_keys pertenecen al usuario o a root y no son escribibles por el grupo ni por otros. Si la comprobación falla, se rechaza la autenticación con clave.
Q¿Cómo soluciono Authentication refused: bad ownership or modes?
AEjecuta `chmod go-w ~`, `chmod 700 ~/.ssh` y `chmod 600 ~/.ssh/authorized_keys`, y asegúrate de que los archivos pertenecen al usuario. El log del servidor indica la ruta exacta que está mal.
Q¿Es seguro el agent forwarding con ssh -A?
ASolo en hosts en los que confíes plenamente. Mientras estás conectado, root o una cuenta comprometida en el host remoto pueden usar tu agente reenviado para autenticarse como tú en otros sitios; usa `ssh -J` en su lugar.
Q¿Qué diferencia hay entre ssh -A y ssh -a?
A`-A` en mayúscula activa el reenvío de tu ssh-agent al host remoto. `-a` en minúscula desactiva el agent forwarding para esa conexión y anula cualquier `ForwardAgent yes` de tu configuración.
Q¿Debería poner StrictModes no?
ANo. Desactivarlo permite iniciar sesión incluso cuando otros usuarios podrían modificar tu authorized_keys, lo que es un agujero de seguridad real; corrige el propietario y los permisos en su lugar.