Rsync-Stammdateien zwischen Systemen ohne Angabe eines Passworts

Rsync-Stammdateien zwischen Systemen ohne Angabe eines Passworts

Das erscheint mir sehr schwierig.

Ich habe meine beiden Systeme so eingerichtet, dass ich rsyncDateien zwischen ihnen als ich selbst austauschen kann, ohne ein Passwort angeben zu müssen. Jetzt besteht das Problem bei rsyncden Dateien, die zu gehören root. Auf beiden meiner Systeme gibt es keine Root-Passwörter. Die einzige Möglichkeit, Root zu werden, ist über sudo. Ich kann also weder ein Passwort für angeben sudo rsyn local root@remote:, noch meinen SSH-Agenten verwenden, um eine Passphrase bereitzustellen. Ich möchte auf keinem System ein Root-Passwort einrichten; und ich brauche die Dateien auf beiden Systemen, die Root gehören.

BEARBEITEN: Die Verwendung der zugehörigen Dateien rootist nur ein Beispiel. Ich brauche eine Möglichkeit, mit der mein nicht privilegiertes Konto problemlos Systemdateien (einschließlich Root-eigener Dateien) lesen/schreiben kann. Ein Beispiel ist das Kopieren meiner konfigurierten /root-Umgebung in das neu installierte System. Die beiden Systeme sind eigentlich zwei VMs unter einem einzigen Host, daher ist es für mich kein großes Problem, Root-eigene Dateien zwischen ihnen zu kopieren.

BEARBEITEN 2: Wenn ich nur meine konfigurierte /root-Umgebung in das neu installierte System kopieren möchte, kann ich tar verwenden:

sudo tar cvzf - /root | ssh me@remote sudo tar xvzf - -C /

Aber ich muss rsyncvon Zeit zu Zeit ein Update durchführen. Gibt es eine einfache Möglichkeit, das zu erreichen?

EDIT 3: Formulieren Sie die Frage formal

