Er der en måde at programmatisk få et SSH server nøgle fingeraftryk uden at godkende til det?

Jeg prøver ssh -v user@host false 2>&1 | grep "Server host key", men dette hænger med at vente på en adgangskode, hvis nøglebaseret godkendelse ikke er konfigureret.

Svar

Du kan gøre dette ved at kombinere ssh-keyscan og 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 

(desværre fungerer den meget enklere ssh-keyscan host | ssh-keygen -l -f /dev/stdin ikke)

Kommentarer

  • Måske gør ssh-keygen -l -f - <(ssh-keyscan host) dog?
  • OpenSSH > = 7.2 ssh-keyscan er i stand til at læse fra stdin: ssh-keyscan host | ssh-keygen -lf -
  • Bare gør: ssh-keygen -l -f <(ssh-keyscan host)
  • ssh-keygen -l -f - fungerer meget som forventet i ssh-keygen 7.2 og derover. Det producerer nogle kommentarlinjer til STDERR, der kan filtreres ud, som nævnt i svaret er af Anthony Geoghegan eller ssh-keyscan host 2>/dev/null | ssh-keygen -l -f -
  • Nye versioner af openssh (mindst 7.2) viser fingeraftrykket som SHA256 (f.eks: 2048 SHA256:gYz11pP/v/SMzUD58jrZ+m1EFC1pvyMxvIrg4PYlvDY) Hvis du vil have det i det gamle format, skal du levere -E md5 og du ‘ vil se noget som 2048 MD5:0b:f5:49:d2:69:a5:49:2c:d9:45:75:87:4d:a0:7d:33.

Svar

Jeg var for nylig nødt til at gøre dette selv, så jeg troede, at jeg tilføj et svar, der viser, hvordan dette kan gøres (med versioner af OpenSSH 7.2 eller nyere ) i en linje ved hjælp af proceserstatning:

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

Den følgende tekst forklarer, hvordan disse kommandoer fungerer, og fremhæver nogle af forskellene i adfærd mellem ældre og nyere versioner af OpenSSH-hjælpeprogrammer.

Hent offentlige værtsnøgler

Kommandoen ssh-keyscan blev udviklet, så brugerne kan få offentlige værtsnøgler uden at skulle godkende til SSH-serveren. Fra sin man-side:

ssh-keyscan er et værktøj til at samle de offentlige ssh-værtsnøgler til et antal værter. Det var designet til at hjælpe med at opbygge og verificere ssh_known_hosts filer.

Nøgletype

Den type nøgle, der skal hentes, angives ved hjælp af indstillingen -t.

  • rsa1 (forældet SSH-protokol version 1)
  • rsa
  • dsa
  • ecdsa (seneste versioner af OpenSSH)
  • ed25519 (seneste versioner af OpenSSH)

I moderne OpenSSH-udgivelser er de standard nøgletyper, der skal hentes, rsa (siden version 5.1), ecdsa (siden version 6.0) og ed25519 (siden version 6.7).

Med ældre versioner af ssh-keyscan (før OpenSSH version 5.1) var nøgletypen standard den forældede rsa1 (SSH Protocol 1) nøgletyperne skal specifikt specificeres:

ssh-keyscan -t rsa,dsa hostname 

Få fingeraftrykshash af Base64-nøgler

ssh-keyscan udskriver SSH-serverens værtsnøgle i Base64-kodet format. For at konvertere dette til et fingeraftryks-hash kan ssh-keygen -værktøjet bruges med dets -l -mulighed til at udskrive fingeraftryk fra den angivne offentlige nøgle.

Hvis du bruger Bash, Zsh (eller Korn-skallen), kan proceserstatning bruges til en praktisk one-liner:

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

Bemærk : Med versioner af OpenSSH før 7.2, skal de funktioner, der bruges af ssh-keygen læses filer, håndterede ikke navngivne rør (FIFOer) meget godt, så denne metode ville ikke fungere, hvilket kræver brug af midlertidige filer.

Hashing-algoritmer

Seneste versioner af ssh-keygen print SHA256 fingeraftryks hash af tasterne. For at få MD5 hashes af servernøglens fingeraftryk (den gamle adfærd), -E option kan bruges til at specificere hash-algoritmen:

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

Brug af en pipeline

Hvis du bruger en POSIX-shell (såsom dash) som ikke indeholder proceserstatning, fungerer de andre løsninger, der bruger midlertidige filer. Men med nyere versioner af OpenSSH (siden 7.2) kan en simpel pipeline bruges, da ssh-keygen accepterer - som et filnavn til standard inputstrøm, der muliggør en pipeline-kommando med en linje.

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

