Warum erhalte ich bei diesem rsync + ssh-Cron-Job die Fehlermeldung "Berechtigung verweigert (publickey)"?

20

Ich mache häufig Backups auf einem lokalen Laufwerk, das ich täglich mit einem Remote-Server synchronisieren möchte.

Der Zielserver ist nur für den SSH-Schlüsselzugriff (kein Kennwort) konfiguriert. Da mein primärer SSH-Schlüssel für diesen Server durch Passphrasen geschützt ist, habe ich einen zweiten SSH-Schlüssel (nicht durch Passphrasen geschützt) + Benutzer erstellt, der für unbeaufsichtigte Sicherungen verwendet werden kann. Auf diese Weise muss ich nicht anwesend sein, um meine Passphrase einzugeben, wenn cron ausgeführt wird .

Ich verwende cron und rsync und alle Befehle funktionieren einzeln, scheitern jedoch, wenn sie kombiniert werden.

Die am weitesten entfernte während der Fehlerbehebung

env -i sh -c "rsync -lrstRO --delete --exclude 'lost+found' /Backups/auto-daily-backups/./ [email protected]:/backups/desktop/"

Das gibt den Fehler zurück

Permission denied (publickey).
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: unexplained error (code 255) at io.c(226) [sender=3.1.0]

Irgendwelche Tipps zur weiteren Fehlerbehebung?


Folgendes habe ich bisher versucht und mir fehlen die Ideen:

  1. Cron rennt definitiv ps aux | grep cron
  2. Nichts ungewöhnliches in / var / log / syslog Sep 7 13:22:01 desktop CRON[6735]: (tom) CMD (sh /home/tom/Documents/Scripts/offsite-backup)

  3. SSH im Terminal zum Remote-Server, während der Sicherungsbenutzer arbeitet ssh [email protected]

  4. Das Ausführen des Befehls in Terminal funktioniert einwandfrei rsync -lrstRO --delete --exclude 'lost+found' /Backups/auto-daily-backups/./ [email protected]:/backups/desktop/
  5. Die manuelle Angabe des Pfads zum Backup-Benutzerschlüssel hat keine Auswirkung rsync -lrstRO --delete --exclude 'lost+found' -e 'ssh -i /home/tom/.ssh/backups-only' /Backups/auto-daily-backups/./ [email protected]:/backups/desktop/

  6. Das Ersetzen des nicht funktionierenden Befehls durch einen einfachen Testbefehl funktioniert echo "Hello world" > ~/Desktop/test.txt

  7. Schreien / Fluchen am Computer hatte keine Auswirkung (aber ich fühlte mich vorübergehend besser).


Bearbeiten 1:

Hier ist meine crontab-Datei und das Skript, das sie aufruft.

...
# m h  dom mon dow   command
MAILTO=""
* * * * * sh /home/tom/Documents/Scripts/offsite-backup

und

#!/bin/bash

rsync -lrstRO --delete --exclude 'lost+found' /Backups/auto-daily-backups/./ [email protected]:/backups/desktop/

Bearbeiten 2:

Nur zur Verdeutlichung, /var/log/auth.logauf dem Zielserver steht die Zeile. Sep 11 08:23:01 <hostname> CRON[24421]: pam_unix(cron:session): session closed for user rootDies ist verwirrend, da ich nicht mehr jede Minute lokal cron laufen lasse, aber trotzdem jede Minute ein neuer Eintrag in den Serverprotokollen erscheint. Crontab-Dateien für alle Benutzer (einschließlich Root) auf dem Server sind leer und führen keine Aktionen aus .

Außerdem wurden Benutzer-Backups nur auf dem Server und mit eingeschränkten Rechten erstellt, wobei ein dedizierter SSH-Schlüssel auf meinen Desktop-Computer kopiert wurde. Ich gehe davon aus, dass dies der richtige Weg ist, da alles funktioniert, wenn die Befehle manuell ausgeführt werden.

Die oben angegebene crontab-Datei ist für mich, Benutzer 'tom', auf meinem Desktop-Computer. Ich möchte, dass es das Skript aufruft, das sich als Benutzer "Nur-Backups" beim Server anmelden soll. Ich habe gerade versucht, das Backup-Skript auszuführen (und nicht den darin enthaltenen Befehl), und es hat erfolgreich eine Verbindung hergestellt und funktioniert. Ich habe es auf meinem Desktop als Benutzer 'tom' ausgeführt, der auch den Cron-Job erstellt hat, der nicht funktioniert. Hier ist die Ausgabe aus dem Serverprotokoll, die dieser erfolgreichen Anmeldung entspricht

Sep 11 08:35:31 <hostname> sshd[25071]: error: Could not load host key: /etc/ssh/ssh_host_ed25519_key
Sep 11 08:35:32 <hostname> sshd[25071]: Accepted publickey for backups-only from <desktop IP> port 54242 ssh2: RSA e2:e6:07:27:c1:continues...
Sep 11 08:35:32 <hostname> sshd[25071]: pam_unix(sshd:session): session opened for user backups-only by (uid=0)
Sep 11 08:35:32 <hostname> systemd-logind[638]: New session 12 of user backups-only.
Sep 11 08:36:00 <hostname> sshd[25133]: Received disconnect from <desktop IP>: 11: disconnected by user
Sep 11 08:36:00 <hostname> sshd[25071]: pam_unix(sshd:session): session closed for user backups-only
Tom Brossman
quelle
Wenn 3. mit der Schlüsseldatei funktioniert und 6. auch, dann ... äh ... was sagt die sshd-Protokolldatei auf der Empfängerseite?
Jan
@ Jan bekomme ichSep 7 14:45:01 <hostname> CRON[18716]: pam_unix(cron:session): session closed for user root
Tom Brossman
Das ist entweder die falsche Protokollzeile, oder der Benutzer, der versucht, eine Verbindung über ssh herzustellen, ist root ... oder stammt dies von dem Computer, der die Sicherungen initiiert?
Jan
1
Tom, 2 Fragen, nur um sicher zu gehen, dass in Ihrem ersten Kommentar die [...] Logline CRON hat, aber es sollte so aussehen Sep 7 16:06:02 <hostname> sshd[6747].... Sind Sie zu 100% sicher, dass diese Protokollzeile vom Server stammt und die richtige Zeile ist? Die Crontab, die Sie gepostet haben, ist die Crontab nur für Backups ? Versuchen Sie auch, die Identität Datei manuell hinzuzufügen:rsync .... -e 'ssh -i /home/user/.ssh/identity' ...
Jan
1
Außerdem ist diese Zeile in auth.logIhrem Beitrag unter "Bearbeiten 2" für Cron bestimmt, die auf dem Server ausgeführt wird, und sollte nichts mit Ihren Anmeldeversuchen zu tun haben. Können Sie es tail -f /var/log/auth.logauf dem Server versuchen, während Sie versuchen, das Skript über cron auszuführen? Ich bin mir auch nicht sicher, ob dies funktionieren würde, aber können Sie Ihren ersten envBefehl mit versuchen, um rsync .... -e 'ssh -vvv -i /home/user/.ssh/identity ...zu sehen, ob er mehr Fehler ausgibt?
Alaa Ali

Antworten:

15

Da von der Befehlszeile aus alles einwandfrei funktioniert, Permission denied (publickey)bedeutet der Fehler , dass der SSH-Teil von rsynceine andere Identitätsdatei als der angegebene Benutzername verwendet.

Aus Jan's Kommentar zur ursprünglichen Frage können wir die Identitätsdatei im rsyncBefehl mit angeben -e 'ssh -i /path/to/identity.file' ....

Die Verwendung des folgenden Befehls, um mit einer neuen Umgebung in Cron zu beginnen und den vollständigen Pfad zur Datei anzugeben, löst anscheinend das Problem:

