He estado últimamente sacando brillo a mis ficheros de configuración
de SSH para acceder a servidores y he descubierto algunos trucos que
seguramente os venga bien saber. Hablo del fichero .ssh/config, ¿No lo conocías?
El fichero .ssh/config es un fichero de configuración en el que normalmente
agregamos accesos al estilo:
Host dev-local
Hostname 192.168.0.101
User dev
IdentityFile ~/.ssh/dev_id_rsa
Si quieres saber cómo utilizar túneles o gestionar las claves SSH te recomiendo este otro artículo que escribí hace ya algún tiempo.
La configuración SSH tiene esa forma básica, nos permite definir un nombre para utilizar (p.ej. dev-local), nos permite proporcionar una configuración básica (p.ej. Hostname o User) y se aplica cuando ejecutamos el comando ssh (p.ej. ssh dev-local).
Pero hay algunos trucos agregados que viene bien conocer.
Una de las políticas de seguridad de muchas empresas es no tener servidores con acceso directo desde Internet. Para poder acceder a estos servidores, en el mejor de los casos necesitaremos una VPN (Virtual Private Network) y en el peor de los casos un servidor de salto.
El servidor de salto tiene acceso desde Internet y está en la red privada y por lo tanto puede acceder a servidores de esta red.
Por poner un ejemplo. Imagina que tenemos bombadil.bosqueviejo.net que es accesible desde Internet. Este servidor tiene una red privada y conexión con un servidor de base de datos llamado tumulos.bosqueviejo.net. Si quieres acceder a los túmulos tienes que hacerlo a través de bombadil.
En nuestra configuración de cliente de SSH, en nuestro computador tenemos:
Host bombadil
Hostname bombadil.bosqueviejo.net
User frodo
IdentityFile ~/.ssh/bosqueviejo_id_rsa
Ahora queremos crear una configuración para acceder a los túmulos. Esto lo debemos hacer a través de bombadil y un salto. En versiones anteriores necesitábamos del uso de netcat para escribir algo así:
Host tumulos
Hostname 192.168.0.110
User frodo
IdentityFile ~/.ssh/bosqueviejo_id_rsa
ProxyCommand ssh bombadil nc %h %p
Es decir, le decíamos al sistema que para poder acceder a una conexión con los túmulos debíamos ejecutar en bombadil el comando nc %h %p que intercambiando %h por el Hostname y %p por el puerto (por defecto 22), nos da una conexión al puerto SSH del servidor de los túmulos desde el servidor de bombadil.
No obstante, a partir de la versión 7.3 de OpenSSH, han decidido facilitarnos aún más la vida. En lugar de ProxyCommand podemos usar ProxyJump siendo su sintaxis mucho más fácil:
Host tumulos
Hostname 192.168.0.110
User frodo
IdentityFile ~/.ssh/bosqueviejo_id_rsa
ProxyJump bombadil
Este nuevo comando nos da dos ventajas. La primera es no tener que recordar el commando con nc anterior y la segunda, obviamente, no necesitar de nc instalado en el servidor de salto.
Pero aún hay más.
Otra de las grandes mejoras agregadas son las plantillas. Es decir, imagina que tienes más servidores:
quebradas - 192.168.0.109 hombre-sauce - 192.168.0.55 sendero - 192.168.0.40 brandivino - 192.168.0.22
¿Tenemos que repetir el mismo bloque con cada servidor? Pues no. Tenemos plantillas. ¡Aunque ten mucho cuidado! Configuraciones como ProxyJump es mejor NO ponerlas dentro de las plantillas. Pueden producir bucles difíciles de parar.
Vale, vamos al grano. Hemos visto la configuración de los túmulos así que vamos a configurar el resto. Para simplificar, como a todos estos servidores accedemos siendo frodo y con la clave creada para esta empresa:
Host *
User frodo
IdentityFile ~/.ssh/bosqueviejo_id_rsa
Host tumulos
Hostname 192.168.0.110
ProxyJump bombadil
Host quebradas
Hostname 192.168.0.109
ProxyJump bombadil
Host hombre-sauce
Hostname 192.168.0.55
ProxyJump bombadil
Host sendero
Hostname 192.168.0.40
ProxyJump bombadil
Host brandivino
Hostname 192.168.0.22
ProxyJump bombadil
Esto está muy bien y quizás lo podemos dejar así. No obstante, ¿y si queremos olvidarnos de ProxyJump? Hemos dicho que NO podemos ponerlo en Host *, en serio, no lo intentes en casa.
Pero tenemos otra opción:
Host tumulos quebradas hombre-sauce sendero brandivino
ProxyJump bombadil
Host tumulos
Hostname 192.168.0.110
Host quebradas
Hostname 192.168.0.109
Host hombre-sauce
Hostname 192.168.0.55
Host sendero
Hostname 192.168.0.40
Host brandivino
Hostname 192.168.0.22
De esta forma, en la línea inicial especificamos la configuración para los Host indicados ahí y en el resto solo los datos específicos. Hacerlo así tiene sus pros y sus contras por lo que ya es decisión personal decidir por cuál preferimos inclinarnos.
Pero eso no es todo, aquí falta organización.
Si eres usuario de Debian u otras distribuciones que tienden a crear pequeños ficheros dentro de directorios con el sufijo .d te sonará lo que te voy a contar.
Esta es una forma de agrupar configuraciones, por ejemplo, si tienes servicios en casa, servicios en el trabajo y servicios de una asociación, puedes tener:
.ssh/config.d/home.config .ssh/config.d/work.config .ssh/config.d/assoc.config
Todo bien organizado, solo hay que incluir dentro de .ssh/config esta línea:
Include ~/.ssh/config.d/*.config
Creamos el directorio, los ficheros de configuración y ya tenemos todo bien organizado. Esto puede ser ideal si se comparten los ficheros de configuración del trabajo. Pueden estar en un único fichero work.config sin peligro de compartir información sensible.
Bueno, otro trozo de información sobre OpenSSH, espero que al igual que cuando escribí el artículo sobre túneles, este sea igualmente interesante y útil.
Recapitulando, en este artículo hemos visto la configuración de SSH, pero no a nivel básico, sino conceptos muy específicos como son los saltos, las plantillas y la inclusión de pequeños ficheros.
En un siguiente artículo comentaré cómo hacer magia con el fichero .ssh/authorized_keys. Si no lo hago, ¡recuérdamelo!