Vraag Niet-interactieve git-kloon (ssh-vingerafdruk prompt) [dupliceren]


Deze vraag heeft hier al een antwoord:

Ik wil een repo op een niet-interactieve manier klonen. Bij het klonen vraagt ​​git om de vingerafdruk van de host te bevestigen:

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

Hoe dwing ik "ja" elke keer dat deze vragen opduiken? Ik probeerde het te gebruiken yes yes | git clone ..., maar het werkt niet.

BEWERK: Hier is een oplossing: Kan ik automatisch een nieuwe host toevoegen aan bekende_hosts? (voegt entes toe aan bekende_hosts met ssh-keyscan).


109
2017-11-09 09:04


oorsprong


Interessant om te zien dat deze vraag zelfs na twee jaar geen goed antwoord heeft. Er zijn enkele andere gevallen waarin git zal vragen, bijvoorbeeld als je probeert te klonen via http en de server vraagt ​​om basic_auth. Hoe dit te doen in niet-interactieve modus? - sorin
Het toevoegen van de -q optie (rustig) deed het voor mij. Nu zit ik vast in het automatiseren van de wachtwoordzin.


antwoorden:


Ik denk niet dat dit de beste oplossing is, maar het was een oplossing voor mij.

ANTWOORD:

De domeinnamen toevoegen aan de known_hosts bestand met behulp van de ssh-keyscan commando loste het probleem op:

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


92
2017-11-02 04:13



