WARNING: UNPROTECTED PRIVATE KEY FILE: cómo arreglar los permisos

SSH se niega a usar una clave privada que otros usuarios de tu ordenador podrían leer. Ejecuta chmod 600 ~/.ssh/id_ed25519 con la ruta de tu propia clave y vuelve a conectarte. Hasta que lo hagas, la clave se ignora, así que el acceso recurre a la contraseña o termina en Permission denied.

Actualizada el . Reproducido con OpenSSH 10.3 en macOS contra OpenSSH 10.0 en Debian 13, y con el cliente de Debian.

El mensaje

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for '/home/user/.ssh/id_ed25519' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "/home/user/.ssh/id_ed25519": bad permissions
user@server: Permission denied (publickey,password).

A pesar de la palabra "warning", esto impide que se use la clave. La comprobación ocurre en tu propio ordenador, antes de usar la clave privada para firmar nada. El servidor no te ha rechazado.

La solución

chmod 600 ~/.ssh/id_ed25519

Usa la ruta que muestra el mensaje. El modo 600 significa que solo tú puedes leer y escribir. El modo 400, solo lectura, también se acepta. Cualquier permiso para el grupo o para otros se rechaza: probamos 640, 660, 644 y 440, y los cuatro dieron este error.

Para comprobarlo sin conectarte, usa uno de estos:

ls -l ~/.ssh/id_ed25519
ssh-keygen -y -f ~/.ssh/id_ed25519

El segundo comando imprime la clave pública si los permisos están bien, y el mismo aviso si no lo están. Si la clave tiene una frase de contraseña, la pide antes.

Para ordenar toda una carpeta:

chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_*
chmod 644 ~/.ssh/*.pub

Las claves públicas pueden seguir siendo legibles, por eso la última línea las restaura.

Cómo acaba una clave con estos permisos

  • Se copió desde una memoria USB, una carpeta compartida o un archivo zip, o se descargó desde un navegador.
  • Un script o la restauración de una copia de seguridad la escribió con el modo por defecto.
  • Alguien ejecutó chmod -R 755 sobre el directorio personal.

Si no sabes por dónde ha pasado una clave copiada, es más sencillo generar una nueva clave SSH Ed25519 y sustituir la antigua en tus servidores.

Casos relacionados en tu ordenador

La clave pertenece a otro usuario

Una clave creada con sudo pertenece a root. Con el modo 600 no puedes leerla en absoluto, y el mensaje es distinto:

Load key "/home/user/.ssh/id_ed25519": Permission denied

Recupérala con sudo chown "$USER" ~/.ssh/id_ed25519.

Sin aviso, solo Permission denied

Si hay un archivo .pub junto a la clave, ssh ofrece primero la mitad pública y solo lee el archivo privado cuando el servidor la acepta. Así que con una clave equivocada nunca ves este aviso, aunque los permisos sean malos. ssh -v muestra el orden:

debug1: Offering public key: /home/user/.ssh/id_ed25519 ED25519 SHA256:...
debug1: Server accepts key: /home/user/.ssh/id_ed25519 ED25519 SHA256:...
Permissions 0644 for '/home/user/.ssh/id_ed25519' are too open.

El archivo de configuración

El mismo tipo de comprobación se aplica a la configuración de tu cliente:

Bad owner or permissions on /home/user/.ssh/config

Arréglalo con chmod 600 ~/.ssh/config.

Windows

OpenSSH en Windows usa listas de control de acceso a archivos, no chmod. Estos comandos de PowerShell vienen de la documentación de AWS, con la ruta de tu clave en $path:

icacls.exe $path /reset
icacls.exe $path /GRANT:R "$($env:USERNAME):(R)"
icacls.exe $path /inheritance:r

En WSL, una clave bajo /mnt/c puede no conservar los permisos de Linux. Cópiala a ~/.ssh dentro del sistema de archivos de Linux y ejecuta allí chmod 600.

El mismo problema en el servidor: StrictModes

El servidor tiene una comprobación parecida, pero no ves ningún aviso. El cliente solo imprime Permission denied (publickey,password). y el motivo está en el registro del servidor, que necesitas leer por otra vía, como una consola:

Authentication refused: bad ownership or modes for directory /home/user/.ssh

En Debian y Ubuntu usa sudo journalctl -u ssh, y en la mayoría de los demás sistemas journalctl -u sshd. Esto es lo que vimos con OpenSSH 10.0 de Debian 13, con StrictModes yes, el valor por defecto:

CambioResultado
Directorio personal 777Rechazado, bad ownership or modes for directory
~/.ssh con escritura para el grupo, el grupo es rootRechazado, el mismo mensaje
authorized_keys con escritura para el grupo, el grupo es rootRechazado, bad ownership or modes for file
authorized_keys propiedad de root, modo 600Rechazado, Could not open user 'user' authorized keys
authorized_keys modo 644El acceso funciona
~/.ssh modo 755El acceso funciona

La compilación de Debian también permitió la escritura para el grupo cuando el grupo era el grupo privado del propio usuario, así que no esperes lo mismo en todos los sistemas. El ajuste seguro es el mismo en todas partes. Ejecuta esto como el usuario en el servidor:

chmod go-w ~
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chown -R "$USER" ~/.ssh

Si ejecutas la última línea con sudo, escribe el nombre del usuario en lugar de $USER.

No pongas StrictModes no. Hace que el acceso funcione, como confirmamos, pero también acepta un archivo authorized_keys que otros usuarios pueden haber podido modificar. Para ver el valor actual:

sudo sshd -T | grep -i strictmodes

Si los modos son correctos y la clave sigue rechazándose, mira Permission denied (publickey).

Preguntas

¿Qué permisos debe tener una clave privada SSH?

600, para que solo tú puedas leerla y escribirla. 400, solo lectura, también sirve. Cualquier acceso para el grupo u otros hace que ssh ignore la clave.

¿Qué permisos deben tener ~/.ssh y authorized_keys?

700 para ~/.ssh y 600 para authorized_keys. Las claves públicas que terminan en .pub pueden quedarse en 644.

¿Se puede desactivar la comprobación de permisos?

En el cliente, no. En el servidor, StrictModes no se salta su comprobación, pero también acepta un authorized_keys que otros podrían haber cambiado, así que corrige los permisos.

Fuentes

Más en Mensajes de error

Todas las guías