SSH: Akzeptiert automatisch Schlüssel

218

Ich habe dieses kleine Hilfsprogramm geschrieben:

for h in $SERVER_LIST; do ssh $h "uptime"; done

Wenn ein neuer Server hinzugefügt wird, $SERVER_LISTwird das Skript gestoppt mit:

The authenticity of host 'blah.blah.blah (10.10.10.10)' can't be established.
RSA key fingerprint is a4:d9:a4:d9:a4:d9a4:d9:a4:d9a4:d9a4:d9a4:d9a4:d9a4:d9.
Are you sure you want to continue connecting (yes/no)?

Ich habe versucht yes:

for h in $SERVER_LIST; do yes | ssh $h "uptime"; done

ohne glück.

Gibt es eine Möglichkeit, sshdie automatische Annahme eines neuen Schlüssels zu parametrisieren ?

Adam Matan
quelle
6
Lekensteyns Antwort ist exzellent und korrekt, aber ich wollte nur erwähnen, dass ssh "yes" erwartet und yes"y" ausgibt , sodass Sie möglicherweise mehr Glück damit hatten for h in $SERVER_LIST; do yes yes | ssh $h "uptime"; done(beachten Sie das zusätzliche Ja, das ja sagt, was zu sagen ist, anstatt "y" ").
Chazomaticus

Antworten:

240

Verwenden Sie die Option StrictHostKeyChecking, zum Beispiel:

ssh -oStrictHostKeyChecking=no $h uptime

Diese Option kann auch zu ~ / .ssh / config hinzugefügt werden, zB:

Host somehost
    Hostname 10.0.0.1
    StrictHostKeyChecking no

Beachten Sie, dass Sie trotz dieser Option eine Warnung erhalten, wenn sich die Host-Schlüssel geändert haben:

$ ssh -oStrictHostKeyChecking=no somehost uptime
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
31:6f:2a:d5:76:c3:1e:74:f7:73:2f:96:16:12:e0:d8.
Please contact your system administrator.
Add correct host key in /home/peter/.ssh/known_hosts to get rid of this message.
Offending RSA key in /home/peter/.ssh/known_hosts:24
  remove with: ssh-keygen -f "/home/peter/.ssh/known_hosts" -R 10.0.0.1
Password authentication is disabled to avoid man-in-the-middle attacks.
Keyboard-interactive authentication is disabled to avoid man-in-the-middle attacks.
ash: uptime: not found

Wenn Ihre Hosts nicht häufig neu installiert werden, können Sie dies mit der -oUserKnownHostsFile=/dev/nullOption weniger sicher machen (aber für häufig wechselnde Hostschlüssel bequemer) . Dadurch werden alle empfangenen Host-Schlüssel verworfen, sodass die Warnung nie generiert wird.


Mit 18.04, gibt es eine neue Möglichkeit: StrictHostKeyChecking=accept-new. Von man 5 ssh_config:

If this flag is set to accept-new then ssh will automatically
add new host keys to the user known hosts files, but will not
permit connections to hosts with changed host keys.  If this flag
is set to no or off”, ssh will automatically add new host keys
to the user known hosts files and allow connections to hosts with
changed hostkeys to proceed, subject to some restrictions.
Lekensteyn
quelle
10
Dies ist nicht die beste Lösung, da die integrierten Sicherheitstools umgangen werden. ssh-keyscanist vorzuziehen, wenn es auf Ihrem System verfügbar ist.
Stefan Lasiewski
2
@StefanLasiewski Ermöglicht Man-in-the-Middle-Angriffen, wenn Sie sich in nicht vertrauenswürdigen Netzwerken befinden. Um neue Schlüssel für feste Hosts zu akzeptieren, ist der ssh-keyscanAnsatz vernünftiger. Für lokale virtuelle Maschinen und andere Hosts in vertrauenswürdigen Netzwerken mit dynamischen / wiederverwendeten IP-Adressen ist der beschriebene Ansatz ausreichend.
Lekensteyn
8
Nur um den Unterschied zwischen den beiden Lösungen zu verdeutlichen: Die ssh-keyscanLösung ist nur dann für einen Man-in-the-Middle-Angriff anfällig, wenn ssh-keyscansie einmal ausgeführt wird. Die -oStrictHostKeyChecking=noLösung ist bei jeder sshAusführung anfällig für Man-in-the-Middle-Angriffe .
Erik Sjölund
121

Mit dem folgenden Befehl können Sie Ihren known_hosts den Fingerabdruck für einen Server hinzufügen

ssh-keyscan -H <ip-address> >> ~/.ssh/known_hosts
ssh-keyscan -H <hostname> >> ~/.ssh/known_hosts

HINWEIS: Ersetzen Sie <IP-Adresse> und <Hostname> durch die IP-Adresse und den DNS-Namen des Servers, den Sie hinzufügen möchten.

Das einzige Problem dabei ist, dass Sie zweimal mit einigen Servern in Ihren known_hosts enden werden. Es ist nicht wirklich eine große Sache, nur zu erwähnen. Um sicherzustellen, dass keine Duplikate vorhanden sind, können Sie zuerst alle Server entfernen, indem Sie Folgendes ausführen:

ssh-keygen -R <ip-address>
ssh-keygen -R <hostname>

So könnten Sie laufen:

for h in $SERVER_LIST; do
    ip=$(dig +search +short $h)
    ssh-keygen -R $h
    ssh-keygen -R $ip
    ssh-keyscan -H $ip >> ~/.ssh/known_hosts
    ssh-keyscan -H $h >> ~/.ssh/known_hosts
done

Eine Sache, die Sie beim Entfernen beachten sollten, nur um sie erneut hinzuzufügen, ist, dass Sie im Wesentlichen die Sicherheit der Überprüfung des Fingerabdrucks aufheben. Sie möchten dieses Skript also definitiv nicht vor jeder Ausführung Ihres Dienstprogrammskripts ausführen.

mhost
quelle
1
läuft es durch sort | Uniq und das anschließende Suchen nach doppelten Hosts mit awk after würde das Skript in die Lage versetzen, geänderte Hosts zu erkennen und Benutzer nur vor diesen zu warnen, da derselbe Host mit unterschiedlichen Schlüsseln Probleme verursachen könnte
Lennart Rolland,
2
Möglicherweise möchten Sie eine Notiz hinzufügen, in der -HHostnamen und Adressen gehasht werden.
David Cullen
25

Ich bin mit dieser Antwort etwas spät dran, aber der vernünftige Weg wäre, einen SSH-Keyscan auf der neuen Maschine durchzuführen, bevor Sie die Uptime-Erfassung starten.

ssh-keyscan  <newhost> >> ~/.ssh/known_hosts

Das Deaktivieren der Plausibilitätsprüfung klingt nach einem schlechten Plan, auch wenn Sie der Meinung sind, dass Sie die vollständige Kontrolle über die Umgebung haben.

basteln
quelle
Das Ausführen des obigen Befehls und das Nicht-Überprüfen der Host-Schlüssel auf Fingerabdrücke, die Sie außerhalb des Bandes StrictHostKeyChecking no
erfasst haben
3
@code_monk: nein, das ist es nicht. Ich eröffne eine einmalige Möglichkeit für einen Fehler (Akzeptieren eines Schlüssels von einem falschen Host, um zu bekannten Hosts hinzugefügt zu werden). StrictHostKeyChecking no ermöglicht das wiederholte Akzeptieren für andere Computer.
Tink
0

Um eine Liste von Servern automatisch hinzuzufügen, können wir Folgendes tun:

Fügen Sie die IP-Adresse des Servers in die Dateiserverliste ein

Die IPs sollten im folgenden Format hinzugefügt werden.

Ausgabe von cat servers-list

123.1.2.3
124.1.2.4
123.1.2.5

Ändern Sie die obigen IP-Adressen, indem Sie Ihre ersetzen.

Der folgende Befehl fügt alle Server aus der Liste hinzu.

ssh-keyscan -p61 -H "`cat servers-list`" >> ~/.ssh/known_hosts
Waqas Khan
quelle