Doe alsjeblieft niet zo. Dit is helemaal NIET veilig: vingerafdrukken zijn hier niet om je te irriteren, maar om er zeker van te zijn dat je niet geconfronteerd wordt met een man-in-the-middle aanval. Zie mijn antwoord hieronder. - autra
zoals ik al zei: "Ik denk niet dat dit de beste oplossing is, maar was een oplossing voor mij." omdat ik haast had, er is zeker een "policataly correcte manier" om het te doen ((: - kroe
Het is geen kwestie van politiek correct :-) Het is een kwestie van of het veilig is of niet. Uw oplossing is veilig als en alleen als u de vingerafdruk na uw hand handmatig controleert ssh-keyscan en voordat je het toevoegt .ssh/known_hosts hetzelfde te zijn als degene die github op hun website heeft gepubliceerd. Je kunt het op verschillende manieren doen, en de mijne is er een van. Je kunt ook een gelijkmatige controle uitvoeren in je script, maar uiteindelijk komt het hierop: je hebt je script nodig om te weten welke vingerafdruk het verwacht en je hebt het nodig om te falen als het niet de juiste ontvangt. - autra
om ALLEEN de sleutel toe te voegen als deze niet bestaat ssh-keygen -F github.com || ssh-keyscan github.com >>~/.ssh/known_hosts - transang
Doe dit een keer als onderdeel van een configuratiemanagement of provisioning-run. Als de vingerafdruk in de toekomst ooit verandert, dan werkt ssh zoals bedoeld en wordt u gewaarschuwd dat de cert is gewijzigd, waardoor een niet-0-exitcode wordt geretourneerd. Dit zal waarschijnlijk elk script stoppen waar je ssh of git gebruikt. - emhohensee


Geen van de antwoorden is veilig. Je hebt 2 opties:

Gebruik https-protocol in plaats van git

Het vraagt ​​niet om een ​​vingerafdruk, omdat ssh niet betrokken is, https (duh) wordt in plaats daarvan gebruikt. Als u een minimalistische afbeelding of Docker gebruikt, moet u wellicht het ca-certificatenpakket installeren.

Als je echt git + ssh-protocol wilt

Moet je de sleutel echt toevoegen tijdens runtime? Dit is helemaal niet veilig.

Voordat u uw script uitvoert, haalt u de sleutel uit github (op uw lokale computer):

ssh-keyscan github.com >> githubKey

Genereer de vingerafdruk:

ssh-keygen -lf githubKey

En controleer het handmatig tegen de genoemde op deze pagina (ok, daar vertrouw je op https-certificaten en OpenSSL om je de originele github-website te brengen, maar het is nog steeds veel beter dan blindelings een publieke sleutel accepteren).

Vervolgens codeer je het in je script door het toe te voegen:

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

voor de git-kloon.

De publieke sleutel van GitHub verandert alleen als ze denken dat deze is gecompromitteerd (of niet veilig genoeg). Als dit ooit het geval is, jij willen je script mislukt toch.


79
2018-06-25 15:39



Deze is het enige juiste en veilige antwoord op de vraag. Waarom is het de laatste? Ik schaam me voor de mensheid ;-( - Jan Warchoł
Je kunt niet-interactieve HTTPS met GitHub doen als je helaas twee factoren gebruikt. - Brett Widmeier
Ik begrijp niet waarom niet. We hebben het hier over een openbare repo, geen authenticatie nodig. Het klonen van een privé repo van een script is een ander ding volledig: je moet je script autoriseren om dit te doen. - autra
Het "handmatig" controleren van de vingerafdruk is minder pijnlijk dan het klinkt, met de hulp van "zoekbalk" in moderne ontdekkingsreizigers (zoals in Chrome). - Franklin Yu


Ik geloof dat een betere optie hier is om een ​​back-up te maken en je te legen ~/.ssh/known_hosts bestand, voer handmatig de SSH-verbinding uit, verifieer het IP-adres en de vingerafdruk, mv ~/.ssh/known_hosts ~/bitbucket_hosts, gebruik dan de inhoud van ~/bitbucket_hostsin uw script om de bekende vingerafdrukken automatisch toe te voegen aan het bekende_hosts-bestand (vergeet niet om het origineel te herstellen ~/.ssh/known_hosts).

Deze stap hoeft slechts één keer te worden uitgevoerd (op elke machine, denk ik) en als u eenmaal de vingerafdrukken hebt, kunt u deze opnemen in uw automatiseringsscript.


7
2018-04-07 18:53





Hoewel ik zeker begrijp dat u een dergelijk proces wilt automatiseren, zou dit niet verstandig zijn. De reden waarom SSH en aanverwante subcomponenten van netwerken bij het gebruik van een beveiligd protocol schijn hebben, is om een ​​mens TE WAARSCHUWEN dat de publieke sleutel van een systeem onbekend is. Dit is opzettelijk - de gebruiker moet het systeem expliciet informeren dat de host wordt verwacht. U wilt niet automatisch elke openbare sleutel die aan u wordt gepresenteerd, accepteren of een deel van de beveiliging in SSH of TLS / SSL kan worden aangetast. Een voorbeeld is via een man-in-the-middle-aanval, bijvoorbeeld wanneer een proxy-software zijn eigen sleutel presenteert in de plaats van een host die u verwacht.

Ga voorzichtig verder.

Als u niet bang bent voor de bron van de code over de draad, moet u expliciet en exclusief het git: // -protocol gebruiken bij het klonen - het is authentiek en in duidelijke tekst.


6
2018-01-22 22:34



Ik kan definitief gebruiksgevallen zien waar we niet-interactief gebruik van moeten afdwingen git clone... en dat betekent niet dat we een cheque moeten accepteren (met name de vingerafdruk). In mijn geval zou ik volkomen blij zijn om automatisch te falen op zoiets. - vaab


Zoals Jeff Hall zei, is dit gevaarlijk omdat het onontdekte man-in-the-middle-aanvallen toelaat. U kunt echter de StrictHostKeyChecking no optie in ssh om het controleren van de hostsleutels uit te schakelen. Ik zou echter heel voorzichtig zijn met die optie als ik jou was.


5
2018-02-03 07:45



Het maakt ook man-in-the-middle recht? - autra


De sleutel toevoegen aan .ssh/known_hosts lijkt het juiste te doen.

Hoewel u bij het automatiseren van de taak ervoor wilt zorgen dat de sleutel niet al is ingesloten en toegevoegd aan elke taak clone/pull taken.

Dit fragment voegt alleen de vingerafdruk toe als deze nog niet is gevonden:

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



Dit was perfect. Kan gemakkelijk in een implementatiescript worden geplaatst en is veiliger dan het uitschakelen van hostverificatie. Hier is een one-liner voor 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
Dit werkt niet wanneer HashKnownHosts is ingeschakeld in / Etc / ssh / ssh_config (of ~ / .Ssh / config). In plaats van [ ! -n "$(grep "^bitbucket.org " ~/.ssh/known_hosts)" ] het zou beter zijn om te gebruiken [ ! "$(ssh-keygen -F bitbucket.org)" ], waarin zowel gehashde als niet-gehashte regels voorkomen known_hosts. - Claus Conrad