205 votes

Clone git non interactif (invite ssh fingerprint)

Je veux cloner un repo de manière non-interactive. Lors du clonage, git demande de confirmer l'empreinte digitale de l'hôte :

The authenticity of host 'bitbucket.org (207.223.240.182)' can't be established.
RSA key fingerprint is 97:8c:1b:f2:6f:14:6b:5c:3b:ec:aa:46:46:74:7c:40.
Are you sure you want to continue connecting (yes/no)? no

Comment puis-je forcer la réponse "oui" à chaque fois que cette question s'affiche ? J'ai essayé d'utiliser yes yes | git clone ... mais ça ne marche pas.

EDIT : Voici une solution : Puis-je ajouter automatiquement un nouvel hôte à known_hosts ? (ajoute des entiers à known_hosts avec ssh-keyscan).

0 votes

Il est intéressant de voir que même après deux ans, cette question n'a pas de réponse appropriée. Il y a quelques autres cas où git vous invitera, par exemple si vous essayez de cloner par http et que le serveur demande basic_auth. Comment faire cela en mode non-interactif ?

3 votes

Ajout de la -q L'option (silencieuse) l'a fait pour moi. Maintenant je suis coincé à automatiser la phrase de passe.

151voto

kroe Points 1522

Je ne pense pas que ce soit la meilleure solution, mais c'était une solution pour moi.

RÉPONSE :

Ajouter les noms de domaine au known_hosts en utilisant l'option ssh-keyscan a résolu le problème :

ssh-keyscan <enter_domainname_e.g._github.com> >> ~/.ssh/known_hosts

12 votes

S'il vous plaît, ne faites pas comme ça. Ce n'est absolument PAS sécurisé : les empreintes digitales ne sont pas là pour vous ennuyer mais pour s'assurer que vous n'êtes pas confronté à une attaque de type man-in-the-middle. Veuillez consulter ma réponse ci-dessous.

1 votes

Comme je l'ai dit, "je ne pense pas que ce soit la meilleure solution, mais c'était une solution pour moi." parce que j'étais pressé, il y a sûrement une "manière politiquement correcte" de le faire (( :

2 votes

Ce n'est pas une question de politiquement correct :-) Il s'agit de savoir si c'est sûr ou non. Votre solution est sécurisée si et seulement si vous vérifiez manuellement l'empreinte digitale après l'ouverture de la session. ssh-keyscan et avant de l'ajouter à .ssh/known_hosts pour être le même que celui que github a publié sur son site web. Vous pouvez le faire de plusieurs façons, et la mienne est l'une d'entre elles. Vous pouvez également faire une vérification égale dans votre script, mais à la fin, tout revient à ceci : vous avez besoin que votre script sache quelle empreinte digitale il attend, et vous avez besoin qu'il échoue s'il ne reçoit pas la bonne.

146voto

bobpaul Points 131

Les options "StrictHostKeyChecking no" et "ssh-keyscan" ne sont pas sûres. besoin de une validation manuelle de l'empreinte digitale à un moment donné pour éviter une attaque MiTM si vous vous en tenez à ssh.

En fait, vous avez deux options :

Utiliser le protocole https au lieu de git

Il ne vous demandera pas d'empreinte digitale, car ssh n'est pas impliqué, https est utilisé à la place. Pour des raisons de sécurité, vous faites confiance aux certificats racine installés sur votre système d'exploitation. Si vous utilisez une image minimaliste ou Docker, vous devrez peut-être installer le paquet ca-certificates.

Si vous voulez vraiment le protocole git+ssh

Avez-vous vraiment besoin d'ajouter la clé au moment de l'exécution ? Ce n'est pas sûr, car vous n'avez pas vérifié l'empreinte digitale, ce qui vous expose aux attaques MiTM. Ce n'est pas seulement théorique, et il a été prouvé que cela fonctionne.

Avant d'exécuter votre script, récupérez la clé depuis github (sur votre machine locale) :

ssh-keyscan github.com >> githubKey

Générer l'empreinte digitale :

ssh-keygen -lf githubKey

Et vérifiez-le manuellement contre ceux énumérés dans cette page (ok, là vous faites confiance aux certificats https et à OpenSSL pour vous apporter le site web original de github, mais c'est toujours bien mieux que d'accepter aveuglément une clé publique).

Alternativement (en faisant confiance au même https et à OpenSSL), vous pouvez le récupérer à l'adresse suivante https://api.github.com/meta comme ça : curl -s https://api.github.com/meta | jq ."ssh_key_fingerprints" | grep RSA . (Merci à @willscripted pour celui-ci)

Ensuite, vous le codez en dur dans votre script en l'ajoutant :

echo '<copy paste the content of 'cat githubKey' on your machine>'  >> ~/.ssh/known_hosts

