Utilizando rsync como un servicio
In English
Si la computadora con la que nos queremos conectar no tiene el servicio de SSH (o RSH) corriendo, podemos configurar y utilizar rsync
como un servicio en esa computadora. Esto haría que rsync escuche el puerto 873 por conexiones entrantes de otras computadoras utilizando rsync
. Mientras que esto no es recomendable para la transferencia de archivos a través de redes inseguras, como lo es el Internet, debido a que la transferencia de datos no es cifrada, podemos utilizar esto para mantener información sincronizada entre diferentes computadoras en redes internas, así como realizar respaldos.
Hay dos diferentes maneras de tener rsync
funcionando como servicio, una es lanzar el programa con el parámetro --daemon
, y la otra es tener a inetd
o a xinetd
lanzando el programa y tenerlo corriendo como uno de los servicios que inetd
o xinetd
. Pero primero, debemos configurar el archivo /etc/rsyncd.conf
y crear un archivo llamado rsyncd.secretos
con los diferentes nombres de usuario a los que les será permitido conectarse al servicio de rsync
.
Como ejemplo voy a hacer disponible una carpeta llamada Documentos dentro de mi carpeta personal (/home/juan
) y mostrar como utilizar un comando para sincronizar desde una computadora diferente. Todos los usos que fueron cubiertos en la publicación Sincronizando carpetas con rsync pueden ser usados con rsync
como servicio, lo único que cambia es la forma de direccionar ya sea la carpeta de origen o la carpeta de destino, la que sea que reside remotamente.
Temas
Configurando rsyncd.conf
Creando el archivo secretos
Lanzando rsync con el parámetro --daemon
Usando inetd para manejar el servicio de rsync
Utilizando xinetd para manejar el servicio de rsync
Conectándose al servicio de rsync
Configurando rsyncd.conf
Este archivo debe estar localizado en el directorio /etc
, si no existe, necesitamos crearlo ahí. Abrimos el archivo en nuestro editor de texto preferido, voy a utilizar gedit para el ejemplo pero podemos utilizar cualquier editor como kato, nano, Vim, etc.
sudo gedit /etc/rsyncd.conf
En este archivo agregamos las siguientes lineas:
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
[documentos]
path = /home/juan/Documentos
comment = La carpeta documentos de Juan
uid = juan
gid = juan
read only = no
list = yes
auth users = clientersync
secrets file = /etc/rsyncd.secretos
hosts allow = 192.168.1.0/255.255.255.0
Podemos dividir este archivo en dos secciones, los parámetros globales y la sección de módulos. Los parámetros globales definen el comportamiento de rsync
. Además de los tres parámetros que uso aquí y que explico a continuación, podemos configurar cosas como el puerto que rsync
estará escuchando, pero nos quedaremos con el default de 873.
lock file
es el archivo quersync
utiliza para manejar el número máximo de conexioneslog file
es dondersync
guarda un registro sobre su actividad; cuando comenzó a escuchar, cuando y de donde se conectan otras computadoras, y cualquier error que encuentre.pid file
es donde el servicio dersync
escribirá la ID del proceso que le fue asignada, esto es útil por que podemos utilizar esta id del proceso para detener el servicio.
Después de los parámetros globales, tenemos la sección de módulos, cada módulo es una carpeta que compartimos con rsync
, las partes importantes aquí son:
[nombre]
es el nombre que le asignamos al módulo. Cada módulo exporta un árbol de directorios. El nombre del módulo no puede contener diagonales o un corchete de cierre.path
es la ruta a la carpeta que estamos haciendo disponible conrsync
comment
es un comentario que aparece junto al nombre del módulo cuando un cliente obtiene la lista de todos los módulos disponibles.uid
Cuando el servicio dersync
es ejecutado como root, podemos especificar que usuario es dueño de los archivos que son transferidos.gid
Esto nos permite definir el grupo que será dueño de los archivos que sean transferidos cuando el servicio es ejecutado como root.read only
determina si los clientes que se conectan arsync
pueden subir archivos o no, el valor por default de este parámetro es true (verdadero) para todos los módulos.list
le permite que el módulo sea listado cuando los clientes piden una lista de módulos disponibles, poniendo esto en false (falso) esconde el módulo del listado.auth users
es una lista de los usuarios que tienen permitido acceder al contenido de este módulo, los usuarios son separados por comas. Los usuarios no necesitan existir en el sistema, son definidos por el archivo secretos.secrets file
define el archivo que contiene los nombres de usuario y las contraseñas de los usuarios válidos dersync
hosts allow
son las direcciones que tienen permitido conectarse al sistema. Sin este parámetro cualquier computadora tiene permitido conectarse.
Creando el archivo secretos
Una vez que rsyncd.conf
está apropiadamente configurado, necesitamos crear el archivo secretos
. Este archivo contiene todos los nombres de usuario y las contraseñas que podrán conectarse al servicio de rsync
, estos nombres de usuario y contraseñas son independientes de los usuarios que existen en el sistema, así que podemos crear usuarios que ya existen en el sistema sin problemas. Ya que especificamos el archivo /etc/rsyncd.secretos
en rsyncd.conf
, crearemos y editaremos este archivo en nuestro editor de texto preferido:
sudo gedit /etc/rsyncd.secretos
En este archivo agregamos los nombres de usuario y las contraseñas, uno por linea, separados por dos puntos (No utilizo contraseñas tan simples, y tu tampoco deberías):
clientersync:passWord
juan:PassWord
respaldo:Password
usuario:password
Finalmente, cambiamos los permisos de este archivo para que no pueda ser leído o modificado por otros usuarios, rsync
fallará si los permisos de este archivo no están apropiadamente configurados:
sudo chmod 600 /etc/rsyncd.secretos
Lanzando rsync con el parámetro --daemon
Una vez que todo esta configurado, una de las maneras de usar rsync
como servicio es lanzarlo con el parámetro --daemon. Si seguiste las instrucciones previas simplemente puedes utilizar este comando:
sudo rsync --daemon
Podemos ver si está funcionando revisando el archivo de registro que definimos en rsyncd.conf
, en nuestro ejemplo este está localizado en /var/log/rsyncd.log.
Adicionalmente, si el servicio está funcionando, el archivo /var/run/rsyncd.pid
tendrá su identificador de proceso.
Si lanzamos rsync
así, podemos detenerlo terminando su proceso, podemos obtener la ID del proceso leyendo los contenidos del archivo /var/run/rsyncd.pid
y entonces invocando kill
con esta ID del proceso, o podemos pasárselo directamente a kill
utilizando:
sudo kill `cat /var/run/rsyncd.pid`
Usando inetd para manejar el servicio de rsync
inetd
, InterNET Daemon, generalmente corre todos los servicios asociados con Internet, como FTP, telnet, y correo electrónico. Mientras que inetd
sigue siendo utilizado, debido a preocupaciones de seguridad está siendo reemplazado por otros servicios, uno muy popular es xinetd
(eXtended InterNET Daemon). Ya que rsync
trabaja utilizando una conexión de Internet, podemos agregarlo a inetd
o xinetd
y permitirles manejarlo.
Para habilitar rsync
en inetd
, necesitamos abrir el archivo /etc/inetd.conf
en nuestro editor de texto favorito y agregar la siguiente linea al mismo, asumiendo que rsync
esté en /usr/bin
como debe estar en las distribuciones de Linux:
sudo gedit /etc/inetd.conf
Entonces agrega la siguiente linea:
rsync stream tcp nowait root /usr/bin/rsync rsync --daemon
Cuando utilizamos inetd
debemos asegurarnos de que el puerto 873 está apropiadamente mapeado a rsync
en el archivo /etc/services
, por default debe de estar, podemos revisar utilizando:
cat /etc/services | grep rsync
Debe de mostrarnos esto:
rsync 873/tcp
Si no ves esto, entonces abre el archivo /etc/services
en un editor de texto y agrega esa linea.
Finalmente, reinicia el servicio de inetd
:
killall -1 inetd
Utilizando xinetd para manejar el servicio de rsync
xinetd
, eXtended InterNET Daemon, es un reemplazo ampliamente utilizado para inetd
, ya que inetd
no ofrece suficientes mecanismos de seguridad. El manejo de servicios es diferente de inetd
. xinetd
probablemente ya tiene una entrada para rsync
que solo necesita ser activado, la configuración de rsync
reside en el archivo /etc/xinetd.d/rsync
, abre este archivo en tu editor de texto:
sudo gedit /etc/xinetd.d/rsync
y cambia la linea disable = yes
a disable = no
.
Si el archivo no existe todavía, puedes crearlo y editarlo:
sudo gedit /etc/xinetd.d/rsync
Y agrega las siguientes lineas a el:
service rsync
{
disable = no
socket_type = stream
port = 873
protocol = tcp
wait = no
user = root
server = /usr/bin/rsync
server_args = --daemon
log_on_failure += USERID
}
A diferencia de inetd
, xinetd
no necesita tener una entrada en /etc/services
, puede manejar el puerto y el protocolo por si mismo. Si rsync
está definido en /etc/services
, las lineas puerto y protocolo pueden ser omitidas.
Y reinicia el servicio de xinetd:
killall -1 xinetd
Conectándose al servicio de rsync
Para conectarse a rsync
cuando está corriendo como servicio, en vez de utilizar dos puntos como cuando estamos utilizando SSH, necesitamos usar un doble dos puntos, seguidos por el nombre del módulo, y el archivo o directorio que queremos copiar o sincronizar, podemos usar:
rsync -rtv usuario@direccion_servidor::modulo/origen/ destino/
Otra manera de acceder al archivo sería utilizando rsync://
seguido por la dirección del servidor, el módulo, y finalmente la localización de la carpeta que queremos acceder:
rsync -rtv rsync://usuario@direccion_servidor/modulo/origen/ destino/
Por ejemplo, tomando en consideración los parámetros dados en el ejemplo de el archivo rsyncd.conf
que publiqué, una manera de transferir una carpeta llamada "origen" dentro de la carpeta /home/juan/Documentos
sería usando cualquiera de estos dos parámetros, asumiendo que el servidor está localizado en 192.168.1.100
rsync -rtv juan@192.168.1.100::documentos/origen/ destino/
rsync -rtv rsync://juan@192.168.1.100/documentos/origen/ destino/
Solo recuerda que el usuario que aparece ahí es uno de los usuarios que definimos en /etc/rsyncd.secretos
y no un usuario de la computadora servidor.