Existuje způsob, jak programově získat otisk klíče serveru SSH bez ověření na to?

Snažím se ssh -v user@host false 2>&1 | grep "Server host key", ale čeká na heslo, pokud není nastaveno ověřování pomocí klíče.

Odpověď

Toho lze dosáhnout kombinací ssh-keyscan a 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 

(bohužel mnohem jednodušší ssh-keyscan host | ssh-keygen -l -f /dev/stdin nefunguje)

Komentáře

  • Možná ssh-keygen -l -f - <(ssh-keyscan host) ano?
  • OpenSSH > = 7.2 ssh-keyscan je schopen číst ze stdin: ssh-keyscan host | ssh-keygen -lf -
  • stačí udělat: ssh-keygen -l -f <(ssh-keyscan host)
  • ssh-keygen -l -f - funguje s očekáváním v ssh-keygen 7.2 a novějších verzích. Produkuje několik řádků komentářů k STDERR, které lze odfiltrovat, jak je uvedeno v od Anthony Geoghegana nebo ssh-keyscan host 2>/dev/null | ssh-keygen -l -f -
  • Nové verze openssh (minimálně 7,2) zobrazí otisk prstu jako SHA256 (např: 2048 SHA256:gYz11pP/v/SMzUD58jrZ+m1EFC1pvyMxvIrg4PYlvDY) Pokud to chcete ve starém formátu, zadejte -E md5 a uvidíte ‚ něco jako 2048 MD5:0b:f5:49:d2:69:a5:49:2c:d9:45:75:87:4d:a0:7d:33.

Odpověď

Nedávno jsem to musel udělat sám, takže jsem si myslel, že Přidejte odpověď, která ukazuje, jak toho lze dosáhnout (s verzemi OpenSSH 7.2 nebo novější ) v jednom řádku pomocí substituce procesu:

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

Následující text vysvětluje, jak tyto příkazy fungují, a zdůrazňuje některé rozdíly v chování mezi starší a novější verzí obslužných programů OpenSSH.

Načíst veřejné klíče hostitele

Příkaz ssh-keyscan byl vyvinut tak, aby uživatelé mohli získat veřejné klíče hostitele, aniž by se museli ověřovat na serveru SSH. Z jeho manuálové stránky:

ssh-keyscan je nástroj pro shromažďování veřejných ssh hostitelských klíčů řady hostitelé. Byl navržen jako pomůcka při vytváření a ověřování ssh_known_hosts souborů.

Typ klíče

Typ klíče, který se má načíst, se zadává pomocí možnosti -t.

  • rsa1 (zastaralé) Protokol SSH verze 1)
  • rsa
  • dsa
  • ecdsa (nejnovější verze OpenSSH)
  • ed25519 (nejnovější verze OpenSSH)

V moderních verzích OpenSSH jsou výchozí typy klíčů, které mají být načteny, rsa (od verze 5.1), ecdsa (od verze 6.0) a ed25519 (od verze 6.7).

Se staršími verzemi ssh-keyscan (před OpenSSH verze 5.1), výchozí typ klíče byl zastaralý rsa1 (protokol SSH 1), takže typy klíčů by musely být výslovně specifikovány:

ssh-keyscan -t rsa,dsa hostname 

Získejte hash otisků klíčů Base64

ssh-keyscan vytiskne klíč hostitele serveru SSH v Formát kódovaný Base64 . Chcete-li toto převést na hash otisku prstu, lze k vytištění otisku zadaného veřejného klíče použít nástroj ssh-keygen s možností -l.

Pokud používáte Bash, Zsh (nebo shell Korn), lze pro praktickou jednorázovou linii použít náhradu procesu :

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

Poznámka : U verzí OpenSSH před 7.2 jsou funkce, které ssh-keygen používá ke čtení soubory, nezvládal pojmenované kanály (FIFO) velmi dobře, takže tato metoda nefungovala, což vyžadovalo použití dočasných souborů.

Algoritmy hashování

Nedávné verze ssh-keygen print SHA256 otisky prstů klíčů. Chcete-li MD5 hash klíčových otisků serveru (staré chování), použijte -E:

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

Použití kanálu

Pokud použijete prostředí POSIX (například dash), který neobsahuje náhradu procesu, ostatní řešení využívající dočasné soubory budou fungovat. U novějších verzí OpenSSH (od 7.2) však lze použít jednoduchý kanál, protože ssh-keygen přijme - jako název souboru pro standardní vstupní proud, který umožňuje jednorázový příkaz potrubí.

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