Kommentarer

  • Dejlig og grundig svar, dette er bestemt bedre end at have en midlertidig fil!Må jeg foreslå, at du giver en TL; DR i starten med procesudskiftningsversionen for at få utålmodige folk til at finde det hurtigere? 🙂
  • Ser ikke ud til at fungere på Ubuntu 14.04 LTS; Jeg får en fejl ” / dev / fd / 63 er ikke en offentlig nøglefil “. Underprocessen fungerer.
  • @melleb Jeg fandt det samme på et 12.04-system, som jeg har adgang til. Jeg formoder, at ssh-keygen fra ældre versioner af OpenSSH har problemer med at læse fra FIFO / navngivet rør. Jeg ‘ Jeg ser på dette (og opdaterer mit svar), når jeg får lidt fritid.
  • @melleb Efter at have brugt min tid på at downloade forskellige kildekodeudgivelser og indsætte fejlretning printf udsagn i do_fingerprint() -funktionen, fandt jeg, at med versioner af OpenSSH før 7.2, blev de funktioner, der blev brugt af ssh-keygen for at læse filer, håndterede ikke navngivne rør (FIFOer) meget godt, så procesudskiftningsmetoden ville ikke fungere.
  • Dette fungerer, men hvis det bruges til at bekræfte et fingeraftryk, brugere skal være opmærksomme på, at der ‘ en race-tilstand: det fingeraftryk, du kontrollerer med denne kommando, er ikke ‘ t nødvendigvis det for den nøgle, du hent, medmindre du dumper nøglen før du kalder ssh-keygen på den.

Svar

nmap giver denne mulighed ved at bruge scriptet ssh-hostkey.

Sådan returneres nøglen “s hexadecimale fingeraftryk:

$ nmap [SERVER] --script ssh-hostkey 

Sådan returneres nøglens indhold:

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

For at returnere nøglens visuelle boble

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

For at returnere alt det ovenstående:

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

Kilde: nmap docs

Kommentarer

  • Antager disse eksempler, at SSH altid kører på port 22? Hvad hvis ssh lytter til en ikke-standardport?
  • @MartinVegter (omskrivning af Guarin42, hvem kunne ikke ‘ t kommentar 🙂 nmap har -p mulighed, der kan angive en port, f.eks. -p 22000. ‘ er også muligt at bruge indstillingen -vv til at øge ordligheden (mængden af information givet)

Svar

filezilla viser nøgler hash med md5 i hexadecimal format.

for at finde dette på din ubuntu linux maskine, brug denne kommando:

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

note: udskift “localhost” med ip på den maskine, du vil kontrollere.

Kommentarer

  • Dette fungerede for mig på Ubuntu 18, men bemærk, du får forskelresultater for localhost 127.0.0.1 eller domain.tld. Tjek fingeraftrykket for den webadresse, du er bekymret med ~!

Svar

Her er et shell-script (hovedsageligt Bourne-skal, men bruger local nøgleord, som er tilgængeligt i de fleste moderne /bin/sh) Jeg har skrevet for at gøre dette. Brug det som ssh-hostkey hostname. Det viser både fingeraftryk fra sha256 og md5-format for alle værtsnøgler for det givne værtsnavn eller IP-adresse. Du kan også manuelt angive “md5 “eller” sha256 “som det andet argument for kun at vise det bestemte format.

Det bruger en midlertidig fil i stedet for piping for at gøre den kompatibel med ældre OpenSSH-pakker (som beskrevet i andre svar). Den midlertidige fil bruger /dev/shm (delt hukommelse) hvis tilgængelig.

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

Kommentarer

  • Dette er en god demo af indpakning af værktøjer på lavere niveau med kommandolinjemuligheder. Inkluderer en bonus på, hvordan man bruger delt hukommelse /dev/shm som jeg aldrig vidste var så praktisk at gøre. Tak for deling !

Svar

For min egen server bruger jeg dette:

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) 

Svar

Det enkle svar når du allerede har adgang til serveren er:

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

Nu bruger du muligvis ikke RSA-tasten: hvis ssh fortæller dig

ECDSA nøglefingeraftryk er SHA256: XXXXX

Du skal bruge /etc/ssh/ssh_host_ecdsa_key.pub i stedet. (bemærk _ecdsa_ ). En mere universel kommando, der viser alle nøgler, kan således konstrueres ( kilde ):

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

Du kan skrive listen ned, når du opretter serveren, til fremtidig reference.En anden mulighed er at gemme dem i DNS-poster


Fra ssh-keygen (1) manpage:

-l Vis fingeraftryk for den specificerede offentlige nøglefil. For RSA- og DSA-nøgler forsøger ssh-keygen at finde den matchende offentlige nøglefil og udskriver sit fingeraftryk. Hvis det kombineres med -v, leveres en visuel ASCII-kunstrepræsentation af nøglen med fingeraftrykket.

-f filename Angiver filnavnet på nøglefilen.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *