« Rsync » : différence entre les versions

De Wiki doc

(Page créée avec « Category:linux »)
 
 
(4 versions intermédiaires par 2 utilisateurs non affichées)
Ligne 1 : Ligne 1 :
[[Category:linux]]
[[Category:synchronisation]]
''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.
 
{{info|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 [[:Category:distributions Linux|distributions Linux]]. Sous ''Debian'', on peut l'obtenir via [[:Category:Apt|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|Comme de nombreux outils de transferts, les répertoires ne sont pas géré de la même façon si un <source lang="bash" inline>/</source> a été précisé ou non. Par exemple, un transfert via Rsync du répertoire <source lang="bash" inline>DOSSIER-SOURCE</source> vers <source lang="bash" inline>DOSSIER-DESTINIATION</source> créera ce dernier avec le contenu du premier alors qu'un <source lang="bash" inline>DOSSIER-SOURCE/</source> copiera son contenu dans la destination (ce sera l'équivalent d'un <source lang="bash" inline>cp DOSSIER-SOURCE/* DOSSIER-DESTINATION</source> 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 <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 [[Openssh#Relai_SSH|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 [[#Syntaxe|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 [[Strongswan|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 [https://stackoverflow.com/questions/26007928/rsyncd-secrets-file-linux-permission-should-not-be-read-by-group-and-others 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 [https://unix.stackexchange.com/questions/111526/how-can-i-rsync-without-prompt-for-password-without-using-public-key-authentica 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
 
=Source=
* https://linux.die.net/man/1/rsync

Dernière version du 27 février 2022 à 23:30

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