Acceso remoto por SSH sin contraseñas

En esta ocasión me ha surgido la necesidad de tener que acceder a un servidor para almacenar en él los archivos de la copia de seguridad de otro servidor. Ya sabéis: si tenéis un equipo, hacéis copia de seguridad y la guardáis en ese mismo servidor, cuando falle, perderéis el servidor y las copias… Lo mejor es hacer las copias y enviarlas a otra parte. Para ello usaré rsync, que permite el envío de ficheros de forma segura usando un túnel SSH.

El motivo de esta entrada es que quiero automatizar al máximo el proceso, y que no se me pida la contraseña del servidor que hará de almacén de las copias cada vez que se ejecute el script de backup. De esta forma podemos programar la tarea de backup con cron, y que se haga siempre sin ninguna supervisión ni interacción.

La receta es muy fácil: básicamente lo que haremos es usar generar un clave pública en el servidor que enviará la copia, una clave privada para cifrar la comunicación, y le diremos al servidor destino, que cuando se use ese par de claves, se mapee el acceso a un usuario concreto (típicamente un usuario muy limitado, con accesos muy restringidos, y que solo pueda guardar archivos en la carpeta de backups). Vamos a ello.

Lo primero es generar el par de claves en el servidor origen de los archivos. Para ello usamos el comando ssh-keygen:

root@jdomo:~# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:I2je3wAMBIQZ8AIBZjuvMx8SlYhOXi4xfmccXERSQxU root@jdomo
The key's randomart image is:
+---[RSA 2048]----+
|&O .=B.E.        |
|O.o . . o .      |
|+=.* o           |
|*.*.+.. .        |
|.=.+.o.+S        |
| oo.o o. .       |
| =o.o            |
|  =o..           |
|   ..            |
+----[SHA256]-----+

Le decimos que por defecto genere los archivos en la ruta por defecto, en /root/.ssh/id_rsa (clave privada) y en /root/.ssh/id_rsa.pub (clave pública). Es importante que no le pongamos passphrase porque si lo hacemos, cada vez que se intente acceder al servidor destino, nos preguntará la passphrase, y no podremos crear tareas totalmente automatizadas en cron, que usen este par de claves.

Ahora nos queda enviar la clave pública al otro servidor, e indicarle a qué usuario del servidor de destino se asociará. Lo hacemos con el siguiente comando:

root@jdomo:~# ssh-copy-id jdomo@192.168.3.35
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
jdomo@192.168.3.35's password:

Number of key(s) added: 1

Now try logging into the machine, with: "ssh 'jdomo@192.168.3.35'"
and check to make sure that only the key(s) you wanted were added.

Pues ya lo tenemos. No hay más. Podéis probar que al ejecutar el siguiente comando se accede directamente al servidor de destino sin solicitar ninguna contraseña

root@jdomo:~# ssh 'root@192.168.3.35'

Ahora es cuando viene la parte realmente interesante. ¿Cómo hacemos para copiar los archivos de uno a otro servidor usando el túnel SSH?. Pues facilísimo, usando rsync de la siguiente forma en el servidor origen de los archivos:

root@jdomo:~# rsync -avz /root/local_backup jdomo@192.168.3.35:/mnt/Data/backups
sending incremental file list
local_backup/
local_backup/backup.sql.xz
local_backup/domoticz.tar.xz
local_backup/etc.tar.xz
local_backup/instalacion_cacti.tar.xz
local_backup/mysql_cacti.tar.xz
local_backup/mysql_mysql.tar.xz
local_backup/openhab.tar.xz
local_backup/rrd_cacti.tar.xz

sent 359,721,579 bytes  received 172 bytes  4,257,062.14 bytes/sec
total size is 359,528,196  speedup is 1.00

Con ese comando copiamos los archivos de /root/local_backup del servidor jdomo a la carpeta /mnt/Data/backups del servidor 192.168.3.35 en la que el usuario jdomo tiene permisos de escritura.

Ahora solo nos queda programar nuestra tarea en el crontab, se ejecutará sin problemas cada vez y se transferirán los datos de forma segura a través de Internet. Este mismo sistema sirve para ejecutar cualquier tipo de comandos de forma remota y sin contraseñas, no solo para copiar archivos 🙂

 

Espero que os haya gustado.

Añadir un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.