2010-09-08 10 views
112

Wenn ich an eine Maschine ssh bin, bekomme ich manchmal diese Fehlermeldung und es wird aufgefordert, "Ja" oder "Nein" zu sagen. Dies führt zu Problemen bei der Ausführung von Skripten, die automatisch an andere Maschinen gesendet werden.ssh: Die Authentizität des Hosts 'Hostname' kann nicht ermittelt werden

Warnung Nachricht:

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 dies automatisch mit „Ja“ oder ignorieren zu sagen?

+18

Ich würde davon abraten. Du musst herausfinden, warum du diese Fehler bekommst, sonst öffnest du dich selbst einem Mann im mittleren Angriff, vor dem diese Fehler dich zu schützen versuchen. –

+2

Dies kann durch einen Serverwechsel unter Verwendung dieses SSH-Schlüssels verursacht werden oder durch eine Person verursacht werden, die zwischen Ihnen und dem Server sitzt und auf alles hört, was Sie senden/empfangen. – derekdreery

Antwort

100

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

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

EDIT

Als @IanDunn Notizen gibt es Sicherheitsrisiken, dies zu tun. Wenn die Ressource, zu der Sie eine Verbindung herstellen, von einem Angreifer gefälscht wurde, kann sie die Herausforderung des Zielservers möglicherweise erneut an Sie weitergeben und Sie glauben lassen, dass Sie eine Verbindung mit der Remote-Ressource herstellen, während sie tatsächlich eine Verbindung zu dieser Ressource herstellen Ihre Anmeldeinformationen. Sie sollten sorgfältig abwägen, ob dies ein angemessenes Risiko darstellt, bevor Sie Ihren Verbindungsmechanismus ändern, um HostKeyChecking zu überspringen.

Reference.

+22

Ich denke, es ist unverantwortlich, dies ohne Vorwarnung bezüglich der Sicherheitsauswirkungen zu empfehlen. http://superuser.com/a/421084/121091 ist eine bessere Antwort IMO. –

+3

@IanDunn Ich würde Ihnen in einer allgemeinen SSH-Client-Situation zustimmen, aber da das OP klarstellt, dass er dieses Problem beim Ausführen von Skripten hat, bricht die Alternative das Skript jedes Mal, 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 löst. Das heißt, es ist eine gültige Kritik, also habe ich meine Antwort aktualisiert, um auf das Risiko hinzuweisen. – cori

+1

Ich kann nicht glauben, dass so viele Leute diese Antwort aufgewertet haben und auch, dass sie vom Fragesteller akzeptiert wird. Dieser Ansatz umgeht die Sicherheitsprüfungen und verbindet sie mit dem Remote-Host. Überprüfen Sie, ob die Datei known_hosts im Ordner ~/.ssh/über Schreibrechte verfügt. Wenn nicht, dann verwenden Sie diese Antwort http: // stackoverflow.com/a/35045005/2809294 –

2

Im Allgemeinen tritt dieses Problem auf, wenn Sie die Schlüssel sehr häufig ändern. Basierend auf dem Server kann es einige Zeit dauern, den neuen Schlüssel zu aktualisieren, den Sie generiert und auf dem Server eingefügt haben. Warten Sie nach dem Generieren des Schlüssels und Einfügen auf dem Server 3 bis 4 Stunden und versuchen Sie es dann. Das Problem sollte gelöst werden. Es ist mir passiert.

27

deaktivieren (oder Steuer Sperrung), 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 * sein können uneingeschränkten Zugang zu ermöglichen alle IPs.
  • Bearbeiten Sie /etc/ssh/ssh_config für globale Konfiguration oder ~/.ssh/config für 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

+3

StrictHostKeyChecking = nein '=' fehlt Zeichen – tryer3000

-3

ich das Problem lösen, das unten geschrieben Fehler gibt:
Fehler:
die Echtheit des Wirtes XXX.XXX. XXX 'kann nicht festgestellt werden.
RSA-Schlüssel Fingerabdruck ist 09: 6c: ef: cd: 55: c4: 4f: ss: 5a: 88: 46: 0a: a9: 27: 83: 89.

Lösung:
1. Installieren Sie ein openSSH-Tool.
2. run command ssh
3. es wird nach fragen Sie fügen diesen Host wie hinzu. JA akzeptieren.
4.Dieser Host fügt die bekannte Hostliste hinzu.
5. Jetzt können Sie eine Verbindung mit diesem Host herstellen.

Diese Lösung arbeitet jetzt ......

+0

Dies beantwortet die Frage nicht. Bei der ursprünglichen (sehr alten) Frage ging es um die automatische Bestätigung solcher Aufforderungen per Skript. – MasterAM

13

Stellen Sie sicher, ~/.ssh/known_hosts beschreibbar ist. Das hat es für mich behoben.

+2

ist es sicher, jedem zu erlauben, an known_hosts zu schreiben? – akaRem

+1

@akaRem definitiv nicht. Normalerweise möchten Sie, dass es nur für den Benutzer schreibbar ist, der diesen '.ssh'-Ordner besitzt. – 2rs2ts

+0

Berechtigungen '0400' sind optimal (bitte korrigieren Sie mich) aber in meinem Fall war das Problem einfach, dass der' .ssh'-Ordner für meinen Benutzer geändert hatte - ergo meine eigenen 0400 Berechtigungen ungültig. 'sudo' änderte das Eigentum zurück zu mir und löste mein Problem. – charneykaye

7

Der beste Weg, dies zu erreichen, ist die Verwendung von 'BatchMode' zusätzlich zu 'StrictHostKeyChecking'. Auf diese Weise akzeptiert Ihr Skript einen neuen Hostnamen und schreibt ihn in die Datei "known_hosts", erfordert jedoch keine Ja/Nein-Intervention.

ssh -o BatchMode=yes -o StrictHostKeyChecking=no [email protected] "uptime" 
53

Alte Frage, die eine bessere Antwort verdient.

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

Integrieren Sie die folgende Logik in das Skript:

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

Es prüft, ob öffentliche Schlüssel des Servers in known_hosts ist. Wenn nicht, fordert es den öffentlichen Schlüssel vom Server an und fügt ihn zu known_hosts hinzu.

Auf diese Weise können Sie nur einmal zu Man-In-The-Middle-Angriff ausgesetzt sind, die durch gemildert werden kann:

  • sicherzustellen, dass das Skript
  • Inspektion Protokolle erstmals über einen sicheren Kanal verbindet oder known_hosts Fingerabdrücke zu überprüfen manuell (nur einmal durchgeführt werden)
+2

Oder verwalten Sie nur die Datei known_hosts für alle Maschinen als Teil Ihrer Konfiguration der Infrastrukturkonfiguration. – Thilo

+0

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

10

Bearbeiten Sie Ihre Konfigurationsdatei normalerweise befindet sich in ‚~/.ssh/config‘, und sich am Anfang der Datei, fügen Sie die folgenden Zeilen

Host * 
    User     your_login_user 
    StrictHostKeyChecking no 
    IdentityFile   ~/my_path/id_rsa.pub 

Benutzer auf your_login_user sagt, dass diese Einstellungen
StrictHostKeyChecking auf no your_login_user gehört wird die Aufforderung
Identity ist Pfad zu RSA-Schlüssel

Dies funktioniert für mich und meine Skripte, viel Glück für Sie vermeiden .

+0

Vielen Dank, es hat wirklich den Tag gerettet. Aber wofür ist die letzte Zeile 'IdentityFile'? Es scheint ohne zu funktionieren. – supersan

6

Diese Warnung wird aufgrund der Sicherheitsfunktionen ausgegeben. Deaktivieren Sie diese Funktion nicht.

Es wird nur einmal angezeigt.

Wenn es immer noch nach der zweiten Verbindung erscheint, liegt das Problem wahrscheinlich in der Datei known_hosts. In diesem Fall werden Sie auch die folgende Meldung erhalten:

Failed to add the host to the list of known hosts 

Sie es beheben kann, indem Besitzer die Berechtigungen der Datei ändern, indem Sie Ihre Benutzer beschreibbar zu sein.

sudo chown -v $USER ~/.ssh/known_hosts 
1

Tun Sie dies -> chmod + w ~/.ssh/known_hosts Diese Erlaubnis bei ~/in die Datei .ssh/known_hosts fügt schreiben.Danach wird der Remote-Host zur Datei "known_hosts" hinzugefügt, wenn Sie das nächste Mal eine Verbindung herstellen.

+0

Das hat meinen Fall gelöst, danke! –

4

Mit Bezug auf Coris Antwort, habe ich es geändert und unten Befehl verwendet, der funktioniert. Ohne exit wurde verbleibenden Befehl Anmeldung tatsächlich zu Remote-Rechner, die ich nicht in Skript Idealer

ssh -o StrictHostKeyChecking=no [email protected]_of_remote_machine "exit" 
1

wollten, sollten Sie eine selbstverwaltete Zertifizierungsstelle erstellen. Beginnen Sie mit einem Schlüsselpaar zu erzeugen: ssh-keygen -f cert_signer

Dann meldet jeden öffentlichen Host-Schlüssel des Servers: ssh-keygen -s cert_signer -I cert_signer -h -n www.example.com -V +52w /etc/ssh/ssh_host_rsa_key.pub

Dies erzeugt ein signierter öffentlicher Host-Schlüssel: /etc/ssh/ssh_host_rsa_key-cert.pub

In /etc/ssh/sshd_config weist die HostCertificate auf diese Datei : HostCertificate /etc/ssh/ssh_host_rsa_key-cert.pub

Starten Sie den Dienst sshd erneut: service sshd restart

dann auf dem SSH-Client die folgenden ~/.ssh/known_hosts hinzufügen: @cert-authority *.example.com ssh-rsa AAAAB3Nz...cYwy+1Y2u/

Die oben enthält:

  • @cert-authority
  • Die Domain *.example.com
  • Der vollständige Inhalt des öffentlichen Schlüssels cert_signer.pub

Der öffentliche Schlüssel cert_signer vertraut jedem Server, dessen öffentlicher Hostschlüssel vom privaten Schlüssel cert_signer signiert wurde.

Obwohl dies eine einmalige Konfiguration auf der Clientseite erfordert, können Sie mehreren Servern vertrauen, einschließlich solchen, die noch nicht bereitgestellt wurden (solange Sie jeden Server signieren).

Weitere Einzelheiten finden Sie unter this wiki page.

Verwandte Themen