rsync tous les fichiers de la machine distante sur SSH sans l'utilisateur root?


68

J'ai cette commande pour sauvegarder une machine distante. Le problème est que j'ai besoin des droits root pour lire et copier tous les fichiers. Je n'ai pas d'utilisateur root activé pour des raisons de sécurité et j'utilise sudoUbuntu. Aurais-je besoin d'une tuyauterie fraîche ou de quelque chose pour faire ça?

rsync -chavzP --stats user@192.168.1.2:/ /media/backupdisk/myserverbackup/

3
Utilisez simplement le rootcompte en premier lieu. sudo, spécialement combiné avec ce NOPASSWDqui est recommandé dans les commentaires, n’améliore pas vraiment la sécurité de votre machine.
Martin von Wittich

Réponses:


89

Je recommanderais que vous utilisiez simplement le compte root en premier lieu. Si vous le configurez comme ceci:

  • Configurez votre sshd_configsur la machine cible pour PermitRootLogin without-password.
  • À utiliser ssh-keygensur la machine qui extrait la sauvegarde pour créer une clé privée SSH (uniquement si vous ne possédez pas déjà de clé SSH). Ne définissez pas de phrase secrète. Google un tutoriel si vous avez besoin de détails pour cela, il devrait y en avoir beaucoup.
  • Ajoutez le contenu de /root/.ssh/id_rsa.publa machine de sauvegarde à la /root/.ssh/authorized_keysde votre machine cible.
  • Désormais, votre machine de sauvegarde a un accès root sur votre machine cible, sans avoir à utiliser l'authentification par mot de passe.

alors la configuration qui en résulte devrait être assez sûre.


sudo, surtout en combinaison avec ce NOPASSWDqui est recommandé dans les commentaires, ne présente aucun avantage en matière de sécurité par rapport à l’utilisation du compte root. Par exemple cette suggestion:

ajoutez ce qui suit dans votre /etc/sudoersfichier:rsyncuser ALL= NOPASSWD:/usr/bin/rsync

donne essentiellement les rsyncuserautorisations de la racine quand même. Tu demandes:

@MartinvonWittich Facile d'obtenir un shell root complet car rsyncexécuté avec sudo? Marche [m] e [à travers] cela s'il vous plaît.

Eh bien, simple. Avec la configuration recommandée, rsyncuserpeut maintenant être exécuté en rsynctant que root sans même avoir à demander un mot de passe. rsyncest un outil très puissant pour manipuler des fichiers, a donc maintenant rsyncuserun outil très puissant pour manipuler des fichiers avec des autorisations root. Trouver un moyen d'exploiter cela ne m'a pris que quelques minutes (testé sur Ubuntu 13.04, nécessite dash, bashn'a pas fonctionné):

martin@martin ~ % sudo rsync --perms --chmod u+s /bin/dash /bin/rootdash
martin@martin ~ % rootdash
# whoami
root
# touch /etc/evil
# tail -n1 /etc/shadow
dnsmasq:*:15942:0:99999:7:::

Comme vous pouvez le constater, je me suis créé un shell racine; whoamiidentifie mon compte en tant que root, je peux créer des fichiers /etcet lire /etc/shadow. Mon exploit était de définir le bit setuid sur le dashbinaire; cela oblige Linux à toujours exécuter ce binaire avec les permissions du propriétaire, dans ce cas-ci root.

Avoir une vraie racine n'est pas [recommandé] pour de bonnes raisons. - redanimalwar Il y a 15 heures

Non, travailler maladroitement autour du compte root dans des situations où il est tout à fait approprié de l'utiliser n'est pas pour de bonnes raisons. Ceci est juste une autre forme de programmation culte de cargaison - vous ne comprenez pas vraiment le concept derrière sudo vs root, vous appliquez aveuglément la croyance "la racine est mauvaise, la sudo est bonne" parce que vous l'avez lu quelque part.

D'une part, il y a des situations où il sudoest vraiment le bon outil pour le travail. Par exemple, lorsque vous travaillez de manière interactive sur un poste de travail Linux graphique, supposons Ubuntu, alors l’utilisation sudoest acceptable dans les rares cas où vous avez parfois besoin d’un accès root. Ubuntu a intentionnellement un compte root désactivé et vous oblige sudopar défaut à empêcher les utilisateurs de toujours utiliser le compte root pour se connecter. Lorsque l'utilisateur souhaite simplement utiliser, par exemple, un navigateur Web, il peut être dangereux de se connecter en tant que root. et, par conséquent, ne pas avoir de compte root par défaut empêche les personnes stupides de le faire.

D’autre part, il existe des situations telles que la votre, dans lesquelles un script automatisé requiert des autorisations root sur quelque chose, par exemple pour effectuer une sauvegarde. Maintenant, sudotravailler avec le compte root est non seulement inutile, mais aussi dangereux: à première vue, il rsyncuserressemble à un compte ordinaire non privilégié. Mais comme je l’ai déjà expliqué, il serait très facile pour un attaquant d’obtenir un accès complet à la racine s’il l’avait déjà fait rsyncuser. En gros, vous avez maintenant un compte root supplémentaire qui ne ressemble pas du tout à un compte root, ce qui n’est pas une bonne chose.


2
Bonne explication. Une autre raison d'utiliser sudo sur root serait-elle dans la situation où plusieurs personnes ont des rôles administrateur système sur un serveur? De cette façon, chacun peut utiliser sa propre clé SSH au lieu de partager la clé SSH de root?
Nathan S. Watson-Haigh

2
@ NathanS.Watson-Haigh vous pouvez tout aussi facilement insérer toutes les clés SSH dans /root/.ssh/authorized_keys, voire même créer plusieurs comptes root avec des foyers différents afin que chaque utilisateur puisse disposer de son propre shell, de son domicile et de .ssh/authorized_keys:)
Martin von Wittich

