~/docs /DevOps/SSH Key AUTH

DevOps

SSH Key AUTH

Imported from Notion: SSH Key AUTH

updated:: 2026.07.10

Qué resuelve

Autenticación SSH por clave pública: generar clave local, instalar la pública en el servidor, probar acceso y endurecer el daemon sin bloquearte fuera.

[!NOTE] ⚠️ No desactives acceso por contraseña hasta confirmar que puedes entrar por clave en una segunda terminal.


Flujo correcto

  1. LOCAL: generar clave.

  2. LOCAL: copiar clave pública al servidor.

  3. TEST: entrar por clave.

  4. REMOTO: validar y endurecer sshd_config.

  5. TEST FINAL: comprobar que contraseña ya no entra.


1. Generar clave Ed25519

ssh-keygen -t ed25519 -a 100 -C "amis13@funding-fee"

Recomendaciones:

  • pulsa ENTER para ruta por defecto si no necesitas otra;

  • usa passphrase si la clave está en tu equipo personal;

  • revisa antes si ya existe ~/.ssh/id_ed25519.

Archivos creados:

~/.ssh/id_ed25519
~/.ssh/id_ed25519.pub

2. Cargar clave en ssh-agent

eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519

3. Copiar clave pública al servidor

Opción recomendada

ssh-copy-id amis13@IP_DEL_SERVIDOR

Usarás la contraseña actual una última vez.

Opción manual

En LOCAL:

cat ~/.ssh/id_ed25519.pub

En REMOTO:

mkdir -p ~/.ssh
nano ~/.ssh/authorized_keys
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

[!NOTE] 💡 La clave pública debe quedar en una sola línea dentro de authorized_keys.


4. Test obligatorio

Desde LOCAL:

ssh amis13@IP_DEL_SERVIDOR

Resultado esperado:

  • entra sin pedir contraseña del usuario remoto;

  • si pusiste passphrase, puede pedir la passphrase de la clave.

[!NOTE] 🚨 Si este test falla, no sigas con el endurecimiento.


5. Endurecer sshd_config

En REMOTO:

sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
sudo nano /etc/ssh/sshd_config

Ajustes base:

PubkeyAuthentication yes
PasswordAuthentication no
KbdInteractiveAuthentication no
PermitRootLogin no

Notas:

  • KbdInteractiveAuthentication sustituye al alias antiguo ChallengeResponseAuthentication.

  • No recomiendo tocar UsePAM como ajuste genérico; en muchas distros conviene dejarlo como venga por defecto.

  • Si hay directivas duplicadas, revisa la configuración efectiva antes de reiniciar.


6. Validar antes de reiniciar SSH

sudo sshd -t

Si no devuelve nada, la sintaxis es válida.

Ver configuración efectiva:

sudo sshd -T | grep -E 'pubkeyauthentication|passwordauthentication|kbdinteractiveauthentication|permitrootlogin'

7. Reiniciar SSH sin cerrar sesión

Debian/Ubuntu suelen usar ssh:

sudo systemctl restart ssh

Otras distros pueden usar sshd:

sudo systemctl restart sshd

[!NOTE] ⚠️ Mantén abierta la sesión actual. Prueba desde otra terminal antes de cerrar.


8. Test final

Entrar normal:

ssh amis13@IP_DEL_SERVIDOR

Forzar contraseña, debe fallar:

ssh -o PreferredAuthentications=password -o PubkeyAuthentication=no amis13@IP_DEL_SERVIDOR

Resultado esperado:

Permission denied (publickey).

Bonus

Limitar intentos con UFW

sudo ufw limit ssh

Cambiar puerto

Primero abre firewall:

sudo ufw allow 2222/tcp

Luego en /etc/ssh/sshd_config:

Port 2222

Después valida:

sudo sshd -t
sudo systemctl restart ssh
ssh -p 2222 amis13@IP_DEL_SERVIDOR

Checklist final

  • Tengo backup de sshd_config.

  • Puedo entrar por clave antes de desactivar contraseña.

  • Ejecuté sudo sshd -t.

  • Reinicié SSH sin cerrar la sesión actual.

  • Probé una segunda conexión.

  • Forzar contraseña falla como esperado.


Referencias

- EOF -