avant le clone git.

La clé publique de GitHub ne changera que s'ils estiment qu'elle a été compromise (ou pas assez sécurisée). Si c'est le cas, vous veulent votre script d'échouer de toute façon.

2 votes

Vous ne pouvez pas utiliser le HTTPS non interactif avec GitHub si vous utilisez l'authentification à deux facteurs, malheureusement.

1 votes

Je ne vois pas pourquoi pas. Nous parlons ici d'un repo public, pas besoin d'authentification. Cloner un repo privé à partir d'un script est une toute autre chose : vous devez autoriser votre script à le faire.

0 votes

La vérification "manuelle" de l'empreinte digitale est moins pénible qu'il n'y paraît, avec l'aide de la "barre de recherche" des explorateurs modernes (comme en Chrome ).

14voto

udondan Points 2001

En ajoutant la clé à .ssh/known_hosts semble être la bonne chose à faire.

Cependant, lorsque vous automatisez la tâche, vous devez vous assurer que la clé n'est pas déjà contenue et ajoutée à chaque fois. clone / pull tâches.

Cet extrait n'ajoutera l'empreinte digitale que si elle n'a pas déjà été trouvée :

if [ ! -n "$(grep "^bitbucket.org " ~/.ssh/known_hosts)" ]; then ssh-keyscan bitbucket.org >> ~/.ssh/known_hosts 2>/dev/null; fi

1 votes

C'était parfait. Peut facilement être mis dans un script de déploiement et est plus sûr que de désactiver la vérification de l'hôte. Voici un one-liner pour github : if [ ! -n "$(grep "^github.com " ~/.ssh/known_hosts)" ]; then ssh-keyscan github.com >> ~/.ssh/known_hosts 2>/dev/null; fi; ssh-agent bash -c "ssh-add /path/to/your/deploy/id_rsa; git clone -b master git@github.com:githubAccount/githubRepo.git /your/target/dir

0 votes

Cela ne fonctionne pas lorsque HashKnownHosts est activé dans /etc/ssh/ssh_config (ou ~/.ssh/config ). Au lieu de [ ! -n "$(grep "^bitbucket.org " ~/.ssh/known_hosts)" ] il serait préférable d'utiliser [ ! "$(ssh-keygen -F bitbucket.org)" ] qui trouve à la fois des lignes hachées et non hachées dans Hôtes connus .

11voto

Steven Soroka Points 211

Je crois qu'une meilleure option ici est de sauvegarder et de vider votre ~/.ssh/known_hosts effectuez manuellement la connexion SSH, en vérifiant l'adresse IP et l'empreinte digitale, mv ~/.ssh/known_hosts ~/bitbucket_hosts puis utiliser le contenu de ~/bitbucket_hosts dans votre script pour ajouter automatiquement les empreintes digitales connues au fichier known_hosts (n'oubliez pas de restaurer l'original ~/.ssh/known_hosts ).

Cette étape ne doit être effectuée qu'une seule fois (sur n'importe quelle machine, je crois), et une fois que vous avez les empreintes digitales, vous pouvez les incorporer dans votre script d'automatisation.

1 votes

C'est la réponse la plus directe. Au lieu de créer un script pour générer l'empreinte digitale à placer dans le fichier known_hosts, il suffit d'établir une connexion pour générer le fichier known_hosts et de copier le fichier known_hosts autour de vous.

8voto

Bien que je comprenne parfaitement que vous souhaitiez automatiser un tel processus, il serait malvenu de le faire. La raison pour laquelle SSH et les sous-composants réseau connexes se rebiffent lorsqu'ils utilisent un protocole sécurisé est d'avertir un humain que la clé publique d'un système est inconnue. Ceci est intentionnel - l'utilisateur doit explicitement informer le système que l'hôte est attendu. Vous ne voudriez pas accepter automatiquement toutes les clés publiques qui vous sont présentées, sinon une partie de la sécurité de SSH ou TLS/SSL pourrait être compromise. Un exemple est une attaque de type "man-in-the-middle", par exemple lorsqu'un logiciel proxy présente sa propre clé à la place de l'hôte que vous attendez.

Procédez avec prudence.

Si vous n'avez aucune crainte quant à la source du code à travers le fil, vous devriez explicitement et exclusivement utiliser le protocole git:// lors du clonage - il est sans authentification et en texte clair.

3 votes

Je peux définitivement voir des cas d'utilisation où nous avons besoin d'imposer des utilisations non-interactives de git clone ... et cela ne signifie pas que nous devons accepter n'importe quel contrôle (celui des empreintes digitales en particulier). Dans mon cas, je serais parfaitement heureux d'échouer automatiquement sur ce genre de chose.

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