Onko ohjelmallisesti mahdollista saada SSH-palvelimen avaimen sormenjälki todentamatta siihen?

Yritän ssh -v user@host false 2>&1 | grep "Server host key", mutta tämä odottaa salasanan odottamista, jos avainpohjaista todennusta ei ole määritetty.

Vastaus

Voit tehdä tämän yhdistämällä ssh-keyscan ja 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 

(valitettavasti paljon yksinkertaisempi ssh-keyscan host | ssh-keygen -l -f /dev/stdin ei toimi)

Kommentit

  • Ehkä ssh-keygen -l -f - <(ssh-keyscan host) kuitenkin?
  • OpenSSH > = 7.2 ssh-keyscan pystyy lukemaan stdin: stä: ssh-keyscan host | ssh-keygen -lf -
  • Tee vain: ssh-keygen -l -f <(ssh-keyscan host)
  • ssh-keygen -l -f - toimii paljon odotetusti ssh-keygen 7.2: ssä ja uudemmissa. Se tuottaa joitain kommenttirivejä STDERR: ään, jotka voidaan suodattaa pois, kuten vastauksessa mainitaan kirjoittanut Anthony Geoghegan tai ssh-keyscan host 2>/dev/null | ssh-keygen -l -f -
  • openssh: n uudet versiot (vähintään 7.2) näyttävät sormenjäljen muodossa SHA256 (esim .: 2048 SHA256:gYz11pP/v/SMzUD58jrZ+m1EFC1pvyMxvIrg4PYlvDY) Jos haluat sen vanhaan muotoon, anna -E md5 ja näet ’ näette jotain 2048 MD5:0b:f5:49:d2:69:a5:49:2c:d9:45:75:87:4d:a0:7d:33.

vastaus

Piti tehdä tämä hiljattain itse, joten ajattelin Lisää vastaus, joka näyttää, kuinka tämä voidaan tehdä ( OpenSSH 7.2 tai uudempi versioilla) yhdellä rivillä käyttämällä prosessikorvausta:

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

Seuraava teksti selittää näiden komentojen toiminnan ja tuo esiin joitain OpenSSH-apuohjelmien vanhempien ja uudempien versioiden käyttäytymiseroja.

Hae julkiset isäntäavaimet

ssh-keyscan -komento on kehitetty siten, että käyttäjät voivat hankkia julkiset isäntäavaimet ilman todentamista SSH-palvelimelle. Man -sivulta:

ssh-keyscan on apuohjelma useiden julkisten ssh-isäntäavainten keräämiseen isännät. Se on suunniteltu auttamaan ssh_known_hosts -tiedostojen rakentamisessa ja tarkistamisessa.

Avaintyyppi

Haettava avaimen tyyppi määritetään -t -vaihtoehdon avulla.

  • rsa1 (vanhentunut SSH-protokollaversio 1)
  • rsa
  • dsa
  • ecdsa (viimeisimmät OpenSSH-versiot)
  • ed25519 (viimeisimmät OpenSSH-versiot)

Nykyaikaisissa OpenSSH-julkaisuissa haettavat oletus avaintyypit ovat rsa (versiosta 5.1 lähtien), ecdsa (versiosta 6.0 lähtien) ja ed25519 (versiosta 6.7 lähtien).

iv id: n vanhemmilla versioilla = ”959be47752”>

(ennen OpenSSH-versiota 5.1) oletus avaintyyppi oli vanhentunutrsa1(SSH-protokolla 1), joten avaintyypit olisi määriteltävä erikseen:

ssh-keyscan -t rsa,dsa hostname 

Hae Base64-avainten sormenjälkien tiivistelmät

ssh-keyscan tulostaa SSH-palvelimen isäntäavaimen kansioon Base64-koodattu muoto. Jos haluat muuntaa tämän sormenjälkikoodiksi, ssh-keygen -apuohjelmaa voidaan käyttää sen -l -vaihtoehdolla määritetyn julkisen avaimen sormenjäljen tulostamiseen.

Jos käytät Bashia, Zsh: ää (tai Korn-kuorta), prosessikorvausta voidaan käyttää kätevälle yhden linjan linjalle:

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

Huomautus : Jos OpenSSH-versio on ennen versiota 7.2, ssh-keygen: n käyttämät toiminnot tiedostoja, ei käsitellyt nimettyjä putkia (FIFO) kovin hyvin, joten tämä menetelmä ei toiminut, mikä vaatii väliaikaisten tiedostojen käyttöä.

Hajautusalgoritmit

Viimeisimmät versiot ssh-keygen print SHA256 avainten sormenjälkien hajautus. Saadaksesi MD5 palvelinavaimen sormenjälkien hajautusarvot (vanha käyttäytyminen), -E -vaihtoehtoa voidaan käyttää hash-algoritmin määrittämiseen:

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

Putkilinjan käyttäminen

Jos käytät POSIX-kuorta (kuten dash), joka ei sisällä prosessin korvaamista, muut väliaikaisia tiedostoja käyttävät ratkaisut toimivat. OpenSSH: n uudemmissa versioissa (vuodesta 7.2 lähtien) voidaan kuitenkin käyttää yksinkertaista putkistoa, koska ssh-keygen hyväksyy - tiedostonimeksi tavallinen tulovirta, sallien yksirivisen putkikomennon.

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

