web-dev-qa-db-fra.com

Comment éditer known_hosts lorsque plusieurs hôtes partagent les mêmes noms IP et DNS?

Je ssh régulièrement sur 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 adresses IP et DNS. Supposons que l'IP est 192.168.0.9 et que les noms sont hostname et hostname.domainname

Autant que je sache, la solution pour pouvoir se connecter aux deux hôtes consiste à les ajouter tous les deux au fichier ~/.ssh/know_hosts. Cependant, c'est plus facile à dire qu'à faire, car le fichier est haché et contient probablement plusieurs entrées par hôte (192.168.0.9, hostname, hostname.domainname). En conséquence, 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 d’éditer le fichier known_hosts 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 permettrait de me connecter de manière transparente à cet ordinateur avec ssh, peu importe que je l’appelle 192.168.0.9, hostname ou hostname.domainname, qu’elle utilise sa clé d’hôte Linux ou sa clé d’hôte OSX. Cependant, je souhaite quand même recevoir un avertissement s’il ya une véritable attaque de type homme du milieu , c’est-à-dire si une autre clé est utilisée.

26

La solution la plus simple consiste simplement à utiliser les mêmes clés d’hôte pour Linux et OS X. En d’autres termes, choisissez un ensemble de fichiers /etc/ssh/ssh_Host_*_key* 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 sous lequel vous avez démarré, et le client SSH n'en sera pas plus sage.

12
jjlin

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 obtenez deux clés identiques Host, et SSH acceptera soit.

(Vous pouvez également utiliser ssh-keygen -H -F <hostname> pour rechercher dans votre fichier known_hosts des lignes qui correspondent à ce nom d'hôte. L'exécution de cette opération après la copie de la ligne supprimée devrait 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.

26
DaCheetah

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

Source: https://stackoverflow.com/questions/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 "yes", 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 été modifiée en raison d’une usurpation de contenu 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 nom d'hôte réel 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 la mise en tunnel de connexions SSH ou pour plusieurs serveurs s'exécutant sur un même 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
9
Rhyuk

Je ne rencontre pas ce problème lorsque je me connecte à plusieurs boîtiers VPS partageant la même adresse IP, car chacun possède un port SSH différent (20022,30022, etc.). Ils sont donc enregistrés comme hôtes connus avec des clés différentes.

Cela pourrait-il être une solution de contournement pour vous?

2
Pyheme

Le moyen le plus simple de résoudre votre problème consiste à attribuer à chaque hôte une adresse IP propre/distincte. Avec 253 adresses disponibles dans votre réseau (privé) et IPv4, cela ne devrait pas poser de problème. Donnez-leur des adresses IP fixes (car un serveur DHCP identifierait la machine en fonction de l'adresse MAC de la carte réseau et les deux obtiendraient la même adresse). Je ne vois pas d'autre solution si vous souhaitez conserver les mesures de sécurité (que je ne lâcherais pas pour ce "confort" non plus).

2
Izzy

Puisque vous voulez conserver la vérification stricte de la clé de l'hôte, je leur demanderais d'utiliser des fichiers known_hosts différents. Pour ce faire, configurez votre fichier ~/.ssh/config (ou le fichier /etc/ssh/ssh_config si vous avez besoin que cela fonctionne sur plusieurs comptes d'utilisateurs locaux) comme suit:

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 $REALHOSTNAME par le nom d’hôte ou l’adresse IP réelle, bien sûr. (Peu importe ce que vous choisissez, aussi longtemps que vous choisissez quelque chose après "nom d'hôte" qui résoudrait en adresse IP, mais j'utiliserais le nom d'hôte plutôt qu'une adresse IP, uniquement sur des principes généraux.)

Alors ssh myserver.linux et ssh myserver.osx peuvent donc avoir différentes clés d’hôte, mais vous obtenez toujours la vérification. Si c'est Linux qui est en place et que vous tapez OS X (ou vice versa), vous recevrez l'avertissement (qui, je crois, est l'effet recherché).

Si j'avais ce problème, je m'assurerais qu'il y a quelque chose de complètement faux dans le fichier known_hosts principal qui ne correspond à aucun des deux. Ainsi, si vous tapez $REALHOSTNAME au lieu de myserver.osx, vous recevez l'avertissement. :-) Je le ferais en mettant quelque chose comme

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

dans mon /etc/hosts, puis en faisant un ssh $REALHOSTNAME et en acceptant la nouvelle clé, puis en retirant cette entrée.

1
Jim

Un autre article qui décrit plusieurs manières de traiter votre problème:

La deuxième méthode utilise deux paramètres openSSH: StrictHostKeyCheckin et UserKnownHostsFile. Cette méthode aide SSH en la configurant pour utiliser un fichier known_hosts vide et non pour vous demander de confirmer la clé d'identité de l'hôte distant.

1
afk