Alles begann mit der Frage, wie man rsyncals normaler, unprivilegierter Benutzer Dateien, die root gehören, zwischen zwei Systemen übertragen kann, ohne ein Passwort anzugeben, unter der Voraussetzung, dass

  1. Das rootKonto ist auf beiden Systemen gesperrt. D. h. es gibt keine rootPasswörter. Der einzige Weg, Root zu werden, ist über sudo(empfohlene Sicherheitspraxis, siehehttp://help.ubuntu.com/community/RootSudo)
  2. Ich möchte kein komplett passwortloses System sudo, möchte aber auch nicht dauernd Passwörter eingeben.
  3. Der normale, nicht privilegierte Benutzer hat seine SSH-Passphrase in den SSH-Agenten eingegeben.

Danke

Antwort1

Sie können dies direkt mit rsync tun, indem Sie die --rsync-pathOptionen kreativ nutzen. Sie würden also Folgendes verwenden:

rsync -a -e "ssh" --rsync-path="sudo rsync" localdir/ [email protected]:/remotedir

Beachten Sie, dass dies erfordert, dass „sudo rsync“ auf dem Remote-Host NICHT nach der Passphrase fragt. Dies kann auf verschiedene Weise erreicht werden:

  • Führen Sie sudo -vdies remote durch, bevor Sie rsync ausführen (ideal für einmalige rsync-Jobs). tty_ticketsDamit dies funktioniert, darf Ihre sudo-Option nicht verwendet werden.
  • Einfügen username ALL= NOPASSWD:/usr/bin/rsyncauf /etc/sudoerseinem Remote-Host.
  • mitpam-ssh-agent-authauf der Fernbedienung für/etc/pam.d/sudo

Natürlich können Sie statt „rsync über ssh“ auch „rsync im Daemon-Modus“ (siehe beispielsweise rsyncd.conf(5)und /etc/default/rsyncunter Debian GNU/Linux) verwenden, um das gewünschte Ergebnis zu erzielen, mit dem zusätzlichen Vorteil einer höheren Übertragungsgeschwindigkeit.

Antwort2

Die Lösung.

  1. Das Hinzufügen des SSH-Schlüssels des Benutzers zum Remote-Root funktioniert, aber nur zur Hälfte, d. h. es rsyn ... root@remote:...funktioniert jetzt. Die Herausforderung besteht darin, es sudo rsyn ...auch zum Laufen zu bringen.
  2. Um zu sudo rsyn ...funktionieren, ist folgendes erforderlich: Verwendung eines SSH-Agenten zur Sudo-Authentifizierung,http://www.evans.io/posts/ssh-agent-for-sudo-authentication/
  3. Um das PAM-Modul pam-ssh-agent-auth unter Ubuntu zu installieren, können Sie das PPA verwenden, das ich gerade erstellt habe.https://launchpad.net/~suntong001/+archive/ppa. Läuft einwandfrei im Test unter Ubuntu 12.04 Precise und 13.10 Saucy.

HTH

Antwort3

Eine andere Möglichkeit wäre, auf beiden Servern ein .sh-Skript zu erstellen, das Ihre rsync-Skripte enthält.

Führen Sie sie dann per Cronjob oder per SSH aus:

ssh not-your-root-user@remoteserver sudo sh your-rsync-script.sh

Oder führen Sie Ihr Rsync-Skript direkt über SSH aus

ssh not-your-root-user@remoteserver sudo rsync local root@remote

Wenn es sich um einen geplanten Rsync-Job handelt, würde ich Cronjob bevorzugen.

Antwort4

Nun, es hängt davon ab, was Sie tun möchten. Müssen die Dateien auf beiden Systemen root gehören? Wenn Sie nur ein Backup durchführen, ist das nicht der Fall. Sie können also einfach rsyncals root arbeiten, sich aber als normaler Benutzer beim Remote-Server anmelden.

Erstellen Sie einen Schlüssel für die lokale rootAnmeldung als normaler Remote-Benutzer (ich werde xptIhren normalen Benutzernamen verwenden):

sudo -i
ssh-keygen -t rsa
ssh-copy-id -i ~/.ssh/id_rsa.pub xpt@remote

Sie sollten nun in der Lage sein, einen Vorgang ohne Passwort sshoder rsync(als Root) wie folgt durchzuführen:

rsync /path/to/local xpt@remote

Wenn die Dateien auf beiden Systemen root gehören müssen, wird es etwas komplizierter. Am einfachsten wäre es, auf beiden Systemen ein root-Passwort einzurichten:

sudo -i
passwd 

Nun können Sie sich nach Herzenslust als Root anmelden.

Natürlich, dieam bestenDas Beste wäre,keine Dateien über das Netzwerk als Root kopieren. Ich kann mir nicht wirklich vorstellen, warum Sie das tun sollten, und das Risiko ist den Aufwand nicht wirklich wert. Kopieren Sie die Dateien einfach und spielen Sie sudonach dem Kopieren nach Bedarf damit herum.


AKTUALISIEREN:

Ich wiederhole, dass die einfachste Möglichkeit, dies zu tun, darin besteht, für jeden Rechner ein Root-Passwort zu erstellen und es dann als Root zu kopieren. Ich verstehe nicht, warum Sie das nicht wollen, es ist so einfach wie das Ausführen von sudo passwd.

Wenn Sie darauf bestehen, kein Root-Passwort erstellen zu wollen, besteht die einzige Möglichkeit, dies zu umgehen, meiner Meinung nach in der Ausführung von zwei Befehlen:

  1. Ausführen rsync, um in ein vom Benutzer beschreibbares Verzeichnis zu kopieren (ich verwende, mktmpum einen zufälligen Verzeichnisnamen zu erstellen):

    dir=`mktemp -u`; && sudo rsync -avz /root xpt@remote:$dir
    
  2. Verschieben Sie den Inhalt nachremote:/root

    ssh -t lacoloc@badabing sudo rsync -avz "$dir"/* /root
    

    Die -tOption erzwingt die TTY-Zuweisung und ist erforderlich, um sudoBefehle auf dem Remote-System auszuführen.

Sie können beides kombinieren, indem Sie Ihrer ~/.bashrcDatei Folgendes hinzufügen (sagen Sie mir Bescheid, wenn Sie Bash nicht verwenden):

function Rrsync(){
    dir=`mktemp -u` &&
    sudo rsync -avz $1 $2:$dir &&
    ssh -t $2 sudo rsync -avz $dir/ $3 && rm -rf $dir
}

Sie können die Funktion dann wie folgt aufrufen:

Rrsync /root xpt@remote /root
------ ----- ---------- -----
   |     |       |        |---> The target directory on the remote server
   |     |       |------------> username@server 
   |     |--------------------> Path to local source directory
   |--------------------------> The function name

Bedenken Sie, dass Sie möglicherweise mit dem Hinzufügen/Entfernen eines abschließenden Schrägstrichs /aus der Rsync-Quelle und den Zielen experimentieren müssen, je nachdem, ob Sie ein Verzeichnis oder den Inhalt des Verzeichnisses kopieren. Siehe man rsync.

Damit dies ohne Passwort funktioniert, müssen Sie es als Root ausführen, ssh-keygenwie ssh-copy-idich es ganz am Anfang beschrieben habe. Sie müssen trotzdem Ihr Passwort für die beiden sudoBefehle eingeben, einmal für Ihren lokalen Computer und einmal für den Remote-Computer.

verwandte Informationen