Frage Nicht interaktiver Git-Klon (ssh-Fingerabdruck-Eingabeaufforderung) [Duplizieren]


Diese Frage hat hier bereits eine Antwort:

Ich möchte ein Repo nicht interaktiv klonen. Beim Klonen fragt git nach dem Fingerabdruck des Hosts:

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

Wie erzwinge ich jedes Mal, wenn diese Fragen auftauchen, "ja"? Ich habe es versucht yes yes | git clone ..., aber es funktioniert nicht.

BEARBEITEN: Hier ist eine Lösung: Kann ich Bekannten_Hosts automatisch einen neuen Host hinzufügen? (fügt gesicherte_Hosts mit ssh-keyscan hinzu).


109
2017-11-09 09:04


Ursprung


Interessant zu sehen, dass diese Frage auch nach zwei Jahren keine richtige Antwort hat. Es gibt nur wenige andere Fälle, in denen Git auffordert, zum Beispiel wenn Sie versuchen, über http zu klonen und der Server nach basic_auth fragt. Wie macht man das im Nicht-Interaktiv-Modus? - sorin
Hinzufügen der -q Option (leise) hat es für mich getan. Jetzt bin ich fest, die Passphrase zu automatisieren.


Antworten:


Ich denke nicht, dass das die beste Lösung ist, aber es war eine Lösung für mich.

ANTWORTEN:

Hinzufügen der Domainnamen zum known_hosts Datei mit dem ssh-keyscan Befehl löste das Problem:

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


92
2017-11-02 04:13



