Comment modifier les hôtes connus lorsque plusieurs hôtes partagent le même nom IP et DNS?

29

Je ssh régulièrement dans un ordinateur qui est un ordinateur OS X / Linux à double démarrage. Les deux instances de système d'exploitation ne partagent pas la même clé d'hôte, elles peuvent donc être considérées comme deux hôtes partageant les mêmes IP et DNS. Disons que l'IP est 192.168.0.9, et les noms sont hostnameethostname.domainname

D'après ce que j'ai compris, la solution pour pouvoir se connecter aux deux hôtes est de les ajouter tous les deux au ~/.ssh/know_hostsfichier. Cependant, il est plus facile à dire qu'à faire, car le fichier est haché, et a probablement plusieurs entrées par hôte ( 192.168.0.9, hostname, hostname.domainname). Par conséquent, j'ai l'avertissement suivant

Warning: the ECDSA host key for 'hostname' differs from the key for the IP address '192.168.0.9'

Existe-t-il un moyen simple de modifier le known_hostsfichier, tout en conservant les hachages. Par exemple, comment trouver les lignes correspondant à un nom d'hôte donné? Comment puis-je générer les hachages pour certains hôtes connus?

La solution idéale me permettra de vous connecter à toute transparence à cet ordinateur avec ssh, peu importe si je l' appelle 192.168.0.9, hostnameou hostname.domainname, ni si elle utilise son hostkey Linux ou OSX son hostkey. Cependant, je veux toujours recevoir un avertissement s'il y a une véritable attaque de l'homme du milieu, c'est -à- dire si une autre clé que ces deux-là est utilisée.

Frédéric Grosshans
la source
Qu'est-ce que tu veux faire? L'éditer pour quoi?
Rhyuk
@Rhyuk: Modifiez-le pour pouvoir reconnaître comme valides à la fois l'OSX et la clé d'hôte linux pour l'adresse IP, le nom d'hôte et le nom d'hôte.nom de domaine.
Frédéric Grosshans
@ Rhyuk: J'ai édité la question. Est-ce plus clair maintenant?
Frédéric Grosshans
2
Avez-vous simplement envisagé de faire en sorte que les deux installations aient la même clé?
Zoredache
3
Il y a quelques cas où il est raisonnable d'utiliser une adresse IP pour accéder à plusieurs entités (chacune avec des clés d'hôte SSH individuelles) et de maintenir un contrôle strict selon lequel SEULEMENT ces clés d'hôte sont celles vues par le client SSH. Par exemple, certaines configurations à haute disponibilité où un cluster d'unités est accessible à l'aide d'une adresse IP partagée mais où (pour une raison quelconque) la clé d'hôte SSH vue par les clients change en fonction de l'unité de cluster qui est actuellement active. Un autre cas est lorsque plusieurs hôtes SSH sont derrière un pare-feu NAT et accessibles de l'extérieur, ils semblent tous avoir la même IP.
IllvilJa

Réponses:

12

La solution la plus simple ici consiste simplement à utiliser les mêmes clés d'hôte pour Linux et OS X. Autrement dit, choisissez un ensemble de /etc/ssh/ssh_host_*_key*fichiers et copiez-les sur l'autre système d'exploitation. Ensuite, la même clé d'hôte sera présentée à un client SSH quel que soit le système d'exploitation dans lequel vous avez démarré, et le client SSH ne sera pas le plus sage.

jjlin
la source
Je préfère une version client, mais je vais essayer celle-ci si je n'en trouve pas. Soit dit en passant, la localisation OSX (non standard) des fichiers ne l'est /private/etc/ssh_host*pas /etc/ssh/ssh_host*.
Frédéric Grosshans
La copie des fichiers d'une machine à une autre (deux machines Linux) n'a pas fonctionné pour moi. Bien que le contenu du fichier soit identique, le hachage ne l'était pas, donc j'ai toujours eu le problème (peut-être le temps de modification?) La solution ci-dessous est bien meilleure.
Stav
sshdcharge les clés d'hôte une fois au démarrage, vous devrez donc probablement redémarrer sshd. J'ajouterai cela à la réponse. Quant aux autres solutions étant meilleures, cela dépend de votre situation. Je dirais que les principaux avantages de cette méthode est qu'elle ne nécessite qu'une configuration unique et qu'elle est plus susceptible de fonctionner avec plusieurs implémentations client SSH.
jjlin
Curieusement, il semble que mon OpenSSH 7.4p1 relativement récent sshdcharge les clés d'hôte à chaque nouvelle connexion. C'est peut-être ainsi depuis longtemps et je supposais simplement que les clés d'hôte étaient traitées comme les autres sshdconfigurations. Quoi qu'il en soit, cela peut ou non être votre problème.
jjlin
Serait-ce une mauvaise idée de faire cela à deux hôtes d'un cluster qui partagent la même adresse VRRP? En cas de basculement, l'hôte qui répond sera différent. Je ne voudrais pas recevoir l'avertissement.
Colin 't Hart
26

Comme @Izzy l'a suggéré dans un commentaire ci-dessus, ssh vous indique la ligne incriminée, et en supprimant cette ligne, (en l'enregistrant ailleurs), en acceptant la nouvelle clé, puis en recopiant la ligne supprimée, vous vous retrouvez avec deux clés pour la même host et ssh acceptera l'un ou l'autre.

(Vous pouvez également utiliser ssh-keygen -H -F <hostname>pour rechercher des lignes dans votre fichier known_hosts qui correspondent à ce nom d'hôte. L'exécution de cette opération après avoir recopié la ligne supprimée doit répertorier deux entrées.)

Si quelqu'un sait comment faire en sorte que PuTTY fasse la même chose, je serais très intéressé d'en entendre parler.

DaCheetah
la source
4
En fait, si vous avez un client Linux, vous n'avez même pas besoin de supprimer la ligne incriminée, il vous suffit de la commenter avec un caractère de hachage ('#') à l'avant. Ensuite, une fois que vous avez accepté la nouvelle clé, vous pouvez simplement modifier le fichier known_hosts et décommenter la ligne avec l'ancienne clé. Mais oui, cela serait également utile dans Putty.
IllvilJa
1
S'il y a deux hôtes avec le même nom, mais une adresse IP et une clé d'hôte différentes, cette solution de contournement fonctionne également: commentez (ou supprimez temporairement) puis les deux lignes pour cet hôte (celle basée sur l'adresse IP et celle basée sur l'hôte) nom), connectez-vous à l'hôte non encore connu, puis ajoutez à nouveau les lignes qui ont été mises en commentaire ou supprimées.
Kai Petzke
13

J'ai trouvé cela qui peut vous aider avec ce que vous voulez réaliser.

Source: /programming/733753/how-to-handle-ssh-host-key-verification-with-2-different-hosts-on-the-same-but

Créez un fichier de configuration dans votre répertoire .ssh comme suit:

Host server1
  Hostname x1.example.com
  HostKeyAlias server1
  CheckHostIP no
  Port 22001
  User karl

Host server2
  Hostname x2.example.com
  HostKeyAlias server2
  CheckHostIP no
  Port 22002
  User karl

Explication ci-dessous (de man ssh_config)

CheckHostIP

Si cet indicateur est défini sur "oui", ssh (1) vérifiera en outre l'adresse IP de l'hôte dans le fichier known_hosts. Cela permet à ssh de détecter si une clé d'hôte a changé en raison d'une usurpation DNS. Si l'option est définie sur "non", la vérification ne sera pas exécutée. La valeur par défaut est "oui".

HostKeyAlias

Spécifie un alias à utiliser à la place du vrai nom d'hôte lors de la recherche ou de l'enregistrement de la clé d'hôte dans les fichiers de base de données de clés d'hôte. Cette option est utile pour tunneliser les connexions SSH ou pour plusieurs serveurs exécutés sur un seul hôte.

La ligne Nom d'utilisateur et Port vous évite d'avoir à donner ces options sur la ligne de commande, vous pouvez donc simplement utiliser:

% ssh server1
% ssh server2
Rhyuk
la source
J'ai vu cet article, mais il ne correspond pas à mon cas: les deux serveurs se distinguent par le numéro de port dans l'article, pas dans mon cas. De plus, je voudrais garder les couches de sécurité supplémentaires apportées par les hachages salés dans known_hostset CheckHostIP.
Frédéric Grosshans
1
@ FrédéricGrosshans, je vérifie vérifié. Vous n'avez pas besoin d'avoir des ports séparés, et l'option HashKnownHosts fonctionne correctement avec HostKeyAlias.
Zoredache
L'inconvénient, à moins que je ne me trompe, est que cela est configuré sur une base par client vs que la réponse acceptée est configurée uniquement sur les serveurs SSH accepteurs.
FreeSoftwareServers
2

