Is er een manier om programmatisch een vingerafdruk van de SSH-serversleutel te verkrijgen zonder em te verifiëren > naar het?

Ik “probeer ssh -v user@host false 2>&1 | grep "Server host key", maar dit blijft hangen terwijl ik wacht op een wachtwoord als key based auth niet is ingesteld.

Answer

Je zou dit kunnen doen door ssh-keyscan en ssh-keygen:

$ file=$(mktemp) $ ssh-keyscan host > $file 2> /dev/null $ ssh-keygen -l -f $file 521 de:ad:be:ef:de:ad:be:ef:de:ad:be:ef:de:ad:be:ef host (ECDSA) 4096 8b:ad:f0:0d:8b:ad:f0:0d:8b:ad:f0:0d:8b:ad:f0:0d host (RSA) $ rm $file 

(helaas werkt het veel eenvoudigere ssh-keyscan host | ssh-keygen -l -f /dev/stdin niet)

Reacties

  • Misschien doet ssh-keygen -l -f - <(ssh-keyscan host) dat wel?
  • OpenSSH > = 7.2 ssh-keyscan kan lezen van stdin: ssh-keyscan host | ssh-keygen -lf -
  • Gewoon doen: ssh-keygen -l -f <(ssh-keyscan host)
  • ssh-keygen -l -f - werkt zoals verwacht in ssh-keygen 7.2 en hoger. Het produceert enkele commentaarregels naar STDERR die kunnen worden uitgefilterd, zoals vermeld in het antwoord er door Anthony Geoghegan of ssh-keyscan host 2>/dev/null | ssh-keygen -l -f -
  • Nieuwe versies van openssh (minimaal 7.2) geven de vingerafdruk weer als SHA256 (bijv .: 2048 SHA256:gYz11pP/v/SMzUD58jrZ+m1EFC1pvyMxvIrg4PYlvDY) Als je het in het oude formaat wilt, geef dan -E md5 op en je ‘ zal iets zien als 2048 MD5:0b:f5:49:d2:69:a5:49:2c:d9:45:75:87:4d:a0:7d:33.

Antwoord

Ik moest dit onlangs zelf doen, dus ik dacht dat ik zou een antwoord toevoegen dat laat zien hoe dit gedaan kan worden (met versies van OpenSSH 7.2 of nieuwer ) op één regel met behulp van procesvervanging:

ssh-keygen -lf <(ssh-keyscan hostname 2>/dev/null) 

De volgende tekst legt uit hoe deze commandos werken en belicht enkele van de verschillen in gedrag tussen oudere en nieuwere versies van de OpenSSH-hulpprogrammas.

Openbare hostsleutels ophalen

Het ssh-keyscan commando is ontwikkeld zodat gebruikers publieke hostsleutels kunnen verkrijgen zonder zich te hoeven authenticeren bij de SSH-server. Van zijn man-pagina:

ssh-keyscan is een hulpprogramma voor het verzamelen van de openbare ssh-hostsleutels van een aantal gastheren. Het is ontworpen om te helpen bij het bouwen en verifiëren van ssh_known_hosts bestanden.

Sleuteltype

Het type sleutel dat moet worden opgehaald, wordt gespecificeerd met behulp van de -t optie.

  • rsa1 (verouderd SSH-protocolversie 1)
  • rsa
  • dsa
  • ecdsa (recente versies van OpenSSH)
  • ed25519 (recente versies van OpenSSH)

In moderne OpenSSH-releases zijn de standaard sleuteltypes die moeten worden opgehaald rsa (sinds versie 5.1), ecdsa (sinds versie 6.0), en ed25519 (sinds versie 6.7).

Met oudere versies van ssh-keyscan (vóór OpenSSH versie 5.1), het standaard sleuteltype was het verouderde rsa1 (SSH-protocol 1) dus de sleuteltypen moeten expliciet worden gespecificeerd:

ssh-keyscan -t rsa,dsa hostname 

Vingerafdruk-hashes van Base64-sleutels ophalen

ssh-keyscan drukt de hostsleutel van de SSH-server af in Base64-gecodeerd formaat. Om dit naar een vingerafdrukhash te converteren, kan het ssh-keygen hulpprogramma worden gebruikt met zijn -l optie om de vingerafdruk van de opgegeven openbare sleutel af te drukken.