2
Vous pouvez aussi limiter les touches ssh à certaines commandes. Vraiment une bonne idée, car si vous automatisez quelque chose, vous ferez probablement ces clés ssh sans mot de passe, ou au moins de sorte qu'elles soient accessibles tout le temps qu'une machine est en marche. (signifiant que la racine sur cette machine donne accès à la racine sur d'autres machines.)
Peter Cordes

2
Les préoccupations de Martin concernant l'utilisation de sudo root sont valables, mais il semble qu'elles pourraient être atténuées en spécifiant les paramètres rsync exacts dans le fichier sudoers. Selon la page de manuel sudoers (5) sur Ubuntu: "Si un Cmnd a des arguments de ligne de commande associés, alors les arguments de Cmnd doivent correspondre exactement à ceux donnés par l'utilisateur sur la ligne de commande (ou correspondre aux caractères génériques s'il en existe). " Si le fichier sudoers spécifie la commande exacte rsync avec les options exactes (y compris la source et la destination), il semble alors que cela devrait être sûr.

4
Une considération pas été soulevée plus tôt: sshdne généralement pas journal qui a autorisé la clé a été utilisé pour se connecter à un compte, donc si vous vous connectez comme bobalors sudo, vous obtenez une meilleure piste de vérification que si vous vous connectez pour rootdirectement avec bobla clé.
Coderer

71

Utilisez l' --rsync-pathoption pour que la rsynccommande à distance s'exécute avec des sudoprivilèges. Votre commande devrait alors être par exemple:

rsync -chavzP --rsync-path="sudo rsync" --stats user@192.168.1.2:/ .

Si sudoun mot de passe vous est demandé, vous devez éviter cela en utilisant un NOPASSWDprivilège avec le compte d'utilisateur distant (inutile pour le compte root, cela peut avoir un sens dans d'autres cas d'utilisation), ou si vous ne voulez pas le faire:

  • Assurez-vous que l'option tty_ticketsest désactivée pour l'utilisateur que vous utilisez, en exécutant par exemple sudo visudo -f /etc/sudoers.d/local-rsync et en entrant:

    Defaults:your.username.for.rsync !tty_tickets
    
  • Assurez-vous que l'option requirettyest désactivée pour l'utilisateur que vous utilisez - elle pourrait être désactivée par défaut. La méthode est la même que ci-dessus.

  • Créez le sudomot de passe sur la machine distante, en exécutant par exemple ssh -t user@192.168.1.2 sudo


1
@scai le mot de passe qui est demandé est plus probable que le sudomot de passe, pas le sshmot de passe
Umlaute

2
@redanimalwar permet à votre utilisateur de sudo /usr/bin/rsyncsans demander de phrase secrète; vérifier man sudoerscomment faire cela; vous voudrez peut-être créer un utilisateur de sauvegarde supplémentaire pour cela.
Umläute

5
Pour permettre l' sudo /usr/bin/rsyncexécution sans nécessiter de mot de passe, ajoutez ce qui suit dans votre /etc/sudoersfichier: rsyncuser ALL= NOPASSWD:/usr/bin/rsyncCela permettra à l'utilisateur rsyncuser (comme mentionné ci-dessus, il serait préférable de créer un utilisateur de sauvegarde dédié) avec le nom d'utilisateur souhaité.
M_dk

4
@M_dk dispose désormais rsyncessentiellement toujours des autorisations root. il est probablement très facile d'obtenir un shell racine complet dans ce compte. Je pense qu'il est préférable d'utiliser simplement le compte root réel.
Martin von Wittich

1
La réponse n’est en aucune façon de parler de ce que echo "password" | somethingje n’ai jamais utilisé et je suis d’accord avec les problèmes de sécurité posés par l’absence soudaine d’exécution de rsync (également non suggérée ici) est mauvaise. Ce tty_ticketsque je n'ai en réalité aucune idée, semble nécessaire et un problème de sécurité. Cela fonctionnerait de manière sécurisée sans rien modifier en exécutant simplement sodo sur ssh puis en exécutant la commande, non? Mais puisque j'ai posé cette question à des fins de script, je suis tout à fait d'accord pour dire que ssh à base de clé sans pw est la solution sûre et que le droit était juste. J'ai accepté la réponse de Martins à la place.
redanimalwar

17

Une méthode simple consiste à utiliser le ssh-askpassprogramme graphique avec sudo, ce qui évite le fait qu’il sudon’est pas connecté au terminal et vous permet de saisir le mot de passe en toute sécurité:

rsync -chavzPe 'ssh -X' --stats \
  --rsync-path='SUDO_ASKPASS=/usr/lib/ssh/x11-ssh-askpass sudo -A rsync' \
  user@192.168.1.2:/ .

Bien entendu, le ssh-askpassprogramme doit être installé à l'emplacement spécifié et vous devez exécuter une session X sur la machine sur laquelle vous travaillez. Il existe quelques variantes du ssh-askpassprogramme qui devraient également fonctionner (versions Gnome / KDE). Un sudoprogramme de remplacement graphique comme gksuou kdesudodevrait également fonctionner.


rsync --rsh='ssh -X' --rsync-path='gksudo -- rsync' user@host:/ .ne fonctionne pas. rsync error: syntax or usage error (code 1) at main.c(1634) [server=3.1.1]. Oh, Ubuntu expédie gnome-ssh-askpass, mais c’est /usr/bin/ssh-askpass, au lieu de /usr/lib/ssh/x11.... Alors ça a marché :)
Peter Cordes

