Automatización Linux, scripting Bash y herramientas para sysadmins

~/.ssh/config: el archivo que todo sysadmin debería estar usando

#linux#ssh#networking#security

El problema

Hasta hace unos años mis conexiones SSH eran así:

ssh -i ~/.ssh/clave_servidor_produccion.pem -p 2222 admin@10.20.30.40

20 servidores = 20 comandos distintos. Me los guardaba en un .txt y copiaba/pegaba como un animal.

Un día un colega vio mi pantalla y me dijo “¿por qué no usas ~/.ssh/config?”. No supe qué responder.

Lo básico: alias

Host prod
    HostName 10.20.30.40
    Port 2222
    User admin
    IdentityFile ~/.ssh/clave_produccion.pem

Ahora:

ssh prod

Eso es todo. El tab-complete de tu shell te lo sugiere. ssh pr<TAB>ssh prod.

Puedes tener docenas de entradas. Cada una con su puerto, usuario y clave.

Comodines

Si tienes varios servidores con la misma configuración base:

Host *.internal
    User admin
    IdentityFile ~/.ssh/id_ed25519
    ForwardAgent yes

Host db.internal
    HostName 192.168.1.10

Host web.internal
    HostName 192.168.1.11

ssh db.internal y ssh web.internal heredan usuario, clave y ForwardAgent.

Túneles que no se olvidan

En vez de escribir esto cada vez:

ssh -L 5432:localhost:5432 -L 8080:localhost:8080 prod

Lo metés en la config y te olvidás:

Host prod-tunnel
    HostName prod.example.com
    User admin
    LocalForward 5432 localhost:5432
    LocalForward 8080 localhost:8080

ssh prod-tunnel y ya tienes los dos túneles levantados. Si desconectas, se cierran solos. No hay screen ni tmux que valgan.

También hay túneles inversos (RemoteForward) pero los uso menos. El día que los necesites, mismo mecanismo.

ProxyJump: el salto que no duele

Antes, para llegar a un servidor interno tenía que hacer:

ssh -J bastion.prod.com admin@10.0.0.5

En la config:

Host bastion
    HostName bastion.prod.com
    User admin

Host interno-1
    HostName 10.0.0.5
    User admin
    ProxyJump bastion

ssh interno-1 hace el salto por bastion automáticamente. Y si tienes varios servidores detrás del mismo bastion, solo pones ProxyJump bastion en cada uno.

Multiplexión: no volver a autenticar

Si entras y sales de un servidor seguido (ansible, deploys, scripts), la autenticación SSH puede ser lenta. Con multiplexión, la primera conexión autentica y las siguientes reúsan el canal:

Host *
    ControlMaster auto
    ControlPath ~/.ssh/controlmasters/%r@%h:%p
    ControlPersist 10m

Creá el directorio:

mkdir -p ~/.ssh/controlmasters

Ahora: primera conexión autentica normal, segunda es instantánea. El canal se mantiene 10 minutos después de cerrar la última sesión.

KeepAlive para que no se caiga

Si tu firewall corporativo mata conexiones inactivas:

Host *
    ServerAliveInterval 60
    ServerAliveCountMax 3

Manda un paquete cada 60 segundos. Si no responde después de 3 intentos, se desconecta. Tus sesiones largas no se mueren solas.

Include: separar en archivos

Cuando la config crece, puedes partirla:

Include ~/.ssh/config.d/*.conf

Y creás:

~/.ssh/config.d/personal.conf
~/.ssh/config.d/trabajo.conf
~/.ssh/config.d/clientes.conf

Cada archivo con sus hosts. Se cargan en orden alfabético. Si hay conflicto, gana el último.

Ejemplo completo que uso

Host *
    ServerAliveInterval 60
    AddKeysToAgent yes
    UseKeychain yes

Host bastion-prod
    HostName 203.0.113.10
    User admin

Host *.prod
    ProxyJump bastion-prod
    User admin
    IdentityFile ~/.ssh/prod_ed25519

Host db.prod
    HostName 10.0.1.5
    LocalForward 5432 localhost:5432

Host web.prod
    HostName 10.0.1.10

Host gh-personal
    HostName github.com
    User git
    IdentityFile ~/.ssh/personal_ed25519

Si estás copiando y pegando comandos SSH de un .txt, dedícale 15 minutos a armar tu ~/.ssh/config. La primera vez que escribas ssh prod y funcione, no vuelves.