Als je Bash, Zsh (of de Korn-shell) gebruikt, kan processubstitutie worden gebruikt voor een handige one-liner:

ssh-keygen -lf <(ssh-keyscan hostname 2>/dev/null) 

Opmerking : met versies van OpenSSH vóór 7.2, de functies gebruikt door ssh-keygen om te lezen bestanden, behandelde named pipes (FIFOs) niet erg goed, dus deze methode zou niet werken, waardoor het gebruik van tijdelijke bestanden nodig was.

Hashing-algoritmen

Recente versies van ssh-keygen print SHA256 vingerafdruk-hashes van de sleutels. Om MD5 hashes van de serversleutelvingerafdrukken te krijgen (het oude gedrag), de -E optie kan worden gebruikt om het hash-algoritme te specificeren:

ssh-keygen -E md5 -lf <(ssh-keyscan hostname 2>/dev/null) 

Een pijplijn gebruiken

Als een POSIX-shell wordt gebruikt (zoals dash) die geen procesvervanging biedt, zullen de andere oplossingen die tijdelijke bestanden gebruiken, werken. Met nieuwere versies van OpenSSH (sinds 7.2) kan echter een eenvoudige pijplijn worden gebruikt aangezien ssh-keygen - als bestandsnaam voor de standaard invoerstroom, waardoor een pijplijnopdracht van één regel mogelijk is.

ssh-keyscan hostname 2>/dev/null | ssh-keygen -E md5 -lf - 

Reacties

  • Mooi en grondig antwoord, dit is zeker beter dan een tijdelijk bestand!Mag ik u aanraden om in het begin een TL; DR op te geven met de procesvervangingsversie, zodat ongeduldige mensen het sneller vinden? 🙂
  • Lijkt niet te werken op Ubuntu 14.04 LTS; Ik krijg een foutmelding ” / dev / fd / 63 is geen bestand met openbare sleutel “. Het subproces werkt.
  • @melleb Ik vond hetzelfde op een 12.04-systeem waartoe ik toegang heb. Ik vermoed dat ssh-keygen van oudere versies van OpenSSH problemen heeft met het lezen van de FIFO / named pipe. Ik ‘ zal dit onderzoeken (en mijn antwoord bijwerken) wanneer ik wat vrije tijd krijg.
  • @melleb Na mijn lange tijd besteed te hebben aan het downloaden van verschillende broncode-releases en het invoegen van debugging printf statements in de do_fingerprint() functie, ik ontdekte dat met versies van OpenSSH vóór 7.2, de functies gebruikt door ssh-keygen om bestanden te lezen, behandelde named pipes (FIFOs) niet erg goed, dus de procesvervangingsmethode zou niet werken.
  • Dit werkt, maar als je het gebruikt om een vingerafdruk te verifiëren, gebruikers moeten zich ervan bewust zijn dat er ‘ een racevoorwaarde is: de vingerafdruk die u controleert met deze opdracht is niet ‘ die van de sleutel die u fetch, tenzij je de sleutel dump voordat je ssh-keygen erop aanroept.

Answer

nmap biedt deze mogelijkheid door het ssh-hostkey -script te gebruiken.

Om de hexadecimale vingerafdruk van de sleutel terug te geven:

$ nmap [SERVER] --script ssh-hostkey 

Om de inhoud van de sleutel terug te geven:

$ nmap [SERVER] --script ssh-hostkey --script-args ssh_hostkey=full 

Om de visuele ballon van de sleutel terug te geven

$ nmap [SERVER] --script ssh-hostkey --script-args ssh_hostkey="visual bubble" 

Om al het bovenstaande te retourneren:

$ nmap [SERVER] --script ssh-hostkey --script-args ssh_hostkey=all 

Bron: nmap docs

