Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 31/07/2009, à 00:07

teke

sudo et rsync

Bonjour,

Je cherche à mettre en place un système de sauvegarde. J'ai une machine tournant avec une 9.04 serveur et des clients sous [UX]buntu (8.04 à 9.04), debian, fedora, gentoo & win.

J'ai lu :
man rsync -> http://www.delafond.org/traducmanfr/man/man1/rsync.1.html
man rsyncd.conf -> http://www.delafond.org/traducmanfr/man/man5/rsyncd.conf.5.html
(au passage si vous connaissez quelque chose en français de plus récent...)
http://www.lalitte.com/rsync.html
et bien d'autres choses encore...

sur le serveur :
- serveur ssh avec authentification par clé uniquement.
- un utilisateur rsync.

$ ls -lh rsync*
-rw-r--r-- 1 rsync rsync 220 jui 30 16:11 rsyncd.conf
-rw-r--r-- 1 rsync rsync   0 jui 30 16:05 rsync.lock
-rw-rw-rw- 1 rsync rsync   0 jui 30 15:47 rsync.pid

$ cat -n rsyncd.conf 
     1	uid = rsync
     2	gid = rsync
     3	use chroot = no
     4	max connections = 4
     5	pid file = /home/rsync/rsync.pid
     6	lock file = /home/rsync/rsync.lock
     7	
     8	[bak]
     9	path = /home/rsync/bak
    10	comment = aire de backup.
    11	read only = false

Sur le client :
Script :

$ cat  -n /home/rsync.sh 
     1	#!/bin/bash
     2	# Variables {{{1 vim: set fdm=marker:
     3	dtd=$(date +%y%m%d-%H%M)								# mois : 090409-1558
     4	dtm=$(date +%y)/$(date +%m)/$(date +%d-%H%M)		# 09/04/09-1600
     5	src="/tmp/aaa"												# Source
     7	dst="rsync@nas::bak"
     8	SSH='--rsh "ssh -i /home/user/.ssh/bak_dsa"'
     9	log="/tmp/rsync-home.log"								# Log
    25	
    26	home(){ #{{{1
    27	   time rsync \
    28	      -abxv \
    29	      --rsh "ssh -i /home/user/.ssh/bak_dsa" \
    30	      --filter='dir-merge .rsync.home' \
    31	      --delete-excluded \
    32	      --ignore-errors \
    33	      --force \
    34	      --backup-dir=${dtm} \
    35	      ${src} ${dst} 2>&1 | tee ${log}
    36	} #}}}1
    37	
    38	home

Répertoire à sauvegarder :

$ ls -lhR /tmp/aaa
.:
drwxr-xr-x 2  pierre users 60 2009-07-30 12:48 a
drwxr-xr-x 2  pierre users 60 2009-07-30 12:49 b
drwxr-xr-x 2  pierre users 60 2009-07-30 12:49 c

./a:
total 4.0K
-rw------- 1  pierre users 86 2009-07-30 13:32 1.txt

./b:
total 4.0K
-rw-r--r-- 1  pierre users 43 2009-07-30 12:48 2.txt

./c:
total 4.0K
-rw-r--r-- 1 paul users 43 2009-07-30 12:49 3.txt

Or donc,
je lance mon script avec la commande :

$ sudo /home/rsync.sh
building file list ... done
aaa/
aaa/a/
aaa/a/1.txt
aaa/b/
aaa/b/2.txt
aaa/c/
aaa/c/3.txt

sent 539 bytes  received 106 bytes  61.43 bytes/sec
total size is 172  speedup is 0.27

real	0m10.615s
user	0m0.020s
sys	0m0.008s

le transfert se fait bien... mais sur le serveur :

~$ ls -lhAR bak/
bak/:
total 4.0K
drwxr-xr-x 5 rsync rsync 4.0K jui 30 12:48 aaa

bak/aaa:
total 12K
drwxr-xr-x 2 rsync rsync 4.0K jui 30 12:48 a
drwxr-xr-x 2 rsync rsync 4.0K jui 30 12:49 b
drwxr-xr-x 2 rsync rsync 4.0K jui 30 12:49 c

