216 Stimmen

ssh: Die Authentizität des Hosts 'hostname' kann nicht festgestellt werden

Wenn ich per ssh auf einen Rechner zugreife, erhalte ich manchmal diese Fehlerwarnung und werde aufgefordert, "ja" oder "nein" zu sagen. Dies verursacht einige Probleme, wenn von Skripten, die automatisch ssh zu anderen Maschinen laufen.

Warnmeldung:

The authenticity of host '<host>' can't be established.
ECDSA key fingerprint is    SHA256:TER0dEslggzS/BROmiE/s70WqcYy6bk52fs+MLTIptM.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'pc' (ECDSA) to the list of known hosts.

Gibt es eine Möglichkeit, automatisch "Ja" zu sagen oder dies zu ignorieren?

39 Stimmen

Davon würde ich abraten. Sie müssen herausfinden, warum Sie diese Fehler erhalten. Andernfalls öffnen Sie sich für einen Man-in-the-Middle-Angriff, vor dem diese Fehler Sie schützen sollen.

4 Stimmen

Dies könnte durch einen Wechsel des Servers verursacht werden, der diesen ssh-Schlüssel verwendet, oder dadurch, dass jemand zwischen Ihnen und dem Server sitzt und alles mithört, was Sie senden/empfangen.

0 Stimmen

Was könnte der Grund für diesen Fehler sein?

169voto

cori Punkte 8388

Abhängig von Ihrem ssh-Client können Sie die Option StrictHostKeyChecking in der Befehlszeile auf no setzen und/oder den Schlüssel an eine Datei mit null known_hosts senden. Sie können diese Optionen auch in Ihrer Konfigurationsdatei festlegen, entweder für alle Hosts oder für eine bestimmte Gruppe von IP-Adressen oder Hostnamen.

ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no

EDIT

Wie @IanDunn anmerkt, birgt diese Vorgehensweise Sicherheitsrisiken. Wenn die Ressource, zu der Sie eine Verbindung herstellen, von einem Angreifer gefälscht wurde, könnte dieser die Aufforderung des Zielservers an Sie zurückspielen und Ihnen vorgaukeln, dass Sie eine Verbindung zu der entfernten Ressource herstellen, während er sich in Wirklichkeit mit Ihren Anmeldedaten mit dieser Ressource verbindet. Sie sollten sorgfältig abwägen, ob Sie dieses Risiko eingehen wollen, bevor Sie Ihren Verbindungsmechanismus so ändern, dass HostKeyChecking übersprungen wird.

Referenz .

54 Stimmen

Ich halte es für unverantwortlich, dies zu empfehlen, ohne auf die Auswirkungen auf die Sicherheit hinzuweisen. superuser.com/a/421084/121091 ist IMO eine bessere Antwort.

7 Stimmen

@IanDunn Ich würde Ihnen in einer allgemeinen SSH-Client-Situation zustimmen, aber da der OP eindeutig angibt, dass er dieses Problem bei der Ausführung von Skripten hat, besteht die Alternative darin, das Skript jedes Mal zu unterbrechen, wenn sich der Host-Schlüssel ändert (und es gibt eine Reihe von Gründen, warum das der Fall sein könnte), was die Antwort, auf die Sie sich bezogen haben, nicht behebt. Trotzdem ist es eine berechtigte Kritik, und ich habe meine Antwort aktualisiert, um auf das Risiko hinzuweisen.

6 Stimmen

Ich kann nicht glauben, dass so viele Leute diese Antwort hochgestuft haben und dass sie auch vom Fragesteller akzeptiert wird. Bei diesem Ansatz werden die Sicherheitsüberprüfungen umgangen und eine Verbindung mit dem entfernten Host hergestellt. Prüfen Sie, ob die Datei known_hosts im Ordner ~/.ssh/ Schreibrechte hat. Wenn nicht, dann verwenden Sie diese Antwort stackoverflow.com/a/35045005/2809294

103voto

Grzegorz Luczywo Punkte 9244

Eine alte Frage, die eine bessere Antwort verdient.

Sie können die interaktive Eingabeaufforderung verhindern, ohne die StrictHostKeyChecking (was unsicher ist).

Bauen Sie die folgende Logik in Ihr Skript ein:

if [ -z "$(ssh-keygen -F $IP)" ]; then
  ssh-keyscan -H $IP >> ~/.ssh/known_hosts
fi

Er prüft, ob der öffentliche Schlüssel des Servers in known_hosts . Falls nicht, fordert es den öffentlichen Schlüssel vom Server an und fügt ihn zu known_hosts .

Auf diese Weise sind Sie nur einmal einem Man-In-The-Middle-Angriff ausgesetzt, der durch folgende Maßnahmen abgeschwächt werden kann:

  • Sicherstellung, dass das Skript beim ersten Mal eine Verbindung über einen sicheren Kanal herstellt
  • Untersuchung von Protokollen oder known_hosts zur manuellen Überprüfung von Fingerabdrücken (nur einmal durchzuführen)

6 Stimmen

Oder verwalten Sie einfach die Datei known_hosts für alle Rechner als Teil der Konfiguration Ihrer Infrastruktur.

1 Stimmen

Beachten Sie, dass ssh-keyscan nicht mit ProxyCommand funktioniert: marc.info/?l=openssh-unix-dev&m=108446567718763&w=2

1 Stimmen

Wird es nicht wie erwartet funktionieren. `ssh-keygen -F $IP ` sollte sein "`ssh-keygen -F $IP`" (in Anführungszeichen), andernfalls wird es nicht als String interpretiert

46voto

Jim Fred Punkte 1046

Zum Deaktivieren (oder Kontrollieren der Deaktivierung) fügen Sie die folgenden Zeilen am Anfang von /etc/ssh/ssh_config ...

Host 192.168.0.*
   StrictHostKeyChecking=no
   UserKnownHostsFile=/dev/null

Optionen:

  • Das Host-Subnetz kann sein * um den uneingeschränkten Zugang zu allen IPs zu ermöglichen.
  • bearbeiten /etc/ssh/ssh_config für die globale Konfiguration oder ~/.ssh/config für die benutzerspezifische Konfiguration.

Siehe http://linuxcommando.blogspot.com/2008/10/how-to-disable-ssh-host-key-checking.html

Ähnliche Frage auf superuser.com - siehe https://superuser.com/a/628801/55163

26voto

richard Punkte 221

Vergewissern Sie sich ~/.ssh/known_hosts beschreibbar ist. Damit ist das Problem für mich gelöst.

5 Stimmen

Ist es sicher, jedem zu erlauben, auf known_hosts zu schreiben?

3 Stimmen

@akaRem definitiv nicht. Normalerweise möchte man, dass es nur für den Benutzer beschreibbar ist, dem es gehört. .ssh Ordner.

0 Stimmen

Berechtigungen 0400 optimal sind (bitte korrigieren Sie mich), aber in meinem Fall war das Problem einfach, dass die .ssh Der Besitzer des Ordners meines Benutzers hat sich geändert, so dass meine eigenen 0400-Berechtigungen ungültig wurden. sudo Durch die Rückübertragung des Eigentums auf mich wurde mein Problem gelöst.

20voto

Cory Ringdahl Punkte 464

Am besten ist es, wenn Sie zusätzlich zu "StrictHostKeyChecking" den "BatchMode" verwenden. Auf diese Weise akzeptiert Ihr Skript einen neuen Hostnamen und schreibt ihn in die Datei "known_hosts", erfordert aber keine Ja/Nein-Eingabe.

ssh -o BatchMode=yes -o StrictHostKeyChecking=no user@server.example.com "uptime"

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X