Vraag Kan ik automatisch een nieuwe host toevoegen aan bekende_hosts?


Hier is mijn situatie: ik ben bezig met het opzetten van een testtuig dat, vanaf een centrale client, een aantal instanties van virtuele machines zal lanceren en vervolgens opdrachten via hen zal uitvoeren ssh. De virtuele machines hebben eerder ongebruikte hostnamen en IP-adressen, dus ze zullen niet in de ~/.ssh/known_hosts bestand op de centrale client.

Het probleem dat ik heb is dat de eerste ssh opdracht uitvoeren tegen een nieuwe virtuele instantie komt altijd met een interactieve prompt:

The authenticity of host '[hostname] ([IP address])' can't be established.
RSA key fingerprint is [key fingerprint].
Are you sure you want to continue connecting (yes/no)?

Is er een manier om dit te omzeilen en de nieuwe host al bekend te maken bij de clientcomputer, misschien door een openbare sleutel te gebruiken die al in de image van de virtuele machine is ingebakken? Ik zou echt willen vermijden om Expect of wat dan ook te gebruiken om de interactieve prompt te beantwoorden als ik kan.


217
2018-04-16 04:15


oorsprong


Voor een testomgeving die zelfstandig en fysiek veilig is, kan automatische sleutelacceptatie prima werken. Maar het automatisch accepteren van publieke sleutels in een productieomgeving of in een niet-vertrouwd netwerk (zoals internet) omzeilt volledig elke beveiliging tegen man-in-the-middle-aanvallen die SSH anders zou betalen. De enkel en alleen een geldige manier om zeker te zijn dat je beveiligd bent tegen MITM-aanvallen is om de publieke sleutel van de host te verifiëren via een out-of-band vertrouwd kanaal. Er is geen veilige manier om het te automatiseren zonder een matig ingewikkelde key signing-infrastructuur op te zetten. - Eil


antwoorden:


Stel de StrictHostKeyChecking optie om no, ofwel in het configuratiebestand of via -o :

ssh -o StrictHostKeyChecking=no username@hostname.com


126
2018-04-16 04:34