env -i sh -c "rsync -lrstRO --delete --exclude 'lost+found' -e 'ssh -i /home/tom/.ssh/backups-only' /Backups/auto-daily-backups/./ [email protected]:/backups/desktop/"

Ich bin immer noch sehr an dieser Entdeckung interessiert. Das hängt wahrscheinlich mit cron, der Tatsache, dass es mit minimalen Umgebungsvariablen beginnt, und dem ssh-Agenten zusammen. Ich werde das gleiche Szenario in ein paar Tagen einrichten, um es zu testen und einen Bericht zu erstellen.

Alaa Ali
quelle
1
env -i sh -c "rsync -lrstRO --delete --exclude 'lost+found' -e 'ssh -i /path/to/identity.file' /Backups/auto-daily-backups/./ [email protected]:/backups/desktop/"
Meinst
@Problemania Whops, behoben.
Alaa Ali
Ich sehe, dass Sie eine Antwort haben, aber ich bin gespannt, ob Sie "sudo crontab -e" ausführen, das ist der Root-Cron. Was passiert, wenn Sie als "Backup" -Benutzer "crontab -e" angemeldet haben?
Wlraider70
Ich denke, Sie meinten das für die Person, die die Frage gestellt hat. Aber er hat die crontab seines Benutzernamens verwendet, nicht root, und ich glaube, er wollte die crontab des Sicherungsbenutzers nicht verwenden.
Alaa Ali
Wenn ich mit meinem Benutzer ein ähnliches Skript ausführe, wird der SSH-Schlüssel über X11 verwendet. Ich benötige daher eine lokale Kopie des Schlüssels und stelle sicher, dass diese Datei den richtigen Eigentümer und die richtigen Rechte hat.
Sverre
1

Ich habe gerade dieses Problem gelöst, das mich beschäftigt hat ..

Verbindung in RSYNC über SSH kann nicht hergestellt werden, obwohl die Identität für SSH festgelegt wurde ... Es wird nichts unternommen ... Rsync sagt "Erlaubnis verweigert" und ssh sagt "read_passphrase: kann / dev / tty nicht öffnen: Kein Gerät oder Adresse von dieser Typ"

Aber ich habe einen Beitrag gelesen, in dem erklärt wurde, dass die crontab eine eigene Umgebung hat, die nicht mit root identisch ist. Das wusste ich bereits, aber ich verstand nicht, welche Auswirkungen es auf SSH haben könnte, wenn ich den SSH-AGENT verwende

Mein SSH-Schlüsselaustausch erfolgt jedoch mit PassPhrase. Wenn die Umgebung also anders ist und mein RSYNC über SSH eine Passphrase erwartet, die nicht eingegeben werden kann => SSH-Debug-Informationen geben auch den Fehler an:

"debug1: read_passphrase: kann nicht geöffnet werden / dev / tty: Kein solches Gerät oder Adresse" => Nun ja nein TTY = kein Passwort = nicht erlaubt

Auf meinem Computer verwende ich "Schlüsselbund", um den SSH-Agenten zu starten, damit ich die Passphrase nicht jedes Mal neu eingeben muss, wenn ich eine Remoteverbindung versuche. Der Schlüsselbund generiert eine Datei mit den folgenden Informationen

SSH_AUTH_SOCK = /tmp/ssh-PWg3yHAARGmP/agent.18891; export SSH_AUTH_SOCK; SSH_AGENT_PID = 18893; export SSH_AGENT_PID;

==> Der Befehl SSH-AGENT gibt die gleichen Informationen zurück.

Letztendlich sind es also diese Informationen, die sich auf die aktuelle Sitzung beziehen, die zukünftige Authentifizierungen der aktuellen Sitzung ermöglichen, ohne dass die Passphrase eingegeben werden muss, da sie bereits zuvor erstellt und gespeichert wurde.

==> Die Lösung ist da ... es reicht aus, wenn das Skript von der crontab gestartet wird und die Datei, die diese Informationen enthält, als "Quelle" angegeben oder in der Befehlszeile der crontab ausgeführt wird ...

Beispiel: 14 09 * * *. /home/foo/.keychain/foo.serveur.org-sh && scp -vvv -P 22 /tmp/mon_fic/toto.sh [email protected]:. >> / var / log / check_connexion.log 2> & 1 oder verwenden Sie den Befehl "source /home/foo/keychain/foo.server.org-sh" im Skript, mit dem eine Verbindung über SSH hergestellt wird.

=> Mit diesem Sourcing machen Sie sich keine Sorgen mehr. Die Informationen von SSH_AUTH_SOCK und SSH_AGENT_PID werden in die Umgebung des Crontab geladen und sind daher bekannt, dass RSYNC über SSH problemlos funktioniert.

Es hat mich beschäftigt, aber jetzt funktioniert es :)

SoniXtrA
quelle
1

Vorsichtsmaßnahme für Benutzer von SSH Agent Forwarding:

Wenn Sie dieses Verhalten beim Debuggen eines Skripts auf einem Remote-Host -e "ssh -i /path/to/key"feststellen, wird ssh auch mit dem Flag Ihren lokalen (weitergeleiteten) Schlüssel verwenden und nicht den auf dem Server.

Konkretes Beispiel: Ich habe ein Skript auf dem Entwicklungsserver, das Daten vom "Datenserver" mit rsync über ssh abruft. Wenn ich mich beim Dev-Server anmelde und ihn starte, ist alles in Ordnung, aber wenn ich von Cron aus starte, wird mir die Erlaubnis verweigert. Wenn -vvich dem SSH-Prozess (Flag ) etwas Ausführlichkeit hinzufüge, ist mir Folgendes aufgefallen:

debug2: key: /home/nighty/.ssh/id_rsa (0x562d8b974820),
debug2: key: /home/juanr/.ssh/id_rsa (0x562d8b962930), explicit
debug1: Authentications that can continue: publickey,password
debug1: Next authentication method: publickey
debug1: Offering RSA public key: /home/nighty/.ssh/id_rsa
debug2: we sent a publickey packet, wait for reply
debug1: Server accepts key: pkalg ssh-rsa blen 279
debug2: input_userauth_pk_ok: fp 1a:19:08:9f:80:16:b1:db:55:42:9a:52:b2:49:9b:0a
debug1: Authentication succeeded (publickey).

Was mir hier aufgefallen ist, dass ich zufällig einen anderen Benutzernamen auf dem lokalen Host ("nighty") als auf dem Entwickler-Server ("juanr") habe.

Beachten Sie, dass der Schlüssel auf dem Dev-Server als "explizit" markiert wird, aber weiterhin der weitergeleitete Schlüssel von meinem Laptop zum Anmelden verwendet wird. Wenn Sie ssh-copy-idan dieser Stelle einen ausführen, wird nichts aufgelöst, da nur der weitergeleitete Schlüssel und nicht der vom Dev neu installiert wird Server. Wenn Sie ssh-copy-id mit Agent - Forwarding verwenden, müssen Sie angeben , welche Taste mit dem Flag -i zu installieren: ssh-copy-id -i ~/.ssh/id_rsa.pub user@host.

jrial
quelle
0

Haben Sie bereits den alten Trick ausprobiert, die Hosts-Dateien zu bereinigen? Ich meine:

rm ~/.ssh/known_hosts

Es lohnt sich zu versuchen, da ssh es wieder aufbaut und Sie abgestandenes Zeug loswerden. Sie können natürlich auch die Teile entfernen, die zu einer bestimmten IP / einem bestimmten Host gehören.

Weitere Fragen: Wird Ihr Cron-Job unter Ihrer UID oder als Benutzer Cron oder Root ausgeführt?

runlevel0
quelle
1
Die Befehle funktionieren jeweils für sich, sodass ich nicht sehe, wie sich durch Löschen ~/.ssh/known_hostsetwas ändern würde. Und cron wird als mein Benutzer 'tom' auf dem Desktop ausgeführt, mit der Absicht, sich mit dem entsprechenden (kennwortlosen) SSH-Schlüssel, der sich in Benutzer tom befindet, als Benutzer 'backups only' beim Server anzumelden ~/.ssh.
Tom Brossman
3
@ runlevel0 Weder das Flag -rnoch das -fFlag werden zum Löschen known_hostsbenötigt - es ist eine reguläre Datei (kein Verzeichnis) und nicht schreibgeschützt. rm .ssh/known-hostswäre erheblich sicherer, wenn man bedenkt, dass ein Tippfehler mit einem Zeichen - das versehentliche Hinzufügen eines Leerzeichens zwischen .und ssh/known_hostsnach rm -rf(oder rm -r) - normalerweise den gesamten Inhalt des privaten Ordners des Benutzers löscht!
Eliah Kagan
Hallo Eliah, in der Tat ein ausgezeichneter Punkt !! Ich benutze das -rf Flag als Reflexaktion, aber Sie haben absolut Recht. Mir schlecht.
Runlevel0
0

Verwenden Sie das rrsyncSkript zusammen mit einem dedizierten SSH-Schlüssel wie folgt:

REMOTE-Server

mkdir ~/bin
gunzip /usr/share/doc/rsync/scripts/rrsync.gz -c > ~/bin/rrsync
chmod +x ~/bin/rrsync

LOKALER Computer

ssh-keygen -f ~/.ssh/id_remote_backup -C "Automated remote backup"      #NO passphrase
scp ~/.ssh/id_remote_backup.pub [email protected]:/home/devel/.ssh

Entfernter Computer

cat id_remote_backup.pub >> authorized_keys

Stellen Sie der neu hinzugefügten Zeile Folgendes voran

command="$HOME/bin/rrsync -ro ~/backups/",no-agent-forwarding,no-port-forwarding,no-pty,no-user-rc,no-X11-forwarding

Damit sieht das Ergebnis so aus

command="$HOME/bin/rrsync -ro ~/backups/",no-agent-forwarding,no-port-forwarding,no-pty,no-user-rc,no-X11-forwarding ssh-rsa AAA...vp Automated remote backup

LOKAL

Fügen Sie crontabmit xErlaubnis das folgende Skript ein :

#!/bin/sh
echo ""
echo ""
echo "CRON:" `date`
set -xv
rsync -e "ssh -i $HOME/.ssh/id_remote_backup" -avzP [email protected]:/ /home/user/servidor 

Quelle: http://www.guyrutenberg.com/2014/01/14/restricting-ssh-access-to-rsync/

Alessandro Cuttin
quelle
0

Um zu versuchen und zu debuggen, fügen Sie dem ssh-Teil "ssh -v" hinzu. Auf diese Weise können Sie den ausführlichen Modus mit einigen hilfreichen Informationen abrufen.

Bearbeiten: Auf der Manpage:

-v      Verbose mode.  Causes ssh to print debugging messages about its progress.  This is helpful in debugging connection,
             authentication, and configuration problems.  Multiple -v options increase the verbosity.  The maximum is 3.
Pedro Luz
quelle
-1

Ich denke, Sie haben die Datei sshd_config nicht richtig konfiguriert. Überprüfen Sie dies PermitRootLogin yesund PubkeyAuthentication yes für die Fernwartung.

Anandu M Das
quelle
1
Er versucht nicht, sich als root anzumelden, und hat wahrscheinlich die Authentifizierung mit öffentlichen Schlüsseln korrekt eingerichtet, da er den Sicherungsbefehl vom Terminal aus erfolgreich ausführen und sshen kann.
Alaa Ali
1
Danke für den Rat, aber ich habe definitiv nicht PermitRootLoginaktiviert und habe nicht vor, das zu ändern. Die beste Vorgehensweise ist, es zu deaktivieren und ssh nur als normaler Benutzer (fügen Sie sie gegebenenfalls Ihren "sudoers" hinzu) und niemals als root.
Tom Brossman