1 votes

SSH : Pourquoi dois-je revérifier l'empreinte digitale lorsque je me connecte au même serveur depuis un autre domaine ?

Dans ce qui suit, je parle du client OpenSSH installé par défaut sur Debian.

J'aimerais que plusieurs (sous-)domaines pointent vers mon ou mes serveurs (donc plusieurs par serveur), par exemple database.example.com, webserver.example.com, etc. Je veux cela parce que j'ai plusieurs serveurs et parfois je ne sais pas par cœur quel service fonctionne sur quel serveur. Je veux gérer cela par DNS en ayant un sous-domaine pour chaque service et ensuite je peux utiliser ce sous-domaine pour SSH dans le bon serveur sans avoir à me rappeler sur quel serveur le service est exécuté.

Le problème est que : L'empreinte digitale semble inclure le nom de domaine. Ainsi, si database.example.com et webserver.example.com pointent vers la même IP et que j'ai utilisé database.example.com et vérifié l'empreinte digitale (pour qu'elle soit ajoutée à known_hosts), je dois recommencer la vérification si je me connecte au serveur via webserver.example.com par la suite.

Je ne comprends pas pourquoi on utilise ici le domaine et non l'adresse IP vers laquelle le domaine se résout. Existe-t-il un moyen d'utiliser l'adresse IP au lieu du domaine dans l'empreinte digitale ? (peut-être une option de configuration).

Et si c'est le cas, cela peut-il poser un problème de sécurité ?

Et pourquoi est-ce qu'il est mis en œuvre de cette façon en premier lieu ? D'après ce que j'ai compris, l'empreinte digitale est dérivée de la clé publique du serveur, pour laquelle seul le serveur possède la clé privée correspondante. Alors pourquoi est-il même nécessaire d'inclure quoi que ce soit comme le domaine ou l'IP ? Cela ne m'empêche-t-il pas seulement de me connecter accidentellement à l'un de mes autres serveurs que j'ai sauvegardés dans known_hosts ?

Ajouter les clés de chaque sous-domaine que j'utilise pour me connecter à un serveur à known_hosts est l'option que je préfère le moins car c'est beaucoup plus de travail et invite à ignorer la vérification de la clé puisqu'on s'habitue au fait qu'elle demande si la clé est correcte plusieurs fois pour le même serveur.

Creo que ce poste est lié, mais il s'agit juste de dire que c'est traité de cette façon et non pas pourquoi et s'il y a un moyen de changer ce comportement.

Merci d'avance

Éditer : J'ai aussi trouvé ce poste qui suggère maintenant de désactiver StrictHostKeyChecking mais d'après ce que je comprends, cela permet de ssh-add toutes les empreintes digitales, ce qui, d'après ce que je comprends, est un problème du point de vue de la sécurité. Ce que je veux, c'est que, même si j'utilise le domaine pour me connecter au serveur, l'IP soit utilisée pour la vérification de l'empreinte digitale (ssh résout l'ip lui-même de toute façon, ce que vous pouvez voir en utilisant la commande -vvv drapeau)

0 votes

Il n'y a aucun moyen de modifier ce comportement. L'empreinte digitale ne contient pas le nom DNS, le client stocke simplement l'empreinte digitale séparément pour chaque hôte connu. foo.example.com est un hôte différent de bar.example.com, même s'ils pointent vers le même hôte "physique". SSH ne se soucie pas de cela.

0 votes

Vous pouvez utiliser des certificats au lieu de clés d'hôte pour vérifier l'identité du serveur. Vous aurez cependant besoin d'un certificat qui soit valide pour chaque nom d'hôte.

0 votes

Merci. Après avoir cherché pendant quelques heures de plus, j'ai trouvé cela il y a quelques minutes aussi. Mais peut-être qu'il y a une option pour dire à SSH "hey, s'il vous plaît n'ajoutez pas le nom dns mais l'ip que vous avez résolu le nom dns au fichier known_hosts et vérifiez avec l'ip résolu au lieu du nom dns" ?

0voto

laurens Points 107

Vous pouvez délimiter les entrées par des virgules dans ~/.ssh/known_hosts

Vous pouvez le faire :

database.example.com,webserver.example.com,database,webserver,10.1.2.3 ssh-rsa …

Vous pouvez ajouter d'autres noms et adresses IP pour un hôte dans ce format délimité par des virgules.

Cela utilise les noms d'hôtes réels, et non les Host Les alias que vous pouvez créer dans votre ~/.ssh/config fichier.

Trouver les entrées dupliquées dans known_hosts

J'ai créé un petit script appelé ssh-hosthashes qui peut trouver les entrées dupliquées dans un known_hosts fichier. Utilisez-le et les connaissances ci-dessus pour les réduire.

Voici son résultat pour la clé de Github (que vous pouvez remarquer que j'ai un peu réduit, mais pas assez). Les collisions sont listées par numéro de ligne :

ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTt
...JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==
    72: github.com,gist.github.com,192.30.252.128,192.30.252.129,192.30.252.130,192.30.252.131,192.30.252.140,192.30.252.141,192.30.252.142,192.30.252.143
    93: 192.30.253.113
    95: 192.30.253.118
    96: 192.30.253.119
    97: 192.30.253.112
    109: 192.30.255.113
    110: 192.30.255.112
    155: 140.82.113.3
    158: 140.82.114.4
    161: 140.82.113.4

Vérifier avec ssh localhost

Une autre chose que je fais souvent est de m'assurer que je n'ai pas enregistré l'empreinte digitale pour localhost. De cette façon, je peux me connecter au serveur à partir d'un hôte dont l'empreinte digitale est sauvegardée et approuvée, et lancer l'opération suivante ssh localhost de ce serveur, et faire correspondre cette empreinte digitale à celle proposée par un client qui ne l'a pas déjà enregistrée. Attention toutefois aux différents types de clés (ou formats d'empreintes). (Ceci n'est utile que parce que le condensé fourni par la clé ssh est différent du format stocké dans known_hosts fichiers.)

0voto

Mathieu CAROFF Points 101

Lecture La réponse de @AdamKatz m'a donné envie de trier mon fichier known_hosts, j'ai donc écrit un script qui fait cela, trouvez-le ci-dessous (j'ai mis du soin à l'écrire mais je n'ai fait que des tests minimaux donc utilisez-le à vos risques et périls).

Pour ce qui est de la question initiale, je recommande d'utiliser une entrée de configuration HostKeyAlias dans le fichier .ssh/config, comme expliqué dans le document suivant cette réponse ServerFault : "SSH dans une boîte dont l'IP change fréquemment". .

SSH : Configurer ssh_config pour utiliser un fichier clé spécifique pour une empreinte de serveur spécifique


# (python3)
# `organize_known_hosts.py`

# For all known hosts, sort them by algo+hashed value, grouping the known IPs and domain names into one comma-separted list

# Usage:
# Generated the sorted file:
#     cat ~/.ssh/known_hosts | python organize_known_hosts.py > /tmp/known_hosts
# Print it for visual check
#     cat /tmp/known_hosts
#     mv /tmp/known_hosts ~/.ssh/

import sys
from collections import namedtuple

class Entry(namedtuple("Entry", ["domainString", "algorithm", "hash"])):
    def __str__(self):
        return f"{self.domainString} {self.algorithm} {self.hash}"

    def rightHandSide(self):
        """algorithm+hash"""
        return f"{self.algorithm}.{self.hash}"

entryMap = {}

for lineNumber, line in enumerate(sys.stdin, start=1):
    content = line.strip().split()
    if len(content) == 0:
        continue # empty line -> skip
    elif line[0].startswith("#") or len(content) != 3:
        if not line[0].startswith("#"):
            sys.stderr.write(f"could not parse a line; line moved to top|{lineNumber}: '{line}'\n")
        sys.stdout.write(line)
        continue # comment or erroneous line -> skip
    entry = Entry(*content)
    entryMap.setdefault(entry.rightHandSide(), []).append(entry)

compactEntryList = []

for k, entryList in sorted(entryMap.items()):
    domainList = []
    ipList = []
    for entry in entryList:
        for domainOrIp in entry.domainString.split(","):
            if 'a' <= domainOrIp[0].lower() <= 'z':
                domainList.append(domainOrIp)
            else:
                ipList.append(domainOrIp)
    domainString = ",".join(sorted(domainList) + sorted(ipList))
    compactEntryList.append(Entry(domainString, *k.split(".")))

sys.stdout.write("\n".join(map(str, compactEntryList)))

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X