Rsync
Rsync est un outil de synchronisation de fichiers unidirectionnel (à l'inverse de Unison) ainsi qu'un protocole à part entière (non chiffré) écoutant sur le port 873/TCP. Il comporte un grand nombre d'options et peut être tunnélisé dans SSH afin de chiffrer son flux.
INFORMATION
On entend par unidirectionnel le fait que le delta entre deux fichiers soit toujours comparé de la source à la destination et non l'inverse (ce sera toujours la destination qui se ferra écraser - pas de notion de date).Installation
Rsync est un outil développé en Python disponible dans la plupart des distributions Linux. Sous Debian, on peut l'obtenir via Apt.
apt install rsync
Syntaxe
Il est possible d'ajouter un ensemble de paramètres à l'outil afin de répondre à des besoins spécifiques. La commande suit les principes standard de syntaxe pour une commande UNIX, soit :
rsync [PARAMÈTRES] SOURCE DESTINATION
Lorsque une des opérandes source et/ou destination est distante, il faudra utiliser pour celle-ci une syntaxe de type <source lang="bash" inline>[<UTILISATEUR>@]<IP><mode><module></source> où chaque éléments correspondent à :
- UTILISATEUR : nom de l'utilisateur disant (facultatif, l'utilisateur courant sera alors utilisé)
- IP : adresse de la machine distante
- mode : détermine l'usage du protocole de transfert avec les valeurs <source lang="bash" inline>::</source> et <source lang="bash" inline>:</source> correspondants respectivement à rsync et ssh
- module : correspond au partage rsync dans le cas d'un mode <source lang="bash" inline>::</source> ou au chemin distant dans le cas de <source lang="bash" inline>:</source>
ATTENTION
{{{1}}}Utilisation
Paramètres
Maintient des permissions sources
rsync -a SOURCE DESTINATION
Maintient des permissions de destination
rsync -a -A --no-perms --no-owner --no-group SOURCE DESTINATION
Transfert via SSH
rsync -a SOURCE utilisateur@IP:DESTINATION
Sécurisation côté destination
Sur l'hôte de destination, il est possible de configurer la cible pour cet utilisateur. Nous utilisons la commande <syntaxhighlight lang="bash" inline>rrsync</syntaxhighlight> (pour restricted rsync) afin de spécifier celui-ci dans le fichier <syntaxhighlight lang="bash" inline>~/.ssh/authorized_keys</syntaxhighlight>.
command="rrsync /toto/tata/",no-agent-forwarding,no-port-forwarding,no-pty,no-user-rc,no-X11-forwarding ssh-ed25519 clé_publique
Ici, cette utilisateur aura seulement le droit d’exécuter un <syntaxhighlight lang="bash" inline>rsync</syntaxhighlight> pour synchroniser le dossier <syntaxhighlight lang="bash" inline>/toto/tata/</syntaxhighlight>.
Sur l'hôte source, le chemin précisé devient alors la nouvelle racine de l'échange. Dans l'exemple si dessous, le client utilisera le chemin de destination de la commande suivante.
<syntaxhighlight lang="bash"> rsync [OPTIONS] <SOURCE> <UTILISATEUR>@<ADRESSE>:/ </syntaxhighlight>
Transfert via relay SSH
L'usage d'un relay SSH est utile si la machine est inaccessible directement (NAT, pare-feux, clé SSH...).
rsync -a -e "ssh -J utilisateur@IPRELAI:PORT" SOURCE utilisateur@IP/:DESTINATION
Compression
rsync -z SOURCE DESTINATION
Verbosité
rsync -v --progress SOURCE DESTINATION
Statistiques
rsync --stats SOURCE DESTINATION
Usage fréquent
Voici la commande que j'utilise souvent pour transférer des fichiers dans mon réseau local via rsync/ssh.
rsync -av --progress SOURCE utilisateur@IP/:DESTINATION
Rsyncd
En dehors de son usage courant via SSH, Rsync peut être utilisé avec le protocole éponyme en mode serveur et client. Ceci est utilisé notamment lors de la synchronisation d'un dépôt Debian via ftpsync. Du fait de la transmission de donnée en clair, il n'est pas recommandé de l'utiliser pour autre chose que des données publiques qui verront, en amont, leur intégrité vérifié par un outil comme GPG.
Partie serveur
Mise en œuvre
Activer le démon Rsync
sed -i 's/RSYNC_ENABLE=false/RSYNC_ENABLE=true/' /etc/default/rsync
Configurer le démon. Dans l'exemple, j'attribue l'utilisateur ftpsync ainsi que des partages adaptés pour coller à la documentation idoine. Modifiez selon vos besoins.
vim /etc/rsyncd.conf
<source lang="bash"> uid = ftpsync gid = ftpsync use chroot = yes syslog facility = local5
[debian] path = /var/www/dépôts/debian comment = Dépôt debian read only = true
[debian-security] path = /var/www/dépôts/debian-security comment = Dépôt debian-security read only = true </source>
Note : les modules du mode rsync sont définis entre crochet et correspondent aux partages accessibles par les clients.
Démarrer le service
systemctl start rsync.service
Restriction d'accès
Il est possible de limiter l'accès par un couple identifiant/mot de passe. Gardez toutefois à l'esprit que les informations circules en clair (bien que le mot de passe soit haché). Réservez ces méthodes dans un réseau de confiance ou au travers d'un VPN (comme IPSec ou Wireguard).
vim /etc/rsyncd.secrets
<source lang="bash"> toto:quenelleépaulée titi:123456789 tata:c'estlabase </source>
Le fichier de configuration devra alors se voir agrémenté de quelques paramètres supplémentaires. Dans la section globale, la directive <source lang="bash" inline>strict modes = false</source> permet de pouvoir lire le fichier de mots passe (sinon une sécurité à la con est bogué l'empêche...) ; les paramètres <source lang="bash" inline>auth users</source> et <source lang="bash" inline>secrets file</source> des modules permettent respectivement d'indiquer les utilisateurs authorisés à se connecter au module ainsi que l'emplacement du fichier des utilisateurs.
Voici le résultat :
<source lang="bash"> uid = ftpsync gid = ftpsync use chroot = yes syslog facility = local5 strict modes = false
[debian] path = /var/www/dépôts/debian comment = Synchro du répertoire share read only = true auth users = toto,titi,tata secrets file = /etc/rsyncd.secrets
[debian-security] path = /var/www/dépôts/debian-security comment = Synchro du répertoire share read only = true auth users = toto,titi,tata secrets file = /etc/rsyncd.secrets </source>
Redémarrer le service
systemctl restart rsync.service
Partie cliente
Le client peut récupérer les fichiers du partage via la commande suivante (les paramètres sont bien sûr facultatifs) :
rsync -av --progress IP:/debian-security /tmp/
Si vous avez définit une identification, vous pouvez utiliser la syntaxe suivante :
rsync -av --progress titi@<IP>::debian-security /tmp/
Le mot de passe vous sera demandé via un prompt dédié. Une variable d'environnement est également définiçable afin de le renseigner automatiquement sans aucune forme d'intéraction (pratique pour effectuer des transferts automatisés via Cron) :
RSYNC_PASSWORD=123456789 rsync -av --progress titi@<IP>::debian-security /tmp/
Sources de la section
- https://www.man7.org/linux/man-pages/man1/rsync.1.html
- https://doc.ubuntu-fr.org/tutoriel/serveur_de_synchronisation_avec_rsync
- https://www1.zonewebmaster.eu/serveur-debian-securite/installer-rsync-serveur-synchronisation