Kommentit

  • Hyvää ja perusteellista vastaus, tämä on varmasti parempi kuin väliaikainen tiedosto!Voinko ehdottaa, että toimitat TL; DR: n alussa prosessikorvausversiolla, jotta kärsimättömät ihmiset löytävät sen nopeammin? 🙂
  • Ei tunnu toimivan Ubuntu 14.04 LTS: ssä; Saan virheen ” / dev / fd / 63 ei ole julkisen avaimen tiedosto ”. Aliprosessi toimii.
  • @melleb Löysin saman 12.04-järjestelmästä, johon minulla on pääsy. Epäilen, että ssh-keygen OpenSSH: n vanhemmista versioista on ongelma lukemisessa FIFO / named pipe -palvelusta. ’ Tarkastelen tätä (ja päivitän vastaukseni), kun saan vapaa-aikaa.
  • @melleb Kun olen viettänyt luch-aikani lataamalla erilaisia lähdekoodijulkaisuja ja lisäämällä virheenkorjaus printf -lausekkeet funktioon do_fingerprint() havaitsin, että OpenSSH-versioiden ennen versiota 7.2 funktiot, joita ssh-keygen ei lukenut tiedostoja, ei käsitellyt nimettyjä putkia (FIFO) kovin hyvin, joten prosessin korvausmenetelmä ei toiminut.
  • Tämä toimii, mutta jos sitä käytetään sormenjäljen vahvistamiseen, käyttäjien tulisi olla tietoisia siitä, että ’ sa kilpailuehto: tällä komennolla tarkistamasi sormenjälki ei ole välttämättä avaimesi hae, ellet tyhjennä avainta ennen kuin soitat ssh-keygenille.

Vastaa

nmap tarjoaa tämän kyvyn käyttämällä komentoa ssh-hostkey.

Avaimen heksadesimaalisen sormenjäljen palauttaminen:

$ nmap [SERVER] --script ssh-hostkey 

Avaimen sisällön palauttaminen:

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

Palaa avaimen visuaalinen kupla

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

Kaikkien yllä olevien palauttaminen:

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

Lähde: nmap-asiakirjat

kommentit

  • Oletetaanko näiden esimerkkien mukaan, että SSH on aina käynnissä portissa 22? Entä jos ssh kuuntelee epätyypillisessä portissa?
  • @MartinVegter (muotoilemalla Guarin42, joka ei voinut ’ t kommentti 🙂 nmapissa on vaihtoehto -p, joka voi määrittää portin, esim. -p 22000. ’ s myös -vv -vaihtoehdon avulla voidaan lisätä sanattavuutta (annettavan tiedon määrää)

vastaus

filezilla näyttää avaimet hajautettu md5: llä heksadesimaalilla -muoto.

löytääksesi tämän ubuntu linux koneellasi, käytä tätä komentoa:

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

Huomaa: korvaa ”localhost” tarkistettavan koneen ip: llä.

Kommentit

  • Tämä toimi minulle Ubuntu 18: ssa, mutta huomaa, että saat erituloksia haulle localhost 127.0.0.1 tai domain.tld. Tarkista sen URL-osoitteen sormenjälki, josta olet ~!

Vastaa

Tässä on komentotulkkikomento (pääasiassa Bourne-kuori, mutta käyttää local -avainsanaa, joka on saatavana nykyaikaisimmissa /bin/sh). Olen kirjoittanut tekemään tämän. Käytä sitä kuten ssh-hostkey hostname. Se näyttää sekä sha256- että md5-muotoiset sormenjäljet kaikille isäntänäppäimille annetulle isäntänimelle tai IP-osoitteelle. Voit myös määrittää manuaalisesti ”md5 ”tai” sha256 ”toisena argumenttina vain kyseisen muodon näyttämiseksi.

Se käyttää väliaikaista tiedostoa putkiston sijasta, jotta se olisi yhteensopiva vanhempien OpenSSH-pakettien kanssa. (kuten muissa vastauksissa on kuvattu). Väliaikainen tiedosto käyttää /dev/shm (jaettua muistia), jos käytettävissä.

#!/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 "$@" 

Kommentit

  • Tämä on hieno esittely alemman tason työkalujen käärimisestä komentorivivaihtoehdoilla. Sisältää bonuksen käytön jaettu muisti /dev/shm jota en koskaan tiennyt olevan niin kätevää. Kiitos jakamisesta !

Vastaa

Omassa palvelimessa käytän tätä:

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) 

Vastaus

Yksinkertainen vastaus kun sinulla on jo käyttöoikeus palvelimelle on:

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

Nyt et ehkä käytä RSA-avainta: jos muodostat yhteyden, ssh kertoo sinulle

ECDSA -avaimen sormenjälki on SHA256: XXXXX

Sen sijaan on käytettävä /etc/ssh/ssh_host_ecdsa_key.pub. (huomaa _ecdsa_ ). Täten voidaan rakentaa yleisempi komento, joka listaa kaikki avaimet ( lähde ):

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

Voit kirjoittaa luettelon palvelinta asennettaessa myöhempää tarvetta varten.Toinen vaihtoehto on tallentaa ne DNS-tietueisiin


ssh-keygen (1) -sivulta:

-l Näytä määritetyn julkisen avaimen tiedoston sormenjälki. RSA- ja DSA-avaimille ssh-keygen yrittää löytää vastaavan julkisen avaimen tiedoston ja tulostaa sen sormenjäljen. Yhdistettynä -v: ään sormenjälki toimitetaan avaimen visuaalinen ASCII-esitys.

-f filename Määrittää avaintiedoston tiedostonimen.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *