Hier ist meine Situation: Ich richte ein Test-Harness ein, das von einem zentralen Client aus eine Reihe von Instanzen virtueller Maschinen startet und dann Befehle über diese ausführt ssh
. Die virtuellen Maschinen haben zuvor nicht verwendete Hostnamen und IP-Adressen, sodass sie nicht in der ~/.ssh/known_hosts
Datei auf dem zentralen Client enthalten sind.
Das Problem, das ich habe, ist, dass der erste ssh
Befehl, der für eine neue virtuelle Instanz ausgeführt wird, immer eine interaktive Eingabeaufforderung enthält:
The authenticity of host '[hostname] ([IP address])' can't be established.
RSA key fingerprint is [key fingerprint].
Are you sure you want to continue connecting (yes/no)?
Gibt es eine Möglichkeit, dies zu umgehen und den neuen Host dem Clientcomputer bereits bekannt zu machen, indem ich möglicherweise einen öffentlichen Schlüssel verwende, der bereits in das Image der virtuellen Maschine eingebrannt ist? Ich möchte wirklich vermeiden, Expect oder was auch immer verwenden zu müssen, um die interaktive Eingabeaufforderung zu beantworten, wenn ich kann.
quelle
Antworten:
Setzen Sie die
StrictHostKeyChecking
Optionno
entweder in der Konfigurationsdatei oder über-o
:ssh -o StrictHostKeyChecking=no [email protected]
quelle
Warning: Permanently added 'hostname,1.2.3.4' (RSA) to the list of known hosts.
Um die Warnung zu vermeiden und um zu verhindern, dass der Eintrag zu einer bekannten_Hosts-Datei hinzugefügt wird, mache ich Folgendes:ssh -o StrictHostKeyChecking=no -o LogLevel=ERROR -o UserKnownHostsFile=/dev/null [email protected]
IMO, der beste Weg, dies zu tun, ist der folgende:
Dies stellt sicher, dass es keine doppelten Einträge gibt, dass Sie sowohl für den Hostnamen als auch für die IP-Adresse geschützt sind, und dass die Ausgabe als zusätzliche Sicherheitsmaßnahme gehasht wird.
quelle
ssh-keyscan
scheiterten, weil mein Zielhost den Standardschlüsseltyp der Version 1 nicht unterstützt. Das Hinzufügen-t rsa,dsa
zum Befehl behebt dies.ssh-keygen -F [address]
stattdessen den Rückgabestatus von . medium.com/@wblankenship/…Für die Faulen:
-H hasht den Hostnamen / die IP-Adresse
quelle
Wie bereits erwähnt, ist die Verwendung des Tastenscans die richtige und unauffällige Methode.
Mit dem obigen Befehl können Sie einen Host nur dann hinzufügen, wenn er noch nicht hinzugefügt wurde. Es ist auch nicht gleichzeitig sicher; Sie dürfen das Snippet nicht mehr als einmal gleichzeitig auf demselben Ursprungscomputer ausführen, da die Datei tmp_hosts verstopfen kann, was letztendlich dazu führt, dass die Datei known_hosts aufgebläht wird ...
quelle
ssh-keyscan
? Der Grund ist, dass es einige Zeit und zusätzliche Netzwerkverbindung erfordert.cat ~/.ssh/tmp_hosts > ~/.ssh/known_hosts
, aber eine nachfolgende Bearbeitung änderte sie in>>
. Verwenden>>
ist ein Fehler. Es überwindet den Zweck der Eindeutigkeit in der ersten Zeile und bewirkt, dass beiknown_hosts
jeder Ausführung neue Einträge abgelegt werden. (Mit dem
ssh-keyscan
Befehl können Sie den öffentlichen Schlüssel abrufen und an Ihreknown_hosts
Datei anhängen .quelle
So kannst du ssh-keyscan in dein Spiel integrieren:
quelle
Dies wäre eine vollständige Lösung, bei der der Host-Schlüssel nur zum ersten Mal akzeptiert wird
quelle
Ich hatte ein ähnliches Problem und stellte fest, dass einige der angegebenen Antworten mich nur teilweise zu einer automatisierten Lösung führten. Folgendes habe ich letztendlich benutzt, hoffe es hilft:
Es fügt den Schlüssel hinzu
known_hosts
und fordert nicht zur Eingabe des Kennworts auf.quelle
Also suchte ich nach einem einfachen Weg, um die unbekannte manuelle Interaktion des Klonens eines Git-Repos zu umgehen, wie unten gezeigt:
Beachten Sie den Fingerabdruck des RSA-Schlüssels ...
Das ist also eine SSH-Sache, das funktioniert für Git über SSH und nur für SSH-bezogene Dinge im Allgemeinen ...
Installieren Sie zunächst nmap auf Ihrem täglichen Treiber. nmap ist sehr hilfreich für bestimmte Dinge, wie das Erkennen offener Ports und das manuelle Überprüfen von SSH-Fingerabdrücken. Aber zurück zu dem, was wir tun.
Gut. Entweder bin ich an den verschiedenen Stellen und Maschinen, die ich überprüft habe, kompromittiert - oder die plausibelere Erklärung dafür, dass alles gut gelaunt ist, ist das, was passiert.
Dieser 'Fingerabdruck' ist nur eine Zeichenfolge, die aus Gründen der menschlichen Bequemlichkeit mit einem Einwegalgorithmus verkürzt wurde, wobei das Risiko besteht, dass mehr als eine Zeichenfolge in den gleichen Fingerabdruck aufgelöst wird. Es kommt vor, sie werden Kollisionen genannt.
Unabhängig davon, zurück zur ursprünglichen Zeichenfolge, die wir unten im Kontext sehen können.
Wir haben also vorab die Möglichkeit, den ursprünglichen Gastgeber um eine Form der Identifizierung zu bitten.
Zu diesem Zeitpunkt sind wir manuell genauso anfällig wie automatisch - die Zeichenfolgen stimmen überein, wir haben die Basisdaten, die den Fingerabdruck erstellen, und wir könnten diese Basisdaten in Zukunft anfordern (um Kollisionen zu verhindern).
Verwenden Sie diese Zeichenfolge nun so, dass Sie nicht nach der Authentizität eines Hosts fragen müssen ...
Die Datei known_hosts verwendet in diesem Fall keine Klartexteinträge. Sie werden Hash-Einträge kennen, wenn Sie sie sehen. Sie sehen aus wie Hashes mit zufälligen Zeichen anstelle von xyz.com oder 123.45.67.89.
Die erste Kommentarzeile ist ärgerlich - aber Sie können sie mit einer einfachen Umleitung über die Konvention ">" oder ">>" entfernen.
Da ich mein Bestes getan habe, um unversehrte Daten zu erhalten, mit denen ein "Host" und eine Vertrauensstellung identifiziert werden können, füge ich diese Identifikation meiner Datei known_hosts in meinem ~ / .ssh-Verzeichnis hinzu. Da es nun als bekannter Host identifiziert wird, erhalte ich als Jugendlicher nicht die oben erwähnte Aufforderung.
Danke, dass du bei mir bleibst. Ich füge den Bitbucket-RSA-Schlüssel hinzu, damit ich dort im Rahmen eines CI-Workflows auf nicht interaktive Weise mit meinen Git-Repositorys interagieren kann, aber was auch immer Sie tun, was Sie wollen.
So bleibst du heute Jungfrau. Sie können dasselbe mit github tun, indem Sie in Ihrer Freizeit ähnlichen Anweisungen folgen.
Ich habe so viele Stapelüberlaufpfosten gesehen, die Sie angewiesen haben, den Schlüssel blind ohne Prüfung programmgesteuert hinzuzufügen. Je mehr Sie den Schlüssel von verschiedenen Computern in verschiedenen Netzwerken überprüfen, desto mehr Vertrauen können Sie in den Host haben, von dem er behauptet wird - und das ist das Beste, was Sie von dieser Sicherheitsebene erhoffen können.
FALSCH
ssh -oStrictHostKeyChecking = kein Hostname [Befehl]FALSCH
ssh-keyscan -t rsa -H Hostname >> ~ / .ssh / known_hostsTun Sie bitte keines der oben genannten Dinge. Sie haben die Möglichkeit, die Wahrscheinlichkeit zu erhöhen, dass nicht jemand Ihre Datenübertragungen abhört, wenn sich ein Mann in der Mitte des Angriffs befindet. Ergreifen Sie diese Gelegenheit. Der Unterschied besteht buchstäblich darin, dass der RSA-Schlüssel, über den Sie verfügen, der echte Server ist. Jetzt wissen Sie, wie Sie diese Informationen abrufen können, um sie zu vergleichen, damit Sie der Verbindung vertrauen können. Denken Sie daran, dass mehr Vergleiche von verschiedenen Computern und Netzwerken in der Regel Ihre Fähigkeit erhöhen, der Verbindung zu vertrauen.
quelle
Ich mache ein einzeiliges Skript, das ein bisschen lang, aber nützlich ist, um diese Aufgabe für Hosts mit mehreren IPs mithilfe von
dig
und durchzuführenbash
quelle
Folgendes vermeidet doppelte Einträge in ~ / .ssh / known_hosts:
quelle
mkdir -p ~/.ssh/known_hosts;
Wie bauen Sie diese Maschinen? Können Sie ein DNS-Update-Skript ausführen? können Sie einer IPA-Domain beitreten?
FreeIPA erledigt dies automatisch, aber im Wesentlichen benötigen Sie nur SSHFP- DNS-Einträge und DNSSEC in Ihrer Zone (FreeIPA bietet konfigurierbare Optionen an (DNSsec ist standardmäßig deaktiviert)).
Sie können die vorhandenen SSHFP-Einträge von Ihrem Host abrufen, indem Sie ausführen.
ssh-keygen -r jersey.jacobdevans.com
Sobald sie veröffentlicht sind, fügen Sie
VerifyHostKeyDNS yes
sie Ihrer ssh_config oder ~ / .ssh / config hinzuWenn / Wenn Google beschließt, DNSSEC zu aktivieren, können Sie ohne eine Hostkey-Eingabeaufforderung sshin.
ssh jersey.jacobdevans.com
ABER meine Domain ist noch nicht signiert, also siehst du jetzt ...
quelle
Um dies richtig zu machen, müssen Sie die öffentlichen Host-Schlüssel der VMs beim Erstellen sammeln und in einer Datei im
known_hosts
Format ablegen. Anschließend können Sie mit dem-o GlobalKnownHostsFile=...
Verweis auf diese Datei sicherstellen, dass Sie eine Verbindung zu dem Host herstellen, zu dem Sie eine Verbindung herstellen möchten. Wie Sie dies tun, hängt jedoch davon ab, wie Sie die virtuellen Maschinen einrichten. Möglicherweise reicht es jedoch aus, wenn Sie sie aus dem virtuellen Dateisystem auslesen oder den Host dazu bringen, den Inhalt/etc/ssh/ssh_host_rsa_key.pub
während der Konfiguration auszudrucken .Das lohnt sich jedoch möglicherweise nicht, je nachdem, in welcher Umgebung Sie arbeiten und wer Ihre voraussichtlichen Gegner sind. Ein einfaches "Speichern beim ersten Verbinden" (über einen Scan oder einfach während der ersten "echten" Verbindung), wie in mehreren anderen Antworten oben beschrieben, kann erheblich einfacher sein und dennoch ein gewisses Maß an Sicherheit bieten. Wenn Sie dies jedoch tun, empfehle ich Ihnen dringend, die vom Benutzer bekannte Hosts-Datei (
-o UserKnownHostsFile=...
) in eine Datei zu ändern, die für diese bestimmte Testinstallation spezifisch ist. Auf diese Weise wird vermieden, dass Ihre persönliche bekannte Hosts-Datei mit Testinformationen verunreinigt wird, und es wird einfacher, die jetzt unbrauchbaren öffentlichen Schlüssel zu bereinigen, wenn Sie Ihre VMs löschen.quelle
Das ganze
Das Geschäft ärgerte mich immer wieder und ich entschied mich für
Ein Skript, das alle regiert
Dies ist eine Variante des Skripts unter https://askubuntu.com/a/949731/129227 und Amadu Bahs Antwort https://serverfault.com/a/858957/162693 in einer Schleife.
Beispielanruf
./sshcheck somedomain site1 site2 site3
Das Skript durchläuft die Namesites, ändert die Dateien .ssh / config und .ssh / known_hosts und führt auf Anfrage die ssh-copy-id aus. Bei der letzten Funktion können nur die ssh-Testaufrufe fehlschlagen, z. B. durch dreimaliges Drücken von die Passwortabfrage.
sshcheck script
quelle
Hier erfahren Sie, wie Sie eine Sammlung von Hosts erstellen
Definieren Sie eine Sammlung von Hosts
Definieren Sie anschließend zwei Aufgaben, um die Schlüssel zu bekannten Hosts hinzuzufügen:
quelle
Am besten überprüfen Sie den Fingerabdruck jedes neuen Servers / Hosts. Dies ist die einzige Möglichkeit, den Server zu authentifizieren. Ohne diese kann Ihre SSH-Verbindung einem Man-in-the-Middle-Angriff ausgesetzt sein .
Wenn Sie wirklich sicher sind, dass Sie die Überprüfung des Fingerabdrucks ignorieren möchten, verwenden Sie die zweitbeste, weniger sichere Option
StrictHostKeyChecking=accept-new
, die in OpenSSH Version 7.6 (2017-10-03) eingeführt wurde :Verwenden Sie nicht den alten Wert,
StrictHostKeyChecking=no
der niemals die Authentizität des Servers überprüft. (Die Bedeutung dieser=no
Einstellung wird jedoch bei einigen Veröffentlichungen später umgedreht .)quelle