Komentáře

  • Pěkné a důkladné odpověď, to je určitě lepší než mít dočasný soubor!Mohu navrhnout, abyste poskytli TL; DR na začátku s verzí substituce procesu, aby ji netrpěliví lidé našli rychleji? 🙂
  • Nezdá se, že by fungoval na Ubuntu 14.04 LTS; Zobrazuje se mi chyba “ / dev / fd / 63 není soubor veřejného klíče „. Subproces funguje.
  • @melleb Našel jsem totéž v systému 12.04, ke kterému mám přístup. Mám podezření, že ssh-keygen ze starších verzí OpenSSH má problém se čtením z kanálu FIFO / named. Až se dostanu do volného času, ‚ se na to podívám (a aktualizuji svou odpověď).
  • @melleb Poté, co jsem strávil čas stažením různých vydání zdrojového kódu a vložením ladicích printf příkazů do funkce do_fingerprint() jsem zjistil, že u verzí OpenSSH před 7.2 jsou funkce používané ssh-keygen ke čtení souborů nezvládl pojmenované kanály (FIFO) velmi dobře, takže metoda náhrady procesu nebude fungovat.
  • Funguje to, ale pokud ji použijete k ověření otisku prstu, uživatelé by si měli být vědomi toho, že ‚ sa podmínka závodu: otisk prstu, který kontrolujete pomocí tohoto příkazu, není nutně ‚ klíčem, který používáte načíst, pokud nevyložíte klíč, než na něj zavoláte ssh-keygen.

Odpovědět

poskytuje tuto schopnost pomocí skriptu ssh-hostkey.

Chcete-li vrátit šestnáctkový otisk klíče:

$ nmap [SERVER] --script ssh-hostkey 

Chcete-li vrátit obsah klíče:

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

Chcete-li vrátit vizuální bublinu klíče

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

Chcete-li vrátit všechny výše uvedené:

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

Zdroj: nmap docs

Komentáře

  • Předpokládají tyto příklady, že SSH vždy běží na portu 22? Co když ssh poslouchá na nestandardním portu?
  • @MartinVegter (parafrázuje Guarin42, kdo nemohl ‚ t komentář 🙂 nmap má možnost -p, která může specifikovat port, např. -p 22000. ‚ je také možné použít možnost -vv ke zvýšení výřečnosti (množství poskytovaných informací)

Odpověď

filezilla zobrazuje klíče hashované s md5 v hexadecimálním tvaru formát.

Chcete-li to najít na svém počítači ubuntu linux , použijte tento příkaz:

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

poznámka: nahraďte „localhost“ IP zařízením, které chcete zkontrolovat.

Komentáře

  • Toto fungovalo pro mě na Ubuntu 18, ale všimněte si, že získáte výsledky rozdílu pro localhost 127.0.0.1 nebo domain.tld. Zkontrolujte otisk prstu adresy URL, které vás zajímají ~!

Odpověď

Zde je skript prostředí (hlavně Bourne shell, ale používám klíčové slovo local, které je k dispozici ve většině moderních /bin/sh), které jsem k tomu napsal. Použijte jej jako ssh-hostkey hostname. Zobrazí se otisky prstů ve formátu sha256 i md5 pro všechny klíče hostitele pro daný název hostitele nebo IP adresu. Můžete také ručně zadat „md5 „or“ sha256 „jako druhý argument pouze k zobrazení konkrétního formátu.

Aby byl kompatibilní se staršími balíčky OpenSSH, používá místo pipingu dočasný soubor. (jak je popsáno v jiných odpovědích). Dočasný soubor používá /dev/shm (sdílená paměť), pokud je k dispozici.

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

Komentáře

  • Toto je pěkná ukázka zabalení nástrojů nižší úrovně s možnostmi příkazového řádku. Zahrnuje bonus k použití sdílená paměť /dev/shm, o které jsem nikdy nevěděl, že je to tak pohodlné. Děkujeme za sdílení !

Odpověď

Pro svůj vlastní server používám toto:

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) 

Odpověď

Jednoduchá odpověď , když již máte přístup na server je:

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

Nyní možná nepoužíváte klíč RSA: pokud při připojování, ssh vám říká

ECDSA klíčový otisk prstu je SHA256: XXXXX

Místo toho musíte použít /etc/ssh/ssh_host_ecdsa_key.pub. (upozornění _ecdsa_ ). Lze tedy sestavit univerzálnější příkaz se seznamem všech klíčů ( zdroj ):

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

Seznam můžete zapsat při nastavování serveru pro budoucí potřebu.Další možností je uložit je do záznamů DNS


Na stránce ssh-keygen (1):

-l Zobrazit otisk zadaného souboru veřejného klíče. U klíčů RSA a DSA se ssh-keygen pokusí najít odpovídající soubor veřejného klíče a vytiskne jeho otisk prstu. Pokud je zkombinováno s -v, je s otiskem prstu dodávána vizuální ASCII umělecká reprezentace klíče.

-f filename Určuje název souboru klíče.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *