Erzwingen von rsync in den nicht interaktiven Modus

8

Ich möchte rsync in einem Python-Skript verwenden. Ich rufe es mit dem subprocessModul auf und authentifiziere mich mit öffentlichen Schlüsseln, die in der authorized_keyDatei auf dem Remotecomputer gespeichert sind .

Das einzige Problem ist, dass ich bei Verwendung von rsync mit einem falschen Remote-Benutzernamen zur Eingabe eines Kennworts aufgefordert werde, wodurch das Sicherungsskript offensichtlich für immer angehalten wird.

Kann ich rsyncdas Beenden mit einem Fehler erzwingen , wenn die Authentifizierung nicht möglich ist, anstatt zur Eingabe eines Kennworts aufzufordern?

Udi

Adam Matan
quelle

Antworten:

9

Angenommen, Sie verwenden rsync mit einer SSH-Remote-Shell (und nicht beispielsweise mit einem rsync-Server), dann können Sie rsync dazu bringen, SSH so auszuführen, dass Sie nie nach einem Kennwort gefragt werden. Zum Beispiel kann einmal dieser Aufruf verwendet werden:

rsync -e 'ssh -o "NumberOfPasswordPrompts 0"' source user@target:/path

Dadurch wird rsync gezwungen, SSH mit 0 möglichen Kennwortversuchen zu verwenden. Wenn es mit einer anderen Authentifizierungsmethode (wie öffentlichem Schlüssel oder GSSAPI) keinen Zugriff erhält, schlägt es mit einem Fehler fehl. Beachten Sie, dass rsync Sie in diesem Fall nicht mag und sich lautstark bei STDERR beschwert und mit dem Exit-Code 255 bricht.

Guss
quelle
5

Hier sind die Befehlszeilenoptionen für ssh, mit denen ich es ruhig halte.

ssh -o stricthostkeychecking=no -o userknownhostsfile=/dev/null -o batchmode=yes -o passwordauthentication=no

Sie benötigen das Hostkey-Zeug nur, wenn Sie Ihre Datei "unknown_hosts" nicht verwalten und sich Sorgen machen, MitM-Warnungen zu erhalten. Anstatt die von James F vorgeschlagenen Authentifizierungstypen anzugeben, musste ich die Kennwortauthentifizierung explizit einschränken. Ich benutze dies jedoch, um Hunderte von Hosts mit einigen verschiedenen Betriebssystemversionen zu treffen, so dass es möglicherweise nur eine Inkompatibilität ist.

Chad Huneycutt
quelle
1
Bitte verwenden Sie diese Einstellungen NICHT. Siehe Abschnitt 11.5 von Oreillys "SSH, The Secure Shell: The Definitive Guide, Second Edition". In dem Buch heißt es: "Leider wird durch das effektive Überspringen der Serverauthentifizierung ein wesentlicher Teil der SSH-Sicherheit deaktiviert: Widerstand gegen Server-Host-Spoofing und Man-in-the-Middle-Angriffe! Diese Situation macht es auch unpraktisch, Serverschlüssel regelmäßig auszutauschen, wie es sein sollte erledigt oder einen Schlüssel zu widerrufen, falls bekannt ist, dass er kompromittiert wurde (dh den Kunden sagen, dass sie ihm nicht mehr vertrauen sollen). "
Mick
1
@ Mick: Das Problem mit solchen Kritikpunkten ist, dass sie in einigen Kontexten völlig unangemessen sind. Zum Beispiel arbeite ich in einer Umgebung, in der das Ziel von rsync-Vorgängen im Allgemeinen eine Vielzahl eingebetteter Systeme in einem privaten Netzwerk ist, das tief in einem Labor vergraben ist. Es gibt überhaupt keine Konnektivität zur Außenwelt, und das Build-System muss in der Lage sein, aktualisierten Code auf die Ziele zu übertragen. Dies ist eine völlig legitime Verwendung von ssh und rsync, und die offensichtliche Lösung besteht darin, die Hostprüfung zu deaktivieren. Eine absolute Regel darüber zu machen, macht überhaupt keinen Sinn.
Stabledog
@Stabledog - Mein Rat ist der richtige Rat für die überwiegende Mehrheit der Anwendungsfälle. Ich gebe jedoch zu, dass Sie eine schwache Sicherheitskonfiguration wählen können, wenn Sie nicht glauben, dass ein schlechter Akteur vernünftigerweise Zugriff auf Ihr Netzwerk erhalten kann, um einen MiTM-Angriff auszuführen. Die für eine Laborumgebung erforderliche Sicherheitskonfiguration (wie bereits erwähnt) unterscheidet sich offensichtlich von einer Produktionsumgebung, da das Risiko natürlich verringert wird.
Mick
Meinetwegen. Hier ist sowohl das philosophische als auch das praktische Anliegen: ssh wird viel mehr geschätzt als seine Fähigkeit, sicher zu sein , und tatsächlich ... in den meisten Einstellungen, die ich gesehen habe, ist Sicherheit das am wenigsten wichtige Anliegen . Es ist nur das Schweizer Taschenmesser der Wahl für Fernverbindungen aller Art. Es gibt also diese Trennung zwischen den Schelte der "Sicherheitspuristen" und der Art und Weise, wie echte Menschen sie täglich auf praktische Weise verwenden. Ich glaube nicht, dass wir alle nur zufällige Dummköpfe sind und die Puristen "Recht" haben. Es ist eine Frage des Wissens, wann man sich kümmert.
Stabledog
1

Betreff: James 'Vorschlag (nicht tty), für den Unterprozess versuchen Sie, Popd stdin = None als Parameter zu geben.

Adam Brand
quelle
0

Lassen Sie zuerst den rsync über die Shell arbeiten. Der Befehl sollte so aussehen.

Wenn dies fehlschlägt, debuggen Sie den Befehl ssh selbst. Wenn das alles funktioniert, sehen Sie, was mit dem Python-Skript passiert

Dies ist kein schlechtes Tutorial

James
quelle
0

Je nachdem, wie Sie rsync starten, kann es hilfreich sein, RTY oder PTY nicht anzugeben.

Viele Programme prüfen, ob sie über eine steuernde TTY verfügen, bevor sie den Benutzer zur Eingabe auffordern. Das Standardverhalten von system () und ähnlichen Aufrufen besteht darin, Unterprogrammen eine tty bereitzustellen. Sie können dies jedoch deaktivieren.

Es kann auch möglich sein, die Kennwortauthentifizierung auf der Remote-Seite vollständig zu deaktivieren, wenn Sie die Kontrolle über beide Systeme haben und aus Sicherheitsgründen von der Kennwortauthentifizierung Abstand nehmen möchten, während Sie dieses Problem lösen.

Wenn Sie rsync über SSH ausführen, können Sie Ihrer Datei ssh_config für den betreffenden Host oder über den Befehlszeilenschalter -o Folgendes hinzufügen:

PreferredAuthentications publickey

Bei einem schnellen Test (nur von ssh, nicht von rsync) wurde SSH sofort beendet, wenn mein öffentlicher Schlüssel nicht akzeptiert wurde, ohne mich zur Eingabe eines Kennworts aufzufordern.

James F.
quelle