bak/aaa/a:
total 4.0K
-rw------- 1 rsync rsync 86 jui 30 13:32 1.txt

bak/aaa/b:
total 4.0K
-rw-r--r-- 1 rsync rsync 43 jui 30 12:48 2.txt

bak/aaa/c:
total 4.0K
-rw-r--r-- 1 rsync rsync 43 jui 30 12:49 3.txt

Les droits sur les fichiers sont donc bien transmit, par contre je perd l'utilisateur et le groupe.
J'ai bien vu sur le net que certains conseillent de créer sur le serveur les mêmes utilisateurs avec les mêmes id que sur le client pour qu'il n'y ait pas de problème. J'ai fais l'essai sans résultats, et ce n'est de toute façons pas possible dans mon cas, trop de machines et trop d'utilisateurs.

Comment faire ?

Je viens de passer deux jours complets sur le sujet, sans trouver.
Un super big gros merci d'avance à tous ceux qui pourraient me donner un coup de main.

Dernière modification par teke (Le 10/08/2009, à 00:02)

#2 Le 31/07/2009, à 00:15

kyncani

Re : sudo et rsync

- Rsync évidemment besoin de tourner en tant que root sur la machine qui réalise la sauvegarde pour pouvoir créer des fichiers avec des uid's diverses et variées.
- Tu n'as pas besoin de rsyncd vu que tu utilises rsync sur ssh
- Rsync a une option --numeric-ids pour conserver les uid numériques.

Hors ligne

#3 Le 31/07/2009, à 09:11

teke

Re : sudo et rsync

Un super gros merci pour ta réponse !

yncanik a écrit :

- Rsync évidemment besoin de tourner en tant que root sur la machine qui réalise la sauvegarde pour pouvoir créer des fichiers avec des uid's diverses et variées.

C'est pour cela que je lance le script avec sudo

yncanik a écrit :

- Tu n'as pas besoin de rsyncd vu que tu utilises rsync sur ssh

Au départ je le lançais sans... mais je m'étais dis que cela pouvait aider...

Par contre cela semble apporter des choses intéressantes comme la possibilité d'ajouter un fichier d'exclusion sur le serveur. Je me disais que ce pourrais être sympa dans le cas où certains clients ne se donnent pas la peine de filtrer les caches firefox, nautilus & autres poubelles...

Par contre, je m'aperçois que cela ajoute bien dix secondes à la connexion.

yncanik a écrit :

- Rsync a une option --numeric-ids pour conserver les uid numériques.

Un grand merci pour cette indication !
Malheureusement cela ne fonctionne pas chez moi. J'ai fais l'essai également en passant directement par ssh sans utiliser le rsyncd...

Je vais continuer de chercher. merci beaucoup

#4 Le 31/07/2009, à 11:31

kyncani

Re : sudo et rsync

Le _stockage_ doit se faire avec les droits root pour pouvoir utiliser les uid's originelles.
Tu utilises rsyncd pour stocker les fichiers. Rsyncd tourne en tant qu'utilisateur rsync visiblement et non pas root. Il ne peut donc pas utiliser des uid's libres pour les fichiers qu'il stocke.
Le fait que le client à rsyncd soit root n'a aucune importance.

Deux solutions donc pour les trois remarques que j'ai mentionné précédemment :

- Soit tu fais tourner rsync directement sur le nas en tant que root
- Soit tu utilises un accès ssh *root* pour le nas. Ca veut dire abandonner rsyncd qui n'est pas utile dans ton cas et utiliser /root/.ssh/id_rsa.pub pour accéder à root@nas.

Edit: rsync ne peux pas utiliser des accès ssh pour la source *et* la destination. Il doit donc tourner en tant que root soit sur la source, soit sur la destination.

Dernière modification par kyncani (Le 31/07/2009, à 11:35)

Hors ligne

#5 Le 31/07/2009, à 12:30

teke

Re : sudo et rsync

Un grand merci pour ta réponse... je commence à comprendre...

kyncani a écrit :

Le _stockage_ doit se faire avec les droits root pour pouvoir utiliser les uid's originelles.
Tu utilises rsyncd pour stocker les fichiers. Rsyncd tourne en tant qu'utilisateur rsync visiblement et non pas root. Il ne peut donc pas utiliser des uid's libres pour les fichiers qu'il stocke.
Le fait que le client à rsyncd soit root n'a aucune importance.

J'avais mal compris pour le root en pensant au client et non au serveur, excuse.

kyncani a écrit :

- Soit tu fais tourner rsync directement sur le nas en tant que root

Si je comprend bien le script tourne alors sur le serveur et rapatrie depuis le client.
À charge ensuite de déclancher le script depuis le client pour les portables, ou de faire un test depuis le serveur pour repérer si le client est branché... c'est juste ?

kyncani a écrit :

- Soit tu utilises un accès ssh *root* pour le nas. Ça veut dire abandonner rsyncd qui n'est pas utile dans ton cas et utiliser /root/.ssh/id_rsa.pub pour accéder à root@nas.

là je ne suis pas certains de bien comprendre. Il s'agirait d'utiliser le certificat publique du serveur sur le client pour établir la connections ?

Ou alors de faire se connecter le root du client sur le root du serveur pour le transfert ?
Bon il y a juste que je rechigne sérieusement à laisser un accès root traîner sur le net. Bon ok, il est possible par le jeux des certificats dans le /root/.ssh/authorized_keys du serveur de limiter les commandes possibles, mais c'est une solution qui me fait peur...

Ne serait-il pas possible (je rêve tout haut) d'utiliser le /home/rsync/.ssh/authorized_keys pour lancer un processus root qui aura les droits pour attribuer les uuids ? Par exemple :
  - un rsync qui va chercher ce qu'il faut sur les clients (mais il y aura alors le problème des droits de lectures sur les fichiers d'autres utilisateurs).
  - un rsyncd qui tournerait avec les droits root (par suid ?).

J'entrevois une troisième possibilité dont parle le man, lancer in rsyncsd qui n'écoute que sur la machine, et s'y connecter par un tunnel ssh avec une redirection de port sur le serveur. Mais bof... lourd à mettre en place sur tout les clients...

Je ne vois pas trop comment faire, en restant simple et sécurisé.

Il y a une chose qui m'étonne beaucoup. C'est finalement un besoin qui me semble assez logique et basique... comment se fait-il que je n'arrive pas à trouver plus de doc ou howto sur le sujet ?

Au final le plus simple :
Exécuter en root un script sur le client (pour avoir le droit de lecture sur les autres users du home) qui se connecte en root@nas...
Très simple à mettre en oeuvre... mais question sécurité je tremble...

En tout cas un très gros merci, kyncani, de t'être penché sur mon problème

#6 Le 31/07/2009, à 13:00

kyncani

Re : sudo et rsync

teke a écrit :

Au final le plus simple :
Exécuter en root un script sur le client (pour avoir le droit de lecture sur les autres users du home) qui se connecte en root@nas...
Très simple à mettre en oeuvre... mais question sécurité je tremble...

C'est exact.
Donc, ce qui est beaucoup mieux, c'est d'avoir une application de sauvegarde dédiée sur le serveur de sauvegarde.
Le serveur de sauvegarde doit avoir un accès root pour réaliser la sauvegarde des clients.
Tu peux utiliser rsync _depuis le serveur de sauvegarde_ via des tunnels ssh root pour accéder aux clients. C'est une solution ad-hoc faite maison et pas terrible, il faut bien le dire.

Il y a beaucoup de solutions de sauvegarde différentes. Je te conseillerai backuppc si tu veux faire des sauvegardes sur disque et bacula si tu veux faire des sauvegardes sur bande.
Evidemment, backuppc et bacula sont des solutions beaucoup plus lourdes à mettre en place la première fois. Compte quelques jours.
Il y a des documentations un peu partout sur le net mais si tu n'as pas certaines bases, je ne suis pas sûr que tu puisses les utiliser. De toute manière, si tu ne comprends pas comment fonctionne ta solution de sauvegarde, il y a de grandes chances que tu ne puisses pas l'utiliser pour faire des restaurations quand tu en auras besoin.
Si tu n'as pas quelques jours (semaines ?) pour lire et comprendre la documentation, utilise rsync sur ssh. C'est plus simple et beaucoup plus utilisé pour des sauvegardes personnelles.

A toi de voir.

Hors ligne

#7 Le 31/07/2009, à 15:10

teke

Re : sudo et rsync

Merci beaucoup pour ton aide.

Je crois que je vais rester sur rsync ssh car je ne vais pas rester à demeure... et je ne suis pas certains que les suivants sauront reprendre le système...

je vais donc encore faire des tests... voir du côté d'un chroot peut être...

#8 Le 09/08/2009, à 00:39

teke

Re : sudo et rsync

bon j'ai bien progressé, mais il me reste encore juste une chose à résoudre :

soit : un serveur de nom "nas" avec un utilisateur "rsync" sans droit particulier.

rsync@nas:~$ cat ~/.ssh/authorized_keys
command="/home/rsync/rsync.sh", ssh-dss <clé ssh> rsync/user@machine

rsync@nas:~$ ls -lhA rsync*
-rw-r----- 1 rsync rsync 119 aoû  9 00:17 rsync.log
-rwxr-xr-x 1 root  root  506 aoû  9 00:12 rsync.sh
-rwxr-xr-x 1 rsync rsync  70 aoû  9 00:13 rsync.sudo

rsync@nas:~$ cat rsync.s*
#!/bin/sh
# script "/home/rsync/rsync.sh"
logfile=/home/rsync/rsync.log
case "$SSH_ORIGINAL_COMMAND" in
  *\&*|*\(*|*\{*|*\;*|*\<*|*\`*|*\|*)
    echo `date` "- SSH connection rejected 1 - " $SSH_ORIGINAL_COMMAND >> $logfile
    exit 1
    ;;
  rsync\ --server*)
    echo `date` "- SSH connection accepted - " $SSH_ORIGINAL_COMMAND >> $logfile
    sudo $SSH_ORIGINAL_COMMAND
    exit 0
    ;;
  *) 
    echo `date` "- SSH connection rejected 3 - " $SSH_ORIGINAL_COMMAND >> $logfile
    exit 2
    ;;
esac

#!/bin/sh
# script : /home/rsync/rsync.sudo
sudo /home/rsync/rsync.sh

$ sudo cat /etc/sudoers (extrait)§
User_Alias URSYNC=rsync 
Cmnd_Alias RSYNC=/home/rsync/rsync.sh 
Cmnd_Alias RS=/usr/bin/rsync 
URSYNC  ALL=NOPASSWD: RSYNC 
URSYNC  ALL=NOPASSWD: RS

si sur le client je fais :

$ sudo rsync --rsh "ssh -i /home/egide/.ssh/rsync_dsa" --protocol=30 -a ~/Bureau/tobak rsync@nas:/home/rsync/bak

Pas de problème cela fonctionne très bien. Mes fichiers sont bien transférés ET conservent les droits, l'utilisateur et le groupe d'origine...

Génial... mais avec cette configuration... il n'y a pas besoin d'être très malin pour utiliser rsync pour faire n'importe quoi vu qu'il a les droits sudo... et vraiment nimporte quoi !

donc j'ai tenté de mettre dans authorized_keys

command="sudo /home/rsync/rsync.sh", ssh-dss <clé ssh> rsync/user@machine

et dans sudoers, les droits que sur le script et plus sur rsync... cela fonctionne en local, mais plus via ssh.

l'erreur retransmise est :

rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: error in rsync protocol data stream (code 12) at io.c(632) [sender=3.0.4]

Quelqu'un aurait une idée ?
J'ai l'impression que le problème n'est plus du tout au niveau de rsync, mais à celui de la gestion du sudo ou de ssh...

Help !