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 Sudo
à la manière Ubuntu. Aurais-je besoin de tuyaux sympas ou de quelque chose pour le faire?
rsync -chavzP --stats [email protected]:/ /media/backupdisk/myserverbackup/
Je vous recommande d'utiliser simplement le compte root en premier lieu. Si vous l'installez comme ceci:
sshd_config
sur la machine cible à PermitRootLogin without-password
.ssh-keygen
sur la machine qui extrait la sauvegarde pour créer une clé privée SSH (uniquement si vous ne disposez pas déjà d'une 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./root/.ssh/id_rsa.pub
de la machine de sauvegarde vers le /root/.ssh/authorized_keys
de votre machine cible.alors la configuration résultante devrait être assez sûre.
Sudo
, spécialement combiné avec NOPASSWD
comme recommandé dans les commentaires, n'a aucun avantage en termes de sécurité par rapport à l'utilisation du compte root. Par exemple, cette suggestion:
ajoutez ce qui suit à votre
/etc/sudoers
fichier:rsyncuser ALL= NOPASSWD:/usr/bin/rsync
donne essentiellement rsyncuser
des autorisations root de toute façon. Tu demandes:
@MartinvonWittich Facile d'obtenir un shell racine complet parce que
rsync
exécuté avecSudo
? Parcourez [m] e [à travers] cela s'il vous plaît.
Eh bien, simple. Avec la configuration recommandée, rsyncuser
peut maintenant exécuter rsync
en tant que root sans même être invité à saisir un mot de passe. rsync
est un outil très puissant pour manipuler des fichiers, donc maintenant rsyncuser
dispose d'un outil très puissant pour manipuler des fichiers avec des autorisations root. Trouver un moyen d'exploiter cela m'a pris quelques minutes (testé sur Ubuntu 13.04, nécessite dash
, bash
n'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 voir, je me suis créé un Shell racine; whoami
identifie mon compte en tant que root, je peux créer des fichiers dans /etc
, et je peux lire à partir de /etc/shadow
. Mon exploit a été de définir le bit setuid sur le binaire dash
; cela oblige Linux à toujours exécuter ce binaire avec les autorisations du propriétaire, dans ce cas 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 absolument approprié de l'utiliser n'est pas pour de bonnes raisons. Ceci est juste une autre forme de programmation culte du fret - vous ne comprenez pas vraiment le concept derrière Sudo vs root, vous appliquez simplement aveuglément la croyance "root is bad, Sudo is good" parce que vous avez lu quelque part.
D'une part, il y a des situations où Sudo
est définitivement le bon outil pour le travail. Par exemple, lorsque vous travaillez de manière interactive sur un bureau graphique Linux, disons Ubuntu, alors avoir à utiliser Sudo
est très bien 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 à utiliser Sudo
par défaut pour empêcher les utilisateurs d'utiliser toujours le compte root pour se connecter. Lorsque l'utilisateur veut simplement utiliser, par exemple le navigateur Web, puis se connecter en tant que root serait une chose dangereuse, et donc ne pas avoir de compte root par défaut empêche les gens stupides de le faire.
D'un autre côté, il existe des situations comme la vôtre, où un script automatisé nécessite des autorisations root sur quelque chose, par exemple pour effectuer une sauvegarde. Maintenant, utiliser Sudo
pour contourner le compte root n'est pas seulement inutile, c'est aussi dangereux: à première vue, rsyncuser
ressemble à 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 root complet s'il avait déjà obtenu un accès rsyncuser
. Donc, essentiellement, 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.
Utilisez le --rsync-path
option pour exécuter la commande distante rsync
avec les privilèges Sudo
. Votre commande devrait alors être par exemple:
rsync -chavzP --rsync-path="Sudo rsync" --stats [email protected]:/ .
Si Sudo
vous invite à entrer un mot de passe, vous devez éviter cela soit en utilisant un privilège NOPASSWD
avec le compte d'utilisateur distant (inutile pour root, peut avoir du sens dans d'autres cas d'utilisation), ou si vous ne voulez pas faire ça:
Assurez-vous que l'option tty_tickets
est désactivé 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 requiretty
est 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.
Amorcez le mot de passe Sudo
sur la machine distante, en exécutant par exemple ssh -t [email protected] Sudo
Une façon simple de le faire est d'utiliser le graphique ssh-askpass
programme avec Sudo
, cela permet de contourner le fait que Sudo
n'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' \
[email protected]:/ .
Bien sûr, le ssh-askpass
le programme doit être installé à l'emplacement indiqué et vous devez exécuter une session X sur la machine sur laquelle vous travaillez. Il existe quelques variantes de ssh-askpass
programme qui devrait également fonctionner (versions Gnome/KDE). Un programme de remplacement graphique Sudo
comme gksu
ou kdesudo
devrait également fonctionner.
Si votre utilisateur a déjà des privilèges Sudo qui sont protégés par un mot de passe, je les garderais tels quels et ajouterais seulement une strophe pour utiliser rsync sans mot de passe:
%admin ALL=(ALL) ALL
%admin ALL= NOPASSWD:/usr/bin/rsync
J'ai rencontré ce problème aujourd'hui et l'ai résolu sans avoir besoin de modifier les fichiers de configuration ou d'accorder des autorisations de niveau racine aux comptes d'utilisateurs. Ma configuration particulière était que l'utilisateur A
sur la machine foo
devait copier tous les répertoires utilisateur de foo
sur la machine bar
dans un backup
répertoire appartenant à l'utilisateur A
. (L'utilisateur A
a les privilèges Sudo sur foo
.)
La commande que j'ai utilisée est ci-dessous. Il a été invoqué par l'utilisateur A
dans le /home
répertoire sur foo
.
Sudo rsync -avu -e "ssh -i /home/A/.ssh/id_rsa -l A" * B:/home/backup
Cela exécute rsync en tant que Sudo afin que tous les répertoires utilisateur sur foo
soient accessibles mais il indique à rsync d'utiliser ssh pour accéder à la machine bar
en utilisant les informations d'identification de l'utilisateur A
. Mes besoins étaient légèrement différents de la question ci-dessus, mais cela m'a permis d'obtenir rapidement une sauvegarde de tous les répertoires utilisateur sur une machine particulière que je gère sans bouger avec la configuration du système.
L'exécution de rsync en tant que démon sur la machine cible vous permet de faire ce que vous voulez.
Ma solution consiste à utiliser --rsync-path="Sudo rsync"
mais il demande un mot de passe, solution:
rsync -chavzP --stats --rsync-path="echo <SUDOPASS> | Sudo -Sv && Sudo rsync" [email protected]:/ .