SSH-Schlüsselüberprüfung für viele Hosts hinter einem einzigen DNS-Namen

1180
Mikey T.K.

(Anmerkung: Dies scheint einer bestehenden Frage ähnlich zu sein, aber ich glaube, es gibt einige Unterschiede in den Implementierungsdetails hier.)

Das Problem

Ich habe ein paar hundert Hosts hinter einer einzigen DNS-Adresse. Jeder Host verfügt über einen eigenen Host-Schlüssel (ich kann ihn nicht ändern - er wird vom Hersteller festgelegt und darf nicht geändert werden).

Wenn ich versuche, mit einem der Hosts ein zweites Mal eine Verbindung zu einem Host herzustellen, ist das verständlicherweise sshsehr verärgert:

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: POSSIBLE DNS SPOOFING DETECTED! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ The DSA host key for (hostname) has changed, and the key for the corresponding IP address 192.168.0.100 is unknown. This could either mean that DNS SPOOFING is happening or the IP address for the host and its host key have changed at the same time. @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ 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 DSA key sent by the remote host is SHA256:+38sJSsANknk6vVIHJ/l/xnPCl+ALCNrbi80vrr24cM. Please contact your system administrator. Add correct host key in /Users/me/.ssh/known_hosts to get rid of this message. Offending DSA key in /Users/me/.ssh/known_hosts:291 Password authentication is disabled to avoid man-in-the-middle attacks. Keyboard-interactive authentication is disabled to avoid man-in-the-middle attacks. X11 forwarding is disabled to avoid man-in-the-middle attacks. Permission denied (publickey,password,keyboard-interactive). 

Die Schwierigkeit

  • Ich kann nicht alle Host-Schlüssel auf dasselbe einstellen.
  • Das Herstellen einer Verbindung mit einer einzelnen IP-Adresse ist keine gute Lösung, da es sich hierbei nicht um eine echte "Round-Robin" handelt, sondern um einen DNS-Dienst, der von der Hardware bereitgestellt wird, die die Verbindung an den Server mit den geringsten Auslastung weiterleitet.
  • Meine Benutzer sowie einige automatisierte Prozesse müssen in der Lage sein, den einzelnen DNS-Namen zu treffen.

Die Frage

Was wäre die beste Vorgehensweise für diese Umgebung, um SSH sicher zu verwenden (dh mit so viel Verifizierung wie möglich)?

Ich möchte die Schlüsselüberprüfung aus Sicherheitsgründen nicht deaktivieren. Die offensichtliche Problemumgehung der Verbindung mit einer einzelnen IP-Adresse umgeht den Lastausgleich, der von der DNS-Implementierung des Herstellers bereitgestellt wird.

4
Haben Sie in Betracht gezogen, `GlobalKnownHostsFile` nur mit IP-Adressen zu erstellen, beispielsweise mit` ssh-keyscan` und deaktivieren Sie `UserKnownHostsFile` für die Verbindung zu diesem Hostnamen? Ich habe es nicht ausprobiert, aber es sollte mit IP zufrieden sein und wenn es nicht in der Lage ist, known_hosts record mit Hostnamen zu schreiben, sind Sie gut, nicht wahr? Jakuje vor 8 Jahren 0
Aha! Ich wusste gar nicht, dass es 'ssh-keyscan' gibt. Ein kurzer Blick auf die Manpage sieht so aus, als ob dies genau das ist, was ich brauche - ich kann die Schlüssel sammeln und die resultierende hosts-Datei an die Benutzer und Server verteilen, die sie benötigen. Wenn Sie dies zu einer Antwort machen, akzeptiere ich sie. Mikey T.K. vor 8 Jahren 0

1 Antwort auf die Frage

3
Jakuje

Sie können known_hostsfür alle Ihre IPs vorab generieren ssh-keyscan. Dann setzen Sie es auf Benutzersystemen als GlobalKnownHostsFile(readonly) und für das spezifische hostnameDeaktivieren UserKnownHostsFile(setzen auf /dev/null).

Ich habe es nicht ausprobiert, aber es sollte mit IP und zufrieden sein, wenn sie nicht in der Lage sein werden, zu schreiben, known_hostsmit einem Rekord hostname.

Beispiel Client /etc/ssh/ssh_config(auch gut zu verteilen):

[...] # other stuff Host dns_hostname GlobalKnownHostsFile /etc/ssh/known_hosts UserKnownHostsFile /dev/null