Juanjo Coello

Software Developer & Perpetual Wannabe
I tweet stuff at @jjcoellov

Tip de Supervivencia: Autenticación Automática en SSH

En una continua búsqueda de hacer las rutinas diarias delante del pc lo más cortas posible, he seguido estos pasos para autentificarme automáticamente en servidores remotos. En mi caso, necesito conectarme diariamente a mi cuenta en la Facultad mediante el protocolo seguro SSH. Básicamente, la cosa sería algo así como:

ssh usuario@hostremoto
RSA key fingerprint is d6:i0:ah:e1:8a:65:c3:3c:d2:35:ed:66:58:75:8e:8g.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'hostremoto,IP' (RSA) to the list of known hosts.
usuario@hostremoto's password:
prompt-usuario>

Primero pedimos el acceso a un servidor remoto vía ssh. Éste nos devuelve un secuencia de bytes que sirve como comprobación de la clave pública del RSA (conocida como key fingerprint), nos advierte que el host remoto será añadido como servidor conocido (se concatenará una línea en el archivo .ssh/known_hosts con el servidor, el protocolo de encriptación y la clave privada de acceso al mismo), y nos pide la clave de acceso. Puede que realizar esta acción no sea demasiado difícil ni larga...si se hace una única vez. Pero muchas veces es necesario autenticarse varias veces (inluso en la misma facultad se cuenta con varios servidores con servicios asociados distintos, y es necesario saltar de uno a otro, vía ssh, realizando el proceso de nuevo), y la tarea, de tan repetitiva, termina siendo tediosa. Peor aún, si se mantiene un repositorio tipo SVN en un servidor remoto, y es necesario el acceso vía SSH al mismo, cada commit/update de los cambios necesita realizar el proceso de autenticación de nuevo. Así que es necesario encontrar una solución que lo automatice. Y es aquí donde entra en juego algunos comandos muchas veces desconocidos para el común de los mortales, que nos simplifican la tarea. La cosa sería más o menos así:

SSH incluye la posilibidad de autenticar usuarios mediante el uso de claves públicas (es necesario conocer un poco de la encriptación por clave pública para entender ésto). En lugar de autenticar al usuario con la clave, el servidor SSH en la máquina remota verifica un mensaje firmado con la clave privada del usuario con la copia de la clave pública. El primer paso sería conseguir, por tanto, una clave pública. Para ello se puede utilizar el comando ssh-gen:

$ ssh-keygen -t rsa -N '

La opción -t selecciona el tipo de clave que se desea generar (en este caso, rsa). Los otros tipos son rsa1, y dsa. La opción -N indica la opción de una passphrase (frase clave). En principio, nosotros indicaremos mediante el doble comillado simple '' que no deseamos utilizar una passphrase. Por defecto, la identificación será guardada en un fichero en /home/usuario/.ssh/id_rsa. La clave pública se almacenará en /home/usuario/.ssh/id_rsa.pub.

Una vez que se ha generado el par de claves, es necesario copiar la clave pública en la máquina remota. Para esto, es necesario concatenarla al archivo .ssh/authorized_keys en el host remoto:

$ ssh-copy-id -i ~/.ssh/id_rsa.pub usuario@hostremoto

También puede hacerse como alternativa:

$ ssh remote.machine "umask 077; cat >> .ssh/authorized_keys" < /home/user/.ssh/id_rsa.pub

El comando "umask" es necesario, ya que el servidor se negará a leer el archivo /home/user/.ssh/authorized_keys si ha perdido permisos.

Ahora se puede editar el arhivo /home/.ssh/config y añadir un par de líneas:

Host aliasHostremoto
Hostname hostremoto
user usuario_en_host_remoto 

La linea Host permite utilizar un alias para el nombre del servidor (para hacerlo incluso más corto). La línea Hostname es el nombre completo del servidor, y la línea user, es obviamente, el login. Como ejemplo:

Host etsii
Hostname hostremoto.etsii.ull.es
user mi_usuario

Por tanto, para conectarme a mi cuenta de la facultad únicamente necesito hacer:

$ ssh etsii
Last login: Wed Apr 23 13:34:00 2008 from mi.maquina

Y ya está. Es recomendable echarle un vistazo a todos los comandos utilizados, y conocer las opciones no comentadas que puedan ser útiles en otras situaciones similares.

Fuentes:
SSH Authentication.
SSH Bouncing - How to get through firewalls easily. (para hacer cosas más sofisticadas).