rsync alle Dateien der Remote-Maschine über SSH ohne Root-Benutzer?

68

Ich habe diesen Befehl, um eine Remote-Maschine zu sichern. Das Problem ist, dass ich root-Rechte benötige, um alle Dateien lesen und kopieren zu können. Ich habe aus Sicherheitsgründen keinen Root-Benutzer aktiviert und benutze sudodie Ubuntu-Methode. Benötige ich eine coole Rohrleitung oder etwas, um dies zu tun?

rsync -chavzP --stats [email protected]:/ /media/backupdisk/myserverbackup/
redanimalwar
quelle
3
Verwenden Sie einfach das rootKonto an erster Stelle. sudoInsbesondere in Kombination mit NOPASSWDden Empfehlungen in den Kommentaren wird die Sicherheit Ihres Computers nicht wirklich verbessert.
Martin von Wittich

Antworten:

88

Ich würde empfehlen, dass Sie nur das Root-Konto in erster Linie verwenden. Wenn Sie es so einrichten:

  • Konfigurieren Sie Ihre sshd_configauf dem Zielcomputer PermitRootLogin without-password.
  • Verwenden Sie diese Option ssh-keygenauf dem Computer, der die Sicherung abruft, um einen privaten SSH-Schlüssel zu erstellen (nur, wenn Sie noch keinen SSH-Schlüssel haben). Legen Sie keine Passphrase fest. Google ein Tutorial, wenn Sie Details dazu benötigen, sollte es genügend geben.
  • Hängen Sie den Inhalt des /root/.ssh/id_rsa.pubSicherungscomputers an den Inhalt /root/.ssh/authorized_keysIhres Zielcomputers an.
  • Jetzt hat Ihr Sicherungscomputer Root-Zugriff auf Ihren Zielcomputer, ohne dass Sie die Kennwortauthentifizierung verwenden müssen.

dann sollte das resultierende Setup ziemlich sicher sein.


sudoInsbesondere in Verbindung mit NOPASSWDden Empfehlungen in den Kommentaren ergeben sich keine Sicherheitsvorteile gegenüber der Verwendung des Root-Kontos. Zum Beispiel dieser Vorschlag:

Fügen Sie Ihrer /etc/sudoersDatei Folgendes hinzu :rsyncuser ALL= NOPASSWD:/usr/bin/rsync

Im Wesentlichen gibt rsyncuserroot-Berechtigungen trotzdem. Du fragst:

@MartinvonWittich Einfach eine vollständige Root-Shell zu bekommen, da mit rsyncausgeführt sudo? Gehen Sie das bitte durch.

Na ja, einfach. Mit der empfohlenen Konfiguration rsyncuserkann jetzt rsyncals root ausgeführt werden, ohne dass Sie nach einem Passwort gefragt werden. rsyncist ein sehr leistungsfähiges Tool zum Bearbeiten von Dateien. Daher gibt es jetzt rsyncuserein sehr leistungsfähiges Tool zum Bearbeiten von Dateien mit Root-Berechtigungen. Es dauerte nur ein paar Minuten, um einen Weg zu finden, dies auszunutzen (getestet auf Ubuntu 13.04, erfordert dash, bashhat nicht funktioniert):

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

Wie Sie sehen, habe ich mir eine Root-Shell erstellt. whoamiIdentifiziert mein Konto als root, kann ich Dateien erstellen /etcund lesen /etc/shadow. Mein Exploit bestand darin, das setuid- Bit in der dashBinärdatei zu setzen. Es bewirkt, dass Linux diese Binärdatei immer mit den Berechtigungen des Besitzers ausführt, in diesem Fall root.

Eine echte Wurzel zu haben, wird aus guten Gründen nicht empfohlen. - Redanimalwar vor 15 Stunden

Nein, unbeholfenes Umgehen des Root-Kontos in Situationen, in denen es absolut angemessen ist, es zu verwenden, hat keinen guten Grund. Dies ist nur eine andere Form der Frachtkult-Programmierung - Sie verstehen das Konzept von sudo vs root nicht wirklich, Sie wenden einfach blind den Glauben an "root ist schlecht, sudo ist gut" an, weil Sie das irgendwo gelesen haben.

Einerseits gibt es Situationen, in denen sudodefinitiv das richtige Werkzeug für den Job ist. Wenn Sie beispielsweise interaktiv an einem grafischen Linux-Desktop arbeiten, sagen wir, Ubuntu, dann ist die Verwendung sudoin den seltenen Fällen, in denen Sie manchmal Root-Zugriff benötigen , in Ordnung. Ubuntu hat absichtlich ein deaktiviertes Root-Konto und zwingt Sie, sich sudostandardmäßig anzumelden, um zu verhindern, dass Benutzer immer das Root-Konto verwenden, um sich anzumelden. Wenn der Benutzer nur z. B. den Webbrowser verwenden möchte, wäre es gefährlich, sich als Root anzumelden Wenn Sie also standardmäßig kein Root-Konto haben, wird dies von dummen Leuten verhindert.

Auf der anderen Seite gibt es Situationen wie Ihre, in denen ein automatisiertes Skript Root-Berechtigungen für etwas erfordert, zum Beispiel um ein Backup zu erstellen. Das Umgehen sudodes Root-Kontos ist nicht nur sinnlos, sondern auch gefährlich: Auf den ersten Blick rsyncusersieht es aus wie ein gewöhnliches nicht privilegiertes Konto. Aber wie ich bereits erklärt habe, wäre es für einen Angreifer sehr einfach, vollständigen Root-Zugriff zu erhalten, wenn er bereits rsyncuserZugriff erhalten hätte. Im Grunde haben Sie jetzt ein zusätzliches Root-Konto, das überhaupt nicht wie ein Root-Konto aussieht, was keine gute Sache ist.

Martin von Wittich
quelle
2
Gute Erklärung. Wäre ein weiterer Grund für die Verwendung von sudo über root die Situation, in der mehrere Personen Sysadmin-Rollen auf einem Server haben? Auf diese Weise kann jeder seinen eigenen SSH-Schlüssel verwenden, anstatt den SSH-Schlüssel von root gemeinsam zu nutzen.
Nathan S. Watson-Haigh
2
@ NathanS.Watson-Haigh Sie könnten genauso einfach alle SSH-Schlüssel in /root/.ssh/authorized_keys, oder sogar mehrere Root-Konten mit verschiedenen Häusern erstellen, so dass jeder Benutzer seine eigene Shell haben kann, zu Hause und .ssh/authorized_keys:)
Martin von Wittich
2
Sie können ssh-Schlüssel auch darauf beschränken, nur bestimmte Befehle zuzulassen. Auf jeden Fall eine gute Idee, denn wenn Sie etwas automatisieren, werden Sie diese SSH-Schlüssel wahrscheinlich ohne Passphrase erstellen oder zumindest so, dass sie jederzeit verfügbar sind, wenn eine Maschine läuft. (Dies bedeutet, dass root auf diesem Computer Zugriff auf root auf anderen Computern gewährt.)
Peter Cordes
2
Martins Bedenken bezüglich der Verwendung von sudo root sind berechtigt, aber es scheint, dass sie durch die Angabe der genauen rsync-Parameter in der sudoers-Datei gemildert werden könnten. Laut der Manpage sudoers (5) unter Ubuntu: "Wenn einem Cmnd Befehlszeilenargumente zugeordnet sind, müssen die Argumente im Cmnd genau mit denen übereinstimmen, die der Benutzer in der Befehlszeile angegeben hat (oder mit den Platzhaltern, falls vorhanden). . " Wenn die sudoers-Datei den genauen rsync-Befehl mit den genauen Optionen (einschließlich Quelle und Ziel) angibt, scheint dies sicher zu sein.
4
Eine Überlegung, die nicht zuvor angesprochen wurde: Im sshdAllgemeinen wird nicht protokolliert, welcher autorisierte Schlüssel zum Herstellen einer Verbindung mit einem Konto verwendet wurde. Wenn Sie also eine Verbindung wie bobdamals herstellen sudo, erhalten Sie einen besseren Prüfpfad, als wenn Sie eine rootdirekte Verbindung mit bobdem Schlüssel von herstellen.
Coderer
71

Verwenden Sie die --rsync-pathOption, um den Remote- rsyncBefehl mit sudoBerechtigungen auszuführen . Ihr Befehl sollte dann zB sein:

rsync -chavzP --rsync-path="sudo rsync" --stats [email protected]:/ .

Wenn sudoSie zur Eingabe eines Kennworts aufgefordert werden, müssen Sie dies vermeiden, indem Sie entweder ein NOPASSWDPrivileg für das Remote-Benutzerkonto verwenden (sinnlos für root, kann in anderen Anwendungsfällen sinnvoll sein) oder wenn Sie dies nicht möchten:

  • Stellen Sie sicher, dass die Option tty_ticketsfür den von Ihnen verwendeten Benutzer deaktiviert ist, indem Sie z. B. sudo visudo -f /etc/sudoers.d/local-rsync ausführen und Folgendes eingeben:

    Defaults:your.username.for.rsync !tty_tickets
    
  • Stellen Sie sicher, dass die Option requirettyfür den von Ihnen verwendeten Benutzer deaktiviert ist - sie ist möglicherweise standardmäßig deaktiviert. Die Methode ist die gleiche wie oben.

  • Legen Sie das sudoPasswort auf dem Remote-Computer fest, indem Sie z ssh -t [email protected] sudo

M_dk
quelle
1
@scai das Passwort, nach dem gefragt wird, ist höchstwahrscheinlich das sudoPasswort, nicht das sshPasswort
umläute
2
@redanimalwar ermöglicht es Ihrem Benutzer, sudo /usr/bin/rsyncohne nach einer Passphrase zu fragen; Überprüfen Sie, man sudoerswie dies zu tun ist. Möglicherweise möchten Sie hierfür einen zusätzlichen Sicherungsbenutzer erstellen.
Umläute
5
Um die sudo /usr/bin/rsyncAusführung zuzulassen , ohne dass ein Kennwort erforderlich ist, fügen Sie Folgendes zu Ihrer /etc/sudoersDatei hinzu: rsyncuser ALL= NOPASSWD:/usr/bin/rsyncDamit kann der Benutzer rsyncuser (wie oben erwähnt, empfiehlt es sich, einen dedizierten Sicherungsbenutzer zu erstellen) mit dem gewünschten Benutzernamen.
M_dk
4
@M_dk verfügt jetzt im rsyncWesentlichen immer über Root-Berechtigungen. Es ist wahrscheinlich sehr einfach, in diesem Konto eine vollständige Root-Shell zu erstellen. Ich denke, es ist besser, nur den echten Root-Account zu verwenden.
Martin von Wittich
1
Die Antwort, in keiner Weise von der echo "password" | somethingich spreche, habe ich tatsächlich nie benutzt und bin mit den Sicherheitsproblemen einverstanden, die damit verbunden sind, dass rsync (auch hier nicht empfohlen) plötzlich ausgeführt wird. Was das tty_ticketsheißt, ich habe eigentlich keine Ahnung, scheint gebraucht und ein Sicherheitsproblem zu sein. Dies würde sicher funktionieren, ohne irgendetwas zu verändern, indem nur sodo auf ssh ausgeführt und dann der Befehl ausgeführt wird, oder? Aber da ich diese Frage zum Scripen gestellt habe, stimme ich voll und ganz zu, dass keybasiertes ssh ohne pw das sichere und richtige ist. Stattdessen nahm ich Martins Antwort an.
Redanimalwar
17

Eine einfache Möglichkeit, dies zu tun, besteht darin, das grafische ssh-askpassProgramm mit zu verwenden sudo. Dies umgeht die Tatsache, dass sudokeine Verbindung zum Terminal besteht und Sie das Passwort sicher eingeben können:

rsync -chavzPe 'ssh -X' --stats \
  --rsync-path='SUDO_ASKPASS=/usr/lib/ssh/x11-ssh-askpass sudo -A rsync' \
  [email protected]:/ .

Natürlich ssh-askpassmuss das Programm am angegebenen Speicherort installiert sein und Sie müssen eine X-Sitzung auf dem Computer ausführen, an dem Sie arbeiten. Es gibt einige Variationen des ssh-askpassProgramms, die auch funktionieren sollten (Gnome / KDE-Versionen). Auch ein grafisches sudoErsatzprogramm gefällt gksuoder kdesudosollte auch funktionieren.

Graeme
quelle
rsync --rsh='ssh -X' --rsync-path='gksudo -- rsync' user@host:/ .funktioniert nicht rsync error: syntax or usage error (code 1) at main.c(1634) [server=3.1.1]. Oh, Ubuntu versendet Gnome-ssh-askpass, aber es ist /usr/bin/ssh-askpass, anstatt /usr/lib/ssh/x11.... Also das hat funktioniert :)
Peter Cordes
1
Dies ist eine der besseren Lösungen, da auf der anderen Seite keine Neukonfiguration erforderlich ist. Es muss lediglich der Askpass installiert und die X-Weiterleitung aktiviert sein. Beides sollte weit verbreitet sein.
David Gardner
1
Funktioniert wie ein Zauber nach der Installation ssh-askpass. Ich musste nur die Bedeutung von nachschlagen -chavzPe, wäre großartig, um diese als lange Optionen zu formulieren.
krlmlr
Ich habe es versucht, aber die Eingabeaufforderung wird auf dem Remotecomputer geöffnet und nicht an den lokalen Computer weitergeleitet. X11Forwarding funktioniert erwartungsgemäß mit ask, was ich xeyesmit SSH überprüft habe .
Joyce Babu
7

Wenn Ihr Benutzer bereits sudo-Berechtigungen hat, die mit einem Kennwort geschützt sind, würde ich sie unverändert lassen und nur eine Zeilengruppe hinzufügen, um rsync ohne Kennwort zu verwenden:

%admin ALL=(ALL) ALL
%admin ALL= NOPASSWD:/usr/bin/rsync 
Gunnar Thielebein
quelle
5

Ich bin heute auf dieses Problem gestoßen und habe es gelöst, ohne Konfigurationsdateien zu ändern oder Benutzerkonten Berechtigungen auf Stammebene zu erteilen. Mein besonderes Set-up war , dass Benutzer Aauf der Maschine fooalle Benutzerverzeichnisse von kopieren hatten foozu Maschine barin einem backupVerzeichnis der Benutzer Agehören. (Benutzer Ahat Sudo-Berechtigungen auf foo.)

Der Befehl, den ich verwendet habe, ist unten. Es wurde vom Benutzer Aim /homeVerzeichnis am aufgerufen foo.

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

Dadurch wird rsync als sudo ausgeführt, sodass auf alle Benutzerverzeichnisse foozugegriffen werden kann, aber rsync wird angewiesen, ssh zu verwenden, um barmit Aden Anmeldeinformationen des Benutzers auf den Computer zuzugreifen . Meine Anforderungen waren etwas anders als in der obigen Frage, aber dies ermöglichte es mir, schnell eine Sicherung aller Benutzerverzeichnisse auf einem bestimmten Computer zu erstellen, ohne die Systemkonfiguration zu beeinträchtigen.

Ken Anderson
quelle
2
Das ist brilliant. Ich habe die -iOption zu vergessen ssh. Sie können verwenden, --rsync-path="sudo /usr/bin/rsync" wenn Sie sudo auf dem Computer haben bar. Dies macht dann Lesen als root@foound Schreiben als root@bar, aber Übertragen über A@foo-> B@bar. Vielen Dank!
Ctbrown
Es wird den Besitzer (zB root) nicht erhalten, habe ich recht?
Andris
3

Wenn Sie rsync als Daemon auf dem Zielcomputer ausführen, können Sie tun, was Sie möchten.

Konstantin
quelle
1
Ich habe diese Antwort positiv bewertet, aber es wäre besser, wenn ich erklären würde, wie man den rsynch-Daemon zum Laufen bringt und wie man ihn mit root-Zugriff benutzt.
Mike Lippert
rsync als Daemon würde nicht mit diesem Fall übereinstimmen, da rsync Root-Berechtigungen verwirft, selbst wenn es als Root gestartet wird, dann können nicht alle Dateien übertragen werden.
Teissler
2

Meine Lösung ist zu verwenden, --rsync-path="sudo rsync"aber es fragt nach einem Passwort, Workaround:

rsync -chavzP --stats --rsync-path="echo <SUDOPASS> | sudo -Sv && sudo rsync"  [email protected]:/ .
Bulat
quelle
1
In der Regel ist es keine gute Idee, Kennwörter einzeilig in die Befehlszeile einzufügen. Sie werden beispielsweise im Prozessbaum sichtbar. Ich ersetze manchmal das tatsächliche Kennwort in dieser Art von Anweisung, $( cat my_password.txt )die etwas besser ist, aber es wird normalerweise bevorzugt, die Berechtigungen auf beiden Seiten zu konfigurieren und / oder SSH-Schlüssel so zu verwenden, dass keine Kennwörter für die CLI erforderlich sind
JDS