Acceso SSH sin contraseña a servidores Linux

Existen numerosos escenarios en los que es necesario automatizar tareas entre dos servidores Linux, como por ejemplo cuando queremos enviar código desde un servidor de desarrollo a otro de demo a través del cuál nuestros clientes van a revisar el trabajo desarrollado hasta el momento. Para ello lo mejor es utilizar el protocolo SSH, que permite no sólo crear sesiones interactivas sino también enviar ficheros y ejecutar comandos remotamente de una forma segura frente a terceros malintencionados. Sin embargo, SSH exige algún tipo de autentificación para acceder al servidor remoto, bien mediante contraseña bien mediante certificados. Lo habitual (por sencillo) es utilizar contraseñas, lo que convertiría cada conexión en algo tedioso al tener que autentificarse cada vez. Por ello, voy a contaros cómo generar una relación de confianza entre dos máquinas Linux para que se puedan automatizar tareas a través de SSH sin el uso de contraseñas.

Lo primero que hay que hacer es que ambas máquinas cuenten con soporte SSH. Aunque sólo es necesario el servicio en la máquina remota y lo normal en las distribuciones Linux más populares es que el cliente y el servidor se encuentren en paquetes diferentes, es muy útil contar con ambos en toda máquina que caiga bajo nuestra administración, así que procederemos a instalar los dos. En Debian por ejemplo existe un metapaquete que hace eso precisamente:

# apt-get install ssh

En Linux, el servicio SSH más popular y soportado es OpenSSH, que es justo el que se acaba de instalar en ambas máquinas.

A partir de este momento, llamaremos al servidor cliente S1 y al servidor remoto S2. A continuación, accedemos a S1 como el usuario para el que queremos crear la relación de confianza (usuario1) y generamos las claves de autentificación, sin introducir una frase de paso (passphrase):

usuario1@S1:~> ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/usuario1/.ssh/id_rsa):
Created directory '/home/usuario1/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/usuario1/.ssh/id_rsa.
Your public key has been saved in /home/usuario1/.ssh/id_rsa.pub.
The key fingerprint is:
15:7d:0a:de:d8:a2:06:5f:4f:15:92:3b:14:1e:26:60 usuario1@S1

Ahora mediante ssh vamos a crear el directorio ~/.ssh como usuario2 en S2. El directorio puede ya existir, lo que no supone ningún problema:

usuario1@S1:~> ssh usuario2@S2 mkdir -p .ssh usuario2@S2's password:

Finalmente añadimos la nueva clave pública de usuario1 al fichero .ssh/authorized_keys (o .ssh/authorized_keys2 según la versión del servidor SSH) de usuario2 en S2 e introducimos la contraseña de usuario2 por última vez:

usuario1@S1:~> cat .ssh/id_rsa.pub | ssh usuario2@S2 'cat >> .ssh/authorized_keys'
usuario2@S2's password: 

Desde este momento, ya es posible acceder a S2 como usuario2 desde S1 como usuario1 sin utilizar contraseña:

usuario1@S1:~> ssh usuario2@S2
usuario2@S2:~>

Ya podemos incorporar a nuestros scripts los comandos de SSH (y otras herramientas que hagan uso de SSH, como rsync) para que las tareas que hayamos automatizado funcionen sin interrupción por el sistema de autentificación.

Sobra decir que esto NUNCA se debe hacer para el usuario root, ya que si cae una máquina en manos malintencionadas, se produce un efecto dominó con el resto de servidores con los que tenga una relación de confianza mediante SSH sin contraseña. De hecho, NUNCA se debería tener activo el acceso a root mediante SSH. Para ello, lo mejor es utilizar certificados, que es algo que veremos en un futuro artículo.

Espero que esta receta os sea de utilidad en vuestras tareas diarias de administración.