web-dev-qa-db-fra.com

Ajoutez en toute sécurité un hôte (par exemple GitHub) au fichier SSH known_hosts

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

Je configure une machine de développement et je veux (par exemple) empêcher git de demander lorsque je clone un référentiel à partir de github.com en utilisant SSH.

Je sais que je peux utiliser StrictHostKeyChecking=no (par exemple cette réponse ), mais ce n'est pas sécurisé.

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

  1. GitHub publie leurs empreintes digitales clés SSH sur https://help.github.com/articles/github-s-ssh-key-fingerprints/

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

Comment combiner ces faits? Étant donné une liste pré-remplie d'empreintes digitales, comment puis-je vérifier que la sortie de ssh-keyscan peut être ajouté au known_hosts fichier?


Je suppose que je pose la question 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 GitHub HTTPS (car elle a une chaîne de certificats valide).

Cela signifie que j'ai des clés d'hôte SSH (suspectes) (de ssh-keyscan) et quelques empreintes digitales clés (fiables). Comment vérifier l'un par rapport à l'autre?


Connexes: comment hacher la partie hôte de la sortie de ssh-keyscan? Ou puis-je mélanger des hôtes hachés/non hachés dans known_hosts?

23
Roger Lipscombe

La partie la plus importante de "sécuriser" l'ajout d'une clé à known_hosts le fichier est pour obtenir l'empreinte digitale clé de l'administrateur du serveur. L'empreinte digitale doit ressembler à ceci:

2048 SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8 github.com (RSA)

Dans le cas de GitHub, normalement nous ne pouvons pas parler directement à un administrateur. Cependant, ils ont mis la clé sur leurs pages Web afin que nous puissions 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érifier 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 digitale clé de l'administrateur du serveur - dans ce cas, accédez à la page contenant les informations sur github.com

  1. Allez sur github.com
  2. Allez à la page aide (dans le menu à droite si vous êtes connecté; sinon au bas de la page d'accueil).
  3. Dans la section Mise en route allez à Connexion à GitHub avec SSH
  4. Allez dans 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 les uns au-dessus des autres dans un éditeur de texte, il est facile de voir si quelque chose a changé

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 elle ressemble assez à l'original - si quelque chose comme ça se produit, vous êtes sérieusement attaqué et devez contacter un expert en sécurité de confiance.)

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

4) Si les clés se comparent correctement, vous devez installer la clé que vous avez déjà téléchargée

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

Ou à 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 génération, vous devez suivre les étapes 1 à 3 du processus manuel ci-dessus.

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

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 vous débarrasser de toutes les commandes ssh qui ont StrictHostKeyChecking désactivées.

16
Michael

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

Donc, si vous souhaitez ajouter une 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

18
Wee

Le moyen le plus simple consiste à récupérer manuellement les clés à l'aide de 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é".

6
Jakuje

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

Il ne créera pas d'entrées en double dans les hôtes connus et vérifiera si l'empreinte correspond à celle fournie comme deuxième argument.

#!/usr/bin/env bash
# First argument should be hostname (or IP)
# Second argument should be referential fingerprint
# 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"
2
Aleksandar Gajic