Rsync

De Wiki doc

Révision datée du 27 février 2022 à 23:30 par Nmorin (discussion | contributions) (→‎Transfert via SSH)
(diff) ← Version précédente | Voir la version actuelle (diff) | Version suivante → (diff)

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 [<UTILISATEUR>@]<IP><mode><module> 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 :: et : correspondants respectivement à rsync et ssh
  • module : correspond au partage rsync dans le cas d'un mode :: ou au chemin distant dans le cas de :

ATTENTION

Comme de nombreux outils de transferts, les répertoires ne sont pas géré de la même façon si un / a été précisé ou non. Par exemple, un transfert via Rsync du répertoire DOSSIER-SOURCE vers DOSSIER-DESTINIATION créera ce dernier avec le contenu du premier alors qu'un DOSSIER-SOURCE/ copiera son contenu dans la destination (ce sera l'équivalent d'un cp DOSSIER-SOURCE/* DOSSIER-DESTINATION en somme).

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 rrsync (pour restricted rsync) afin de spécifier celui-ci dans le fichier ~/.ssh/authorized_keys.

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 rsync pour synchroniser le dossier /toto/tata/.

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.

rsync [OPTIONS] <SOURCE> <UTILISATEUR>@<ADRESSE>:/

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
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

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
toto:quenelleépaulée
titi:123456789
tata:c'estlabase

Le fichier de configuration devra alors se voir agrémenté de quelques paramètres supplémentaires. Dans la section globale, la directive strict modes = false permet de pouvoir lire le fichier de mots passe (sinon une sécurité à la con est bogué l'empêche...) ; les paramètres auth users et secrets file 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 :

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

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

Source