Bitte nicht so. Das ist völlig NICHT sicher: Fingerabdrücke sind nicht hier, um dich zu nerven, sondern um sicherzustellen, dass du keinen Man-in-the-Middle-Angriff hast. Bitte sehen Sie meine Antwort unten. - autra
wie ich sagte, "Ich denke nicht, dass das die beste Lösung ist, aber war eine Lösung für mich." weil ich in Eile war, gibt es sicher "policataly korrekte Art und Weise" es zu tun ((: - kroe
Es ist keine Frage von politisch korrekt :-) Es ist eine Frage, ob es sicher ist oder nicht. Ihre Lösung ist sicher, wenn und nur wenn Sie den Fingerabdruck nach Ihrem Fingerabdruck manuell überprüfen ssh-keyscan und bevor du es hinzufügst .ssh/known_hosts so zu sein, wie es der GitHub auf seiner Website veröffentlicht hat. Sie können es auf verschiedene Arten tun, und meins ist einer von ihnen. Sie können in Ihrem Skript auch eine gleiche Überprüfung durchführen, aber am Ende kommt alles darauf: Sie benötigen Ihr Skript, um zu wissen, welcher Fingerabdruck erwartet wird, und Sie müssen es scheitern lassen, wenn es nicht das richtige erhält. - autra
NUR Schlüssel hinzufügen, wenn es nicht existiert ssh-keygen -F github.com || ssh-keyscan github.com >>~/.ssh/known_hosts - transang
Dies einmal im Rahmen einer Konfigurationsverwaltung oder eines Provisionierungslaufs zu tun, sollte in Ordnung sein. Wenn sich der Fingerabdruck jemals in der Zukunft ändert, wird ssh wie vorgesehen funktionieren und Sie darauf aufmerksam machen, dass sich das Zertifikat geändert hat und einen 0-Exit-Code zurückgibt. Dies stoppt wahrscheinlich jedes Skript, in dem Sie ssh oder git verwenden. - emhohensee


Keine der Antworten ist sicher. Sie haben 2 Möglichkeiten:

Verwenden Sie https-Protokoll anstelle von Git

Sie werden nicht nach einem Fingerabdruck fragen, da ssh nicht involviert ist, stattdessen wird https (duh) verwendet. Wenn Sie ein minimalistisches Image oder Docker verwenden, müssen Sie möglicherweise das CA-Zertifikate-Paket installieren.

Wenn du wirklich git + ssh Protokoll willst

Müssen Sie den Schlüssel wirklich zur Laufzeit hinzufügen? Das ist absolut nicht sicher.

Bevor Sie Ihr Skript ausführen, holen Sie sich den Schlüssel von github (auf Ihrem lokalen Rechner):

ssh-keyscan github.com >> githubKey

Erzeuge den Fingerabdruck:

ssh-keygen -lf githubKey

Und überprüfe es manuell gegen die aufgeführten auf dieser Seite (OK, da vertrauen Sie https-Zertifikaten und OpenSSL, um Ihnen die originale github-Website zu bringen, aber es ist immer noch viel besser, als blind einen öffentlichen Schlüssel zu akzeptieren).

Dann kodieren Sie es in Ihrem Skript, indem Sie es hinzufügen:

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

vor dem Git Klon.

Der öffentliche GitHub-Schlüssel ändert sich nur, wenn er glaubt, dass er kompromittiert (oder nicht sicher genug) ist. Wenn das jemals der Fall ist, du wollen Dein Skript scheitert trotzdem.


79
2018-06-25 15:39



Diese ist die einzig richtige und sichere Antwort auf die Frage. Warum ist es der letzte? Ich schäme mich für die Menschheit ;-( - Jan Warchoł
Sie können nicht-interaktive HTTPS mit GitHub nicht tun, wenn Sie leider zwei Faktor-Authentifizierung verwenden. - Brett Widmeier
Ich verstehe nicht warum nicht. Wir sprechen hier von einem öffentlichen Repo, keine Authentifizierung. Das Klonen eines privaten Repos aus einem Skript ist eine ganz andere Sache: Sie müssen Ihr Skript dazu autorisieren. - autra
Die manuelle Überprüfung des Fingerabdrucks ist weniger schmerzhaft als es klingt, mit Hilfe von "Suchleiste" in modernen Entdeckern (wie in Chrom). - Franklin Yu


Ich glaube, eine bessere Option hier ist, zu sichern und zu leeren ~/.ssh/known_hosts Datei, führen Sie die SSH-Verbindung manuell aus und überprüfen Sie die IP-Adresse und den Fingerabdruck. mv ~/.ssh/known_hosts ~/bitbucket_hosts, dann benutze den Inhalt von ~/bitbucket_hostsin Ihrem Skript, um die bekannten Fingerabdrücke automatisch an die Datei known_hosts anzuhängen (Vergessen Sie nicht, das Original wiederherzustellen ~/.ssh/known_hosts).

Dieser Schritt muss nur einmal ausgeführt werden (auf jedem Rechner, glaube ich), und sobald Sie die Fingerabdrücke haben, können Sie sie in Ihr Automatisierungsskript einbinden.


7
2018-04-07 18:53





Obwohl ich sicher verstehe, dass Sie einen solchen Prozess automatisieren möchten, wäre dies nicht ratsam. Der Grund, warum SSH und verwandte Netzwerkunterkomponenten bei der Verwendung eines sicheren Protokolls verbiegen, besteht darin, einen Menschen WARN zu WARN, dass der öffentliche Schlüssel eines Systems unbekannt ist. Dies ist beabsichtigt - der Benutzer muss das System explizit informieren, dass der Host erwartet wird. Sie möchten nicht automatisch jeden öffentlichen Schlüssel akzeptieren, der Ihnen oder einem Teil der Sicherheit in SSH oder TLS / SSL präsentiert wird. Ein Beispiel ist ein Man-in-the-Middle-Angriff, beispielsweise wenn eine Proxy-Software ihren eigenen Schlüssel an der Stelle eines Hosts präsentiert, den Sie erwarten.

Mit Vorsicht fortfahren.

Wenn Sie keine Angst vor der Quelle des Codes über die Leitung haben, sollten Sie explizit und ausschließlich das git: // - Protokoll beim Klonen verwenden - es ist authentifizierungslos und im Klartext.


6
2018-01-22 22:34



Ich kann definitiv Anwendungsfälle sehen, in denen wir nicht-interaktive Verwendungen von erzwingen müssen git clone... und das bedeutet nicht, dass wir eine Überprüfung akzeptieren müssen (insbesondere den Fingerabdruck). In meinem Fall wäre ich sehr froh, dass ich bei solchen Dingen automatisch scheitern würde. - vaab


Wie Jeff Hall sagte, ist dies gefährlich, da es unbemerkte Man-in-the-Middle-Angriffe erlaubt. Sie könnten jedoch die StrictHostKeyChecking no Option in SSH, um die Überprüfung der Host-Schlüssel zu deaktivieren. Allerdings wäre ich sehr vorsichtig mit dieser Option, wenn ich du wäre.


5
2018-02-03 07:45



Es erlaubt auch Man-in-the-Middle richtig? - autra


Hinzufügen des Schlüssels zu .ssh/known_hosts scheint das Richtige zu sein.

Wenn Sie jedoch die Aufgabe automatisieren, sollten Sie sicherstellen, dass der Schlüssel nicht bereits enthalten ist und an jedem hinzugefügt wird clone/pull Aufgaben.

Dieses Snippet fügt nur dann den Fingerabdruck hinzu, wenn er nicht bereits gefunden wurde:

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

4
2018-02-16 10:42



Das war perfekt. Kann einfach in ein Bereitstellungsskript eingefügt werden und ist sicherer als das Deaktivieren der Hostverifizierung. Hier ist ein One-Liner für 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 - tweak2
Dies funktioniert nicht, wenn HashKnownHosts ist aktiviert in / etc / ssh / ssh_config (oder ~ / .ssh / Konfig). Anstatt [ ! -n "$(grep "^bitbucket.org " ~/.ssh/known_hosts)" ] es wäre besser zu benutzen [ ! "$(ssh-keygen -F bitbucket.org)" ], die sowohl Hash- als auch Nicht-Hash-Zeilen enthält bekannte_Hosts. - Claus Conrad