Dit laat je open voor de mens in de middelste aanvallen, waarschijnlijk geen goed idee. - JasperWallace
@JasperWallace, hoewel dit meestal goed advies is, moet de specifieke use-case (het inzetten van test-VM's en het verzenden van opdrachten) veilig genoeg zijn. - Massimo
Dit geeft een Warning: Permanently added 'hostname,1.2.3.4' (RSA) to the list of known hosts. Om de waarschuwing te vermijden en om te voorkomen dat de vermelding wordt toegevoegd aan een bekend_hosts-bestand, doe ik het volgende: ssh -o StrictHostKeyChecking=no -o LogLevel=ERROR -o UserKnownHostsFile=/dev/null username@hostname.com - Peter V. Mørch
Downvoting omdat dit de vraag niet beantwoordt en opent voor ernstige beveiligingskwetsbaarheden. - marcv81
@Mnebuerquo: Als u zich zorgen maakte over de beveiliging, zou u helemaal niets met deze vraag te maken hebben. U zou de juiste host-sleutel voor u hebben, verzameld vanaf de console van het systeem waarmee u verbinding wilde maken, en u zou het handmatig verifiëren bij de eerste verbinding. Je zou zeker niets "automatisch" doen. - Ignacio Vazquez-Abrams


IMO, de beste manier om dit te doen is het volgende:

ssh-keygen -R [hostname]
ssh-keygen -R [ip_address]
ssh-keygen -R [hostname],[ip_address]
ssh-keyscan -H [hostname],[ip_address] >> ~/.ssh/known_hosts
ssh-keyscan -H [ip_address] >> ~/.ssh/known_hosts
ssh-keyscan -H [hostname] >> ~/.ssh/known_hosts

Dit zorgt ervoor dat er geen dubbele items zijn, dat u gedekt bent voor zowel de hostnaam als het IP-adres en dat u ook de output hasht, een extra beveiligingsmaatregel.


209
2017-09-27 20:51



Waarom heb je alle 3 ssh-keyscan's nodig? Kun je niet langskomen met alleen de eerste omdat het werkt voor zowel hostnaam als ip? - Robert
Weet je zeker dat het antwoordapparaat op de ssh-keyscan request echt degene is waarmee je wilt praten? Zo niet, dan heb je jezelf geopend voor een man in de middelste aanval. - JasperWallace
@JasperWallace Ja, daarvoor hebt u ten minste de vingerafdruk of beter de openbare sleutel nodig, in welk geval u deze rechtstreeks aan bekende_hosts kunt toevoegen, waardoor deze vraag wordt omgedraaid. Als u alleen de vingerafdruk hebt, moet u een extra stap schrijven die de gedownloade openbare sleutel verifieert met uw vingerafdruk ...
Oproepen naar ssh-keyscan faalden voor mij omdat mijn doelhost het sleuteltype van de standaardversie 1 niet ondersteunt. Het toevoegen -t rsa,dsa aan het bevel bevestigde dit. - phasetwenty
Dit is waarschijnlijk een slecht idee. Je opent jezelf voor een man-in-the-middle-aanval door deze sleutels bij te werken. Om dubbele invoer te voorkomen, controleert u de retourstatus van ssh-keygen -F [address] in plaats daarvan. medium.com/@wblankenship/... - retrohacker


Voor de luie degenen:

ssh-keyscan <host> >> ~/.ssh/known_hosts

78
2017-09-25 10:03



+1 om schuldig te zijn als beschuldigd. Bedankt. - SaxDaddy
Kwetsbaar voor MITM-aanvallen. U controleert de vingerafdruk niet. - Mnebuerquo
@Mnebuerquo U zegt wat u moet doen, maar niet hoe, wat nuttig zou zijn. - Jim
@jameshfisher Ja, kwetsbaar voor MITM-aanvallen, maar heb je ooit de RSA-vingerafdruk vergeleken, die je werd getoond met de echte van de server, toen je dit handmatig deed? Nee? Dus dit antwoord is de manier om het voor u te doen. Zo ja, dan moet u dit antwoord niet gebruiken en het handmatig doen of andere veiligheidsmaatregelen implementeren ... - fivef
@Mnebuerquo Ik zou heel blij zijn als je ons ook een betere manier zou laten weten om hiermee om te gaan, wanneer we een repo moeten klonen met behulp van batch-scripts die niet worden bijgewoond en we willen deze prompt omzeilen. Werp alstublieft wat licht op een echte oplossing als u denkt dat dit niet de juiste is! - Waqas Shah


Zoals gezegd is het gebruik van key-scan de juiste en onopvallende manier om het te doen.

ssh-keyscan -t rsa,dsa HOST 2>&1 | sort -u - ~/.ssh/known_hosts > ~/.ssh/tmp_hosts
mv ~/.ssh/tmp_hosts ~/.ssh/known_hosts

Het bovenstaande zal de truc zijn om een ​​host toe te voegen, ALLEEN als deze nog niet is toegevoegd. Het is ook niet gelijktijdig veilig; u moet niet voer het fragment op dezelfde bronmachine meerdere malen tegelijk uit, omdat het tmp_hosts-bestand kan worden gecamoufleerd, wat er uiteindelijk toe leidt dat het bestand known_hosts opgeblazen raakt ...


38
2018-03-06 09:00



Is er een manier om te controleren of de sleutel zich in bekende_hosts bevindt voor  ssh-keyscan? De reden is dat het enige tijd en extra netwerkverbinding vereist. - utapyngo
De originele posterversie van dit bestand had cat ~/.ssh/tmp_hosts > ~/.ssh/known_hosts, maar een volgende bewerking veranderde het in >>. Gebruik makend van >> is een fout. Het verslaat het doel van de uniciteit in de eerste regel en zorgt ervoor dat nieuwe items worden gedumpt known_hosts elke keer dat het wordt uitgevoerd. (Ik heb zojuist een bewerking gepost om deze te wijzigen.) - paulmelnikow
Dit is onderhevig aan dezelfde MITM-aanvallen als de anderen. - Mnebuerquo
@utapyngo ssh-keygen -F geeft je de huidige vingerafdruk. Als het leeg terug komt met de retourcode van 1, dan heb je het niet. Als het iets afdrukt en als retourcode 0 is, is het al aanwezig. - Rich L
Als u zoveel waarde hecht aan MITM, DNSSEC- en SSHFP-records implementeert of een andere veilige manier gebruikt om de sleutels te distribueren, is deze oplossing niet nodig. - Zart


Je zou kunnen gebruiken ssh-keyscan commando om de publieke sleutel te pakken en die aan je toe te voegen known_hosts het dossier.


18
2018-04-16 05:09



Zorg ervoor dat u de vingerafdruk controleert om zeker te zijn dat het de juiste sleutel is. Anders open je jezelf voor MITM-aanvallen. - Mnebuerquo
@Mnebuerquo Eerlijk punt in de algemene context, maar waarom probeert iemand programmatisch sleutels te verzamelen als hij al wist wat de juiste sleutel was? - Brian Cline
Dit is niet de manier om het te doen. MITM. - jameshfisher


Dit is hoe je kunt opnemen ssh-keyscan in je spel:

---
# ansible playbook that adds ssh fingerprints to known_hosts
- hosts: all
  connection: local
  gather_facts: no
  tasks:
  - command: /usr/bin/ssh-keyscan -T 10 {{ ansible_host }}
    register: keyscan
  - lineinfile: name=~/.ssh/known_hosts create=yes line={{ item }}
    with_items: '{{ keyscan.stdout_lines }}'

6
2018-02-03 03:12



Upload je een bekend geldig bekend_hosts-bestand, of doe je ssh-keyscan en dump je de uitvoer in known_hosts zonder vingerafdrukken te verifiëren? - Mnebuerquo
Dit is gewoon de uitvoer van een keyscan dumpen, ja. Dus in feite is het hetzelfde als StrictHostKeyChecking = nee, alleen met stilstaande bekende_hosts die updaten zonder gehannes met ssh-opties. Deze oplossing werkt ook niet goed vanwege ssh-keys die meerdere regels retourneren, waardoor deze taak altijd wordt gemarkeerd als 'gewijzigd' - Zart
Dit is niet de manier om het te doen. MITM. - jameshfisher
@jameshfisher Ik zou heel blij zijn als je ons ook een betere manier zou laten weten om hiermee om te gaan, wanneer we een repo moeten klonen met behulp van batch-scripts die niet worden bezocht en we willen deze prompt omzeilen. Werp alstublieft wat licht op een echte oplossing als u denkt dat dit niet de juiste is! Laat ons alsjeblieft weten "hoe" om het te doen, als je denkt dat dit niet de juiste manier is om het te doen! - Waqas Shah


Ik had een soortgelijk probleem en ontdekte dat sommige van de geleverde antwoorden me slechts gedeeltelijk toegang gaven tot een geautomatiseerde oplossing. Het volgende is wat ik uiteindelijk gebruikte, hoop dat het helpt:

ssh -o "StrictHostKeyChecking no" -o PasswordAuthentication=no 10.x.x.x

Het voegt de sleutel toe aan known_hosts en vraagt ​​niet om het wachtwoord.


5
2017-10-21 17:27



Kwetsbaar voor MITM-aanvallen. U controleert de vingerafdruk niet. - Mnebuerquo
Niemand controleert de vingerafdruk. - Brendan Byrd
Dit is niet de manier om het te doen. MITM. - jameshfisher