Warum beschädigt mein tar via ssh (Befehl über Authorized_keys) das Archiv?

428
Felix

Von einer Sicherungsmaschine möchte ich TGZ-Dumps eines Produktionsservers abrufen. Beide Maschinen laufen ubuntu 16.04.

Daher verbindet sich der Sicherungsserver über SSH und eine bestimmte SSH mit dem Produktionsserver.

Die ~/.ssh/authorized_keysDatei des jeweiligen Benutzers auf dem Produktionsserver sollte nur einen einzigen Befehl zulassen und so viele Einschränkungen wie möglich einschränken (?), Hoffe ich.

command="tar -cz --file - --ignore-command-error --ignore-failed-read /dir/ 2>/dev/null | cat",no-agent-forwarding,no-port-forwarding,no-user-rc,no-X11-forwarding ssh-rsa AABLASHKEY comment

Wo /dir/ist das Verzeichnis, das gesichert werden soll, AABLASSHKEYund commentnatürlich die "echten" Werte.

Das | catist in diesem Fall erforderlich, da sonst Teer in dieser ubuntu - Version ( "tar (GNU tar) 1,28") nicht auf den von ssh (PTY) gegeben stdout sprechen. Der Stderr sollte in die Leere gehen ( 2> /dev/null). Edit : Der Punkt zu PTY ist ein Missverständnis, siehe die Antwort von @grawity.

Auf der Empfangsseite (dem backupServer) nehme ich es wie folgt auf:

ssh -i /path/to/key the-user@production-server > dir.tgz 

Die resultierende Datei unterscheidet sich jedoch in der Größe vom Archiv, wenn ich sie auf dem Server verarbeite, und ist kein gültiges Archiv (z gzip: stdin: invalid compressed data--crc error ... gzip: stdin: invalid compressed data--length error. B. ). Der Größenunterschied beträgt 22 Byte.

Wenn ich dem Backup-Server einen Befehl auf dem Produktivserver erlaube, indem ich die darin enthaltenen Einschränkungen entferne authorized_keys, funktioniert das problemlos. Welchen Punkt vermisse ich?

Einschränkungen

  • Ich möchte es wirklich verwenden tar(nicht rsync, rrsync oder so ähnlich).
  • Die Verbindung sollte vom Backup-Server initiiert werden
  • Der Produktionsserver sollte keine temporären Dateien erstellen

Lösung

Wie @Grawity in seiner Antwort darauf hinwies (lesen Sie es, um einige Missverständnisse zu beseitigen), ~.ssh/authorized_keyslöst die folgende Zeile das Problem (und funktioniert auf Ubuntu 16.04 mit der angegebenen OpenSSH-Version):

command="tar -cz --file - --ignore-command-error --ignore-failed-read /dir/ 2>/dev/null",restrict ssh-rsa .... 

Stellen Sie folgende Verbindung her, damit der Befehl zum Sichern des Servers keine Warnungen ausgibt:

ssh -o RequestTTY=no -i /path/to/key the-user@production-server > dir.tgz 
1

1 Antwort auf die Frage

3
grawity

Das | catist in diesem Fall erforderlich, da sonst tar [...] nicht an die stdout sprechen von ssh (PTY) gegeben.

Ein PTY zu haben, ist genau eines Ihrer Probleme. Die Ebene tty ist für die Verarbeitung von Terminalsteuerzeichen vorhanden und für andere Arten von Daten überhaupt nicht erwünscht .

Normalerweise wird ssh im Batch-Modus (dh ssh <host> <cmd>) ausgeführt, und es wird keine PTY-Serverseite zugewiesen. Es wird ein sauberer 8-Bit-Kanal bereitgestellt. Wenn Sie jedoch keinen Befehl auf dem Client angeben, müssen Sie die Option -Toder RequestTTYclient explizit hinzufügen, um die TTY-Anforderung zu deaktivieren.

ssh -T theuser @ prod> dir.tgz ssh -o RequestTTY = no theuser @ prod> dir.tgz 

oder einen Dummy-Befehl angeben,

ssh theuser @ prod foo > dir.tgz 

oder verbieten Sie solche Anfragen mit der no-ptyOption authorized_keys:

command = "tar -czf - / dir / 2> / dev / null", no-pty, Einschränkung von ssh-rsa ABCDEF 

( restrictist ein kürzlich hinzugefügter Alias, der alle Weiterleitungen auf einmal deaktiviert, einschließlich derjenigen, die in der Zukunft hinzugefügt werden können. Er ist ab OpenSSH 7.2 verfügbar . Tatsächlich ist er sogar enthalten no-pty, obwohl ich ihn für diese Antwort separat aufgeführt habe.)

Genial. Die "no-pty" -Option ist dann der sicherere Weg (/ Verhindern / Terminal-Steuersequenzen?). Felix vor 5 Jahren 0
Die meisten Steuersequenzen sind nur für das Terminal selbst sinnvoll, aber der pty-Layer erledigt grundlegende Zeilenbearbeitungsfunktionen wie CR ⇄ CRLF-Übersetzung (Erweiterung des Bytes 0A auf 0D 0A oder umgekehrt). grawity vor 5 Jahren 0
Ich habe Ihren Kommentar noch einmal gelesen, und ja, in Bezug auf die Datenbeschädigung ist es sicherer, die PTY-Zuweisung serverseitig zu deaktivieren, als sich darauf zu verlassen, dass die Clients es immer richtig machen. (Sie möchten jedoch immer noch die clientside-Option, um die lästige Warnmeldung zu vermeiden.) grawity vor 5 Jahren 0