Opmerkingen

  • Gaan deze voorbeelden aan dat SSH altijd op poort 22 draait? Wat als ssh luistert op een niet-standaard poort?
  • @MartinVegter (parafraseert Guarin42, wie kon ‘ t comment 🙂 nmap heeft de -p optie die een poort kan specificeren, bijv. -p 22000. ‘ s is ook mogelijk om de -vv optie te gebruiken om de breedsprakigheid (hoeveelheid gegeven informatie) te vergroten

Answer

filezilla toont sleutels gehasht met md5 in hexadecimaal formaat.

om dit op uw ubuntu linux machine te vinden, gebruikt u dit commando:

ssh-keygen -l -E md5 -f <(ssh-keyscan localhost 2>/dev/null) 

opmerking: vervang “localhost” door het ip-adres van de machine die u wilt controleren.

Opmerkingen

  • Dit werkte voor mij op Ubuntu 18, maar let op, je krijgt verschilresultaten voor localhost 127.0.0.1 of domain.tld. Controleer de vingerafdruk voor de URL waar u zich zorgen over maakt ~!

Answer

Hier is een shellscript (voornamelijk Bourne-shell maar met behulp van local sleutelwoord, dat beschikbaar is in de meeste moderne /bin/sh) die ik heb geschreven om dit te doen. Gebruik het als ssh-hostkey hostname. Het toont zowel de sha256- als de md5-vingerafdrukken voor alle hostsleutels voor de opgegeven hostnaam of het opgegeven IP-adres. U kunt ook handmatig “md5 specificeren “of” sha256 “als het tweede argument om alleen dat specifieke formaat weer te geven.

Het gebruikt een tijdelijk bestand in plaats van piping om het compatibel te maken met oudere OpenSSH-pakketten (zoals beschreven in andere antwoorden). Het tijdelijke bestand gebruikt /dev/shm (gedeeld geheugen) indien beschikbaar.

#!/bin/sh usage () { printf "%s\n" "Usage: ssh-hostkey HOSTNAME [FPRINTHASH]" } ssh_hostkey () { local host="$1" local fprinthash="$2" local tmp= case "$host" in -h|--help|"") usage >&2 return 1 ;; esac case "$fprinthash" in md5|sha256|"") true;; *) usage >&2 printf "%s\n" "Fingerprint hash may be "md5" or "sha256"" >&2 return 2 ;; esac if test -d /dev/shm then tmp="$(mktemp -d -p /dev/shm)" else tmp="$(mktemp -d)" fi trap "trap - INT TERM EXIT; rm -rf "$tmp"" INT TERM EXIT ssh-keyscan "$host" > "$tmp/f" 2> /dev/null case "$fprinthash" in sha256|"") ssh-keygen -l -f "$tmp/f" 2> /dev/null;; esac case "$fprinthash" in md5|"") ssh-keygen -l -E md5 -f "$tmp/f" 2> /dev/null;; esac trap - INT TERM EXIT rm -rf "$tmp" > /dev/null 2>&1 } ssh_hostkey "$@" 

Opmerkingen

  • Dit is een mooie demo van het verpakken van tools op een lager niveau met opdrachtregelopties. Bevat een bonus voor het gebruik van gedeeld geheugen /dev/shm waarvan ik nooit wist dat het zo handig was om te doen. Bedankt voor het delen !

Antwoord

Voor mijn eigen server gebruik ik dit:

ssh-keygen -l -E md5 -f <(cat /etc/ssh/ssh_host_*_key.pub) ssh-keygen -l -E sha256 -f <(cat /etc/ssh/ssh_host_*_key.pub) 

Antwoord

Het simpele antwoord als je al toegang hebt naar de server is:

ssh-keygen -lf /etc/ssh/ssh_host_rsa_key.pub 

Het kan zijn dat je de RSA-sleutel niet gebruikt: als bij het verbinden, ssh vertelt je

ECDSA sleutelvingerafdruk is SHA256: XXXXX

U moet in plaats daarvan /etc/ssh/ssh_host_ecdsa_key.pub gebruiken. (opmerking _ecdsa_ ). Een meer universele opdracht die alle sleutels opsomt, kan dus worden geconstrueerd ( source ):

for f in /etc/ssh/ssh_host_*_key.pub; do ssh-keygen -lf "$f"; done 

U kunt de lijst noteren bij het opzetten van de server, voor toekomstig gebruik.Een andere optie is om op te slaan in DNS-records


Van de manpage ssh-keygen (1):

-l Vingerafdruk van opgegeven bestand met openbare sleutel weergeven. Voor RSA- en DSA-sleutels probeert ssh-keygen het overeenkomende openbare sleutelbestand te vinden en drukt zijn vingerafdruk af. Indien gecombineerd met -v, wordt een visuele ASCII-kunstweergave van de sleutel geleverd met de vingerafdruk.

-f filename Specificeert de bestandsnaam van het sleutelbestand.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *