76 votes

Ajouter de manière sécurisée un hôte (par exemple GitHub) au fichier SSH known_hosts

Comment puis-je ajouter une clé d'hôte à l'interface SSH ? known_hosts en toute sécurité ?

Je suis en train de configurer une machine de développement, et je veux (par exemple) empêcher git de l'invite lorsque je clone un dépôt à partir de github.com en utilisant SSH.

Je sais que je peux utiliser StrictHostKeyChecking=no (par exemple 本答 ), mais ce n'est pas sûr.

Jusqu'à présent, j'ai trouvé...

  1. GitHub publie les empreintes de ses clés SSH à l'adresse suivante Empreintes digitales des clés SSH de GitHub

  2. Je peux utiliser ssh-keyscan pour obtenir la clé de l'hôte pour github.com .

Comment puis-je combiner ces faits ? Compte tenu d'une liste d'empreintes digitales préremplie, comment puis-je vérifier que la sortie de la fonction ssh-keyscan peuvent être ajoutés à la known_hosts fichier ?


Je suppose que ma question est la suivante :

Comment obtenir l'empreinte digitale d'une clé retournée par ssh-keyscan ?

Supposons que j'ai déjà été MITM-ed pour SSH, mais que je peux faire confiance à la page HTTPS de GitHub (car elle possède une chaîne de certificats valide).

Cela signifie que j'ai des clés d'hôte SSH (suspectes) (provenant de ssh-keyscan ) et certaines empreintes de clés (de confiance). Comment puis-je vérifier l'une par rapport à l'autre ?


_Related : Comment puis-je hacher la partie hôte de la sortie de l'écran ? ssh-keyscan ? Ou puis-je mélanger les hôtes hachés et non hachés dans le système de gestion de l'information ? known_hosts ?_

62voto

bmcnett Points 616

La partie la plus importante de l'ajout "sécurisé" d'une clé à l'adresse known_hosts est d'obtenir l'empreinte de la clé auprès de l'administrateur du serveur. L'empreinte de la clé doit ressembler à quelque chose comme ceci :

2048 SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8 github.com (RSA)

Dans le cas de GitHub, normalement on ne peut pas parler directement à un administrateur. Cependant, ils ont mis la clé sur leurs pages web et nous pouvons donc récupérer les informations à partir de là.

Installation manuelle des clés

1) Prenez une copie de la clé du serveur et obtenez son empreinte digitale. N.B. : Faites ceci avant vérification de l'empreinte digitale.

$ ssh-keyscan -t rsa github.com | tee github-key-temp | ssh-keygen -lf -
# github.com:22 SSH-2.0-babeld-f3847d63
2048 SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8 github.com (RSA)

2) Obtenez une copie de l'empreinte de la clé auprès de l'administrateur du serveur - dans ce cas, accédez à la page contenant les informations sur github.com.

  1. Aller sur github.com
  2. Allez à la aide (dans le menu de droite si vous êtes connecté ; au bas de la page d'accueil sinon).
  3. Dans le Pour commencer aller à la section Se connecter à GitHub avec SSH
  4. Aller à Test de votre connexion SSH
  5. Copiez l'empreinte SHA256 de cette page dans votre éditeur de texte pour une utilisation ultérieure.

3) Comparez les clés des deux sources

En les plaçant directement l'un au-dessus de l'autre dans un éditeur de texte, il est facile de voir si quelque chose a été modifié.

2048 SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8 github.com (RSA) #key recovered from github website
2048 SHA256:nThbg6kXUpJ3Gl7E1InsaspRomtxdcArLviKaEsTGY8 github.com (RSA) #key recovered with keyscan

(Notez que la deuxième clé a été manipulée, mais qu'elle ressemble beaucoup à l'originale - si quelque chose comme cela se produit, vous êtes victime d'une attaque sérieuse et devez contacter un expert en sécurité de confiance).

Si les clés sont différentes, annulez la procédure et contactez un expert en sécurité.

4) Si les clés sont comparées correctement, vous devez installer la clé que vous avez déjà téléchargée.

cat github-key-temp >> ~/.ssh/known_hosts

Ou pour l'installer pour tous les utilisateurs d'un système (en tant que root) :

cat github-key-temp >> /etc/ssh/ssh_known_hosts

Installation automatisée des clés

Si vous devez ajouter une clé pendant un processus de construction, vous devez suivre les étapes 1 à 3 du processus manuel ci-dessus.

Une fois cela fait, examinez le contenu de votre github-key-temp et créez un script pour ajouter ce contenu à votre fichier d'hôtes connus.

if ! grep github.com ~/.ssh/known_hosts > /dev/null
then
     echo "github.com ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==" >> ~/.ssh/known_hosts