La façon la plus simple de résoudre votre problème est de donner à chaque hôte une adresse IP propre / distincte. Avec 253 adresses disponibles dans votre réseau (privé) et IPv4, cela ne devrait pas être un problème. Donnez-leur des adresses IP fixes (car un serveur DHCP identifierait la machine en fonction de l'adresse MAC des cartes réseau, et les deux obtiendraient la même adresse). Je ne vois pas d'autre solution si vous voulez garder les mesures de sécurité (que je ne laisserais pas pour ce petit "confort" non plus).

Izzy
la source
En fait, l'adresse IP n'est pas 192.168.0.xxet n'est pas privée. C'est une «vraie» adresse IPv4, donnée par mon université que je ne suis pas libre de changer.
Frédéric Grosshans
Si vous vérifiez avec Wikipedia , vous verrez 192.168.0.0 - 192.168.255.255 (votre question spécifiée 192.168.0.9, qui se situe dans cette plage) appartient aux "espaces d'adressage IPv4 privés". Donc, par "privé", je ne parlais pas de "propriétaire", mais des spécifications de l' IETF . Dans votre question, vous n'avez pas indiqué que vous ne pouvez pas modifier l'adresse IP, désolé - mais avec les données fournies, ma réponse était appropriée.
Izzy
Désolé pour la question mal formulée. Je n'ai pas downvote.
Frédéric Grosshans
Aucun problème, et tnx pour m'avoir fait savoir - rend le downvote moins décourageant. Mais une autre idée: je ne sais pas d'où le fichier known_hosts prend le nom d'hôte, DNS inversé ou proposé par le client. Vous pouvez essayer de renommer l'un de vos "hôtes" afin qu'il présente un nom d'hôte différent. Ou pour avoir les deux clés d'hôte ajoutées: ssh vous indique la "ligne incriminée" dans votre fichier known_hosts (lorsque # 1 est contenu et que vous vous connectez avec # 2). Vous pouvez donc copier cette ligne dans un autre fichier, la supprimer des hôtes connus, laisser la connexion n ° 2 et ajouter sa ligne, puis rajouter la ligne supprimée. Je ne sais pas si cela fonctionne, mais vous pouvez essayer.
Izzy
2

Je ne rencontre pas ce problème lors de la connexion à diverses boîtes VPS partageant la même IP, car chacune a un port SSH différent (20022,30022, etc.), elles sont donc enregistrées en tant qu'hôtes connus avec des clés différentes.

Serait-ce une solution de contournement pour vous?

Pyheme
la source
Salut @Pyheme, bienvenue sur Super User! Notez que cette question a presque 4 ans. Il n'y a rien de mal à y répondre, mais gardez à l'esprit qu'il est possible que vous n'obteniez pas de réponse.
Hewbot
Je n'ai plus de machine OS X, mais votre réponse pourrait être utile à quelqu'un d'autre. C'est tout l'intérêt de l'échange de pile
Frédéric Grosshans
@Hewbot ... en effet, je le vois maintenant. Je ne sais pas pourquoi, il est apparu dans la liste des questions récentes ...
Pyheme
1

Un autre article , qui décrit plusieurs façons de gérer votre problème:

La deuxième méthode utilise deux paramètres openSSH:, StrictHostKeyCheckinet UserKnownHostsFile. Cette méthode trompe SSH en le configurant pour utiliser un fichier empty_hosts vide et NON pour vous demander de confirmer la clé d'identité de l'hôte distant.

afk
la source
Ce document vise à interdire la vérification des clés. Je veux garder la vérification des clés, et je ne veux pas la refuser à chaque hostnameredémarrage dans Linut ou OSX
Frédéric Grosshans
1
Bienvenue sur Super User! Bien que cela puisse théoriquement répondre à la question, il serait préférable d'inclure ici les parties essentielles de la réponse et de fournir le lien de référence. J'ai inclus une courte partie, mais ce n'est peut-être pas ce que vous vouliez ...
Tamara Wijsman
1

Puisque vous voulez garder la vérification stricte de la clé hôte, je leur demanderais d'utiliser des known_hostsfichiers différents . Pour ce faire, configurez votre ~/.ssh/configfichier (ou le /etc/ssh/ssh_configfichier si vous en avez besoin pour travailler sur plusieurs comptes d'utilisateurs locaux) comme ceci:

Host myserver.osx
  UserKnownHostsFile ~/.ssh/known_hosts.dual.osx
  # default is ~/.ssh/known_hosts
  Hostname $REALHOSTNAME

Host myserver.linux
  UserKnownHostsFile ~/.ssh/known_hosts.dual.linux
  Hostname $REALHOSTNAME

, en remplaçant $REALHOSTNAMEpar le nom d'hôte ou l'adresse IP réelle, bien sûr. (Peu importe ce que vous choisissez, tant que vous choisissez quelque chose après "Hostname" qui résoudrait en adresse IP, mais j'utiliserais le nom d'hôte de préférence à une adresse IP, juste sur des principes généraux.)

Ensuite, ssh myserver.linuxet ssh myserver.osxpeut donc avoir différentes clés d'hôte, mais vous obtenez toujours la vérification. Si c'est Linux qui fonctionne et que vous tapez OS X (ou vice versa), vous obtiendrez l'avertissement (qui, je crois, est l'effet souhaité).

Si j'avais ce problème, je m'assurerais qu'il y avait quelque chose de complètement faux dans le known_hostsfichier principal qui ne correspond à aucun des deux, de sorte que si vous tapez $REALHOSTNAMEau lieu de myserver.osxvous obtenez l'avertissement. :-) Je ferais ça en mettant quelque chose comme

<ip-address-of-github.com> $REALHOSTNAME

dans mon /etc/hosts, puis faire un ssh $REALHOSTNAMEet accepter la nouvelle clé, puis retirer cette entrée.

Jim
la source