fragen stichworte

Nicht interaktiver Git-Klon (ssh-Fingerabdruckaufforderung)

Ich möchte ein Repo auf nicht interaktive Weise 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 bei jeder Frage ein "Ja"? Ich habe versucht, yes yes | git clone ... zu verwenden, aber es funktioniert nicht.

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

antworten

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

ANTWORT:

Durch das Hinzufügen der Domänennamen zur Datei known_hosts mit dem Befehl ssh-keyscan wurde das Problem behoben:

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

Weder die Optionen "StrictHostKeyChecking no" noch "ssh-keyscan" sind sicher. Sie brauchen irgendwann eine manuelle Überprüfung des Fingerabdrucks, um MiTM-Angriffe zu vermeiden, wenn Sie bei ssh bleiben.

Eigentlich haben Sie 2 Optionen:

Verwenden Sie das https-Protokoll anstelle von git

Es wird nicht nach einem Fingerabdruck gefragt, da ssh nicht beteiligt ist, stattdessen wird https verwendet. Aus Sicherheitsgründen vertrauen Sie Stammzertifikaten, die auf Ihrem Betriebssystem installiert sind. Wenn Sie ein minimalistisches Image oder Docker verwenden, müssen Sie möglicherweise das Paket "ca-certificate" installieren.

Wenn Sie wirklich das git + ssh-Protokoll wünschen

Müssen Sie den Schlüssel wirklich zur Laufzeit hinzufügen? Dies ist nicht sicher, da Sie den Fingerabdruck nicht geprüft haben und Sie somit MiTM-Angriffen ausgesetzt sind. Dies ist nicht nur theoretisch und es hat sich gezeigt, dass es funktioniert.

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

ssh-keyscan github.com >> githubKey

Generieren Sie den Fingerabdruck:

ssh-keygen -lf githubKey

Und prüfen Sie manuell mit denen, die auf dieser Seite aufgeführt sind (ok, dort vertrauen Sie https-Zertifikaten und OpenSSL, um Ihnen die ursprüngliche github-Website zu bringen , aber es ist immer noch viel besser, als blind einen öffentlichen Schlüssel anzunehmen).

Dann codieren Sie es in Ihrem Skript, indem Sie Folgendes 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 der Meinung ist, dass er beschädigt wurde (oder nicht sicher genug ist). In diesem Fall möchten Sie, dass Ihr Skript trotzdem fehlschlägt.

Ich glaube, eine bessere Option ist es, Ihre ~/.ssh/known_hosts -Datei zu sichern und zu leeren, die SSH-Verbindung manuell herzustellen, die IP-Adresse und den Fingerabdruck zu überprüfen, mv ~/.ssh/known_hosts ~/bitbucket_hosts, und dann den Inhalt von ~/bitbucket_hosts in Ihrem Skript zu verwenden Hängen Sie die bekannten Fingerabdrücke automatisch an die Datei known_hosts an (vergessen Sie nicht, das ursprüngliche ~/.ssh/known_hosts wiederherzustellen).

Dieser Schritt muss nur einmal ausgeführt werden (auf einer beliebigen Maschine, glaube ich), und sobald Sie die Fingerabdrücke haben, können Sie ihn in Ihr Automatisierungsskript integrieren.

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.

Gehen Sie vorsichtig vor.

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

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

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

Wenn Sie jedoch die Task automatisieren, möchten Sie sicherstellen, dass der Schlüssel nicht bereits in den clone/pull -Tasks enthalten ist.

Dieser Ausschnitt fügt den Fingerabdruck nur hinzu, wenn er noch nicht gefunden wurde:

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