fi

Vous devriez maintenant se débarrasser de tout ssh Les commandes qui ont StrictHostKeyChecking handicapés.

53voto

Wee Points 552

Vous pouvez mélanger les entrées hachées et non hachées dans votre fichier known_hosts.

Donc si vous voulez ajouter la clé github, vous pouvez simplement faire :

ssh-keyscan github.com >> ~/.ssh/known_hosts

Si vous voulez qu'il soit haché, ajoutez -H

ssh-keyscan -H github.com >> ~/.ssh/known_hosts

Remarque : cette méthode est vulnérable aux attaques MITM, car elle ne répond qu'à la partie "connexe" de la question.

5voto

Jakuje Points 8949

La méthode la plus simple consiste à récupérer manuellement les clés en utilisant la méthode suivante ssh-keyscan vérifiez-les manuellement :

$ ssh-keyscan -t rsa github.com | ssh-keygen -lf -
# github.com:22 SSH-2.0-libssh-0.7.0
2048 SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8 github.com (RSA)

Et ajoutez-les à votre script, qui portera alors la clé publique "faisant autorité".

5voto

J'ai écrit un simple script (add_to_known_hosts) pour gérer cela :

Il ne créera pas d'entrées en double dans le fichier known_hosts, et il vérifiera si l'empreinte digitale correspond à celle fournie en second argument.

#!/usr/bin/env bash
# The first argument should be hostname (or IP)
# The second argument should be the SSH fingerprint from the server admin.
# Example: add_to_known_hosts github.com SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8

host=$1
fingerprint=$2

ip=$(getent hosts $1 | awk '{ print $1 }')
echo $ip

keys=$(ssh-keyscan -t rsa $host $ip)

# Iterate over keys (host and ip)
while IFS= read -r key; do
    # Extract Host name (or IP)
    key_host=$(echo $key | awk '{ print $1 }')

    # Extracting fingerprint of key
    key_fingerprint=$(echo $key | ssh-keygen -lf - | awk '{ print $2 }')

    # Check that fingerprint matches one provided as second parameter
    if [[ $fingerprint != $key_fingerprint ]]; then
      echo "Fingerprint match failed: '$fingerprint' (expected) != '$key_fingerprint' (got)";
      exit 1;
    fi

    # Add key to known_hosts if it doesn't exist
    if ! grep $key_host ~/.ssh/known_hosts > /dev/null
    then
       echo "Adding fingerprint $key_fingerprint for $key_host to ~/.ssh/known_hosts"
       echo $key >> ~/.ssh/known_hosts
    fi
done <<< "$keys"

3voto

Etienne Jacquot Points 11

Automatisation de la vérification de l'empreinte digitale de SSH Known_Hosts

J'ai essayé de faire cela en Python sur Jupyterhub pendant un petit moment mais la réponse de @Michael a été très utile !

Soyons clairs -- par conception cette étape pour confirmer un hôte connu devrait PAS être automatisé compte tenu de la vulnérabilité aux attaques de type "man in the middle" (plus d'informations). aquí mais la raison de cette préoccupation devrait être évidente).

Vérification manuelle de l'empreinte RSA SSH pour GitHub.com avec Python et Bash

La solution de contournement non sécurisée -o "StrictHostKeyChecking no" était bien pour les tests mais je suis content d'avoir une alternative.

  • Remarquez que j'utilise ! bang dans Jupyter pour invoquer la commande bash pour ssh-keyscan & cat

    MANUALLY GET TRUSTED RSA FINGERPRINT FOR GITHUB

    https://docs.github.com/en/github/authenticating-to-github/githubs-ssh-key-fingerprints

    rsa_pubkey_fingerprint = 'SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8'

    Get the host rsa info for github, write to a file

    pipe to get the RSA FingerPrint, and finally write that fingerprint to file

    !ssh-keyscan -t rsa github.com | tee ./github_ssh_test | ssh-keygen -lf - >> ./fingerprint_rsa

Assert Fingerprints match pour confirmer les hôtes connus

Vous pouvez maintenant utiliser une assertion Python pour garantir l'authenticité de notre empreinte RSA de confiance par rapport à l'empreinte RSA scannée sur Internet :

assert(rsa_pubkey_fingerprint == open("./fingerprint_rsa", "r").read().split()[1])

# if the assertion passes and the trusted matches the scanned
# it'll write to your known_hosts file!

!cat ./github_ssh_test >> $HOME/.ssh/known_hosts

# you are now good to test your SSH connection
!ssh -T git@github.com

Merci et une bien meilleure solution de contournement pour ignorer la vérification stricte !

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