1
C’est l’une des meilleures solutions car elle n’a pas besoin de reconfiguration - elle nécessite uniquement l’installation de askpass et la redirection X, qui doivent être assez courants.
David Gardner

1
Fonctionne comme un charme après l'installation ssh-askpass. Je devais juste chercher la signification de -chavzPe, ce serait génial d’énoncer ces options comme des options longues.
krlmlr

J'ai essayé cela, mais l'invite s'ouvre sur la machine distante et n'est pas transmise à la machine locale. X11Forwarding fonctionne normalement, ce que j’ai vérifié en exécutant xeyesavec SSH.
Joyce Babu

7

Si votre utilisateur a déjà des privilèges sudo protégés par un mot de passe, je les conserverai tels quels et j'ajouterai uniquement une strophe permettant d'utiliser rsync sans mot de passe:

%admin ALL=(ALL) ALL
%admin ALL= NOPASSWD:/usr/bin/rsync 

5

J'ai rencontré ce problème aujourd'hui et je l'ai résolu sans qu'il soit nécessaire de modifier les fichiers de configuration ni d'accorder des autorisations de niveau racine aux comptes d'utilisateurs. Ma configuration particulière était que l'utilisateur Asur la machine foodevait copier tous les répertoires d'utilisateurs de foodans la machine bardans un backuprépertoire que cet utilisateur Apossédait. (L'utilisateur Aa les privilèges sudo sur foo.)

La commande que j'ai utilisée est ci-dessous. Il a été appelé par l'utilisateur Adans le /homerépertoire sur foo.

sudo rsync -avu -e "ssh -i /home/A/.ssh/id_rsa -l A"  * B:/home/backup

Ceci exécute rsync en tant que sudo afin que tous les répertoires utilisateur foopuissent être accédés, mais indique à rsync d'utiliser ssh pour accéder à la machine à l' baraide Ades informations d'identification de l'utilisateur. Mes besoins étaient légèrement différents de ceux de la question ci-dessus, mais cela m’a permis d’obtenir rapidement une copie de sauvegarde de tous les répertoires de l’utilisateur sur une machine particulière que je gère sans modifier la configuration du système.


2
C'est génial. J'ai oublié l' -ioption ssh. Vous pouvez utiliser --rsync-path="sudo /usr/bin/rsync" si vous avez sudo sur la machine bar. Ceci lit root@fooet écrit comme root@bar, mais transfère via A@foo-> B@bar. Merci!
ctbrown le

Cela ne préservera pas le propriétaire (par exemple, root), ai-je raison?
Andris

3

Exécuter rsync en tant que démon sur la machine cible vous permet de faire ce que vous voulez.


1
J'ai voté en faveur de cette réponse, mais il serait préférable d'expliquer comment faire fonctionner le démon rsynch et comment l'utiliser avec un accès root.
Mike Lippert

rsync en tant que démon ne correspond pas à ce cas, car rsync abandonnera les autorisations root même quand il est lancé en tant que root, tous les fichiers ne peuvent pas être transférés.
Teissler

2

Ma solution est d'utiliser --rsync-path="sudo rsync"mais il demande un mot de passe, solution de contournement:

rsync -chavzP --stats --rsync-path="echo <SUDOPASS> | sudo -Sv && sudo rsync"  user@192.168.1.2:/ .

1
Ce n'est généralement pas une bonne idée de mettre des mots de passe dans une ligne de commande; ils deviennent visibles dans l'arbre de processus, par exemple. Je remplace parfois le mot de passe actuel dans ce type d'énoncé par $( cat my_password.txt )ce qui est légèrement meilleur, mais il est généralement préférable de configurer les autorisations à l'une ou l'autre extrémité et / ou d'utiliser des clés SSH, de telle sorte que les mots de passe ne soient pas obligatoires sur la CLI
JDS
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.