Czy istnieje sposób na programowe uzyskanie odcisku cyfrowego klucza serwera SSH bez uwierzytelniania do niego?

Próbuję ssh -v user@host false 2>&1 | grep "Server host key", ale to zawiesza się w oczekiwaniu na hasło, jeśli uwierzytelnianie za pomocą klucza nie jest skonfigurowane.

Odpowiedź

Możesz to zrobić, łącząc ssh-keyscan i 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 

(niestety znacznie prostszy ssh-keyscan host | ssh-keygen -l -f /dev/stdin nie działa)

Komentarze

  • Może ssh-keygen -l -f - <(ssh-keyscan host) tak jest?
  • OpenSSH > = 7.2 ssh-keyscan może czytać ze standardowego wejścia: ssh-keyscan host | ssh-keygen -lf -
  • Po prostu zrób: ssh-keygen -l -f <(ssh-keyscan host)
  • ssh-keygen -l -f - działa zgodnie z oczekiwaniami w ssh-keygen 7.2 i nowszych. Tworzy pewne wiersze komentarzy do STDERR, które można odfiltrować, jak wspomniano w answ er autorstwa Anthonyego Geoghegana lub ssh-keyscan host 2>/dev/null | ssh-keygen -l -f -
  • Nowe wersje openssh (przynajmniej 7.2) będą wyświetlać odcisk palca jako SHA256 (np .: 2048 SHA256:gYz11pP/v/SMzUD58jrZ+m1EFC1pvyMxvIrg4PYlvDY) Jeśli chcesz, aby był w starym formacie, podaj -E md5, a ' zobaczysz coś takiego jak 2048 MD5:0b:f5:49:d2:69:a5:49:2c:d9:45:75:87:4d:a0:7d:33.

Odpowiedź

Ostatnio musiałem to zrobić samodzielnie, więc pomyślałem, że dodaj odpowiedź, która pokazuje, jak można to zrobić (z wersjami OpenSSH 7.2 lub nowszymi ) w jednym wierszu przy użyciu podstawiania procesu:

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

Poniższy tekst wyjaśnia, jak działają te polecenia i podkreśla niektóre różnice w zachowaniu między starszymi i nowszymi wersjami narzędzi OpenSSH.

Pobierz publiczne klucze hosta

Polecenie ssh-keyscan zostało opracowane, aby użytkownicy mogli uzyskać publiczne klucze hosta bez konieczności uwierzytelniania na serwerze SSH. Ze strony podręcznika:

ssh-keyscan to narzędzie do gromadzenia publicznych kluczy hosta ssh z wielu zastępy niebieskie. Został zaprojektowany, aby ułatwić tworzenie i weryfikację plików ssh_known_hosts.

Typ klucza

Typ klucza do pobrania jest określany za pomocą opcji -t.

  • rsa1 (przestarzałe Protokół SSH w wersji 1)
  • rsa
  • dsa
  • ecdsa (najnowsze wersje OpenSSH)
  • ed25519 (najnowsze wersje OpenSSH)

We współczesnych wydaniach OpenSSH domyślne typy kluczy do pobrania to rsa (od wersji 5.1), ecdsa (od wersji 6.0) i ed25519 (od wersji 6.7).

Ze starszymi wersjami ssh-keyscan (przed wersją OpenSSH 5.1) domyślnym typem klucza był nieaktualny rsa1 (protokół SSH 1), więc typy kluczy musiałyby zostać wyraźnie określone:

ssh-keyscan -t rsa,dsa hostname 

Pobierz skróty linii papilarnych kluczy Base64

ssh-keyscan drukuje klucz hosta serwera SSH w Format zakodowany w Base64 . Aby przekonwertować to na skrót odcisków palców, można użyć narzędzia ssh-keygen z opcją -l do wydrukowania odcisku palca określonego klucza publicznego.

Jeśli używasz Bash, Zsh (lub powłoki Korna), podstawianie procesów może być użyte jako poręczny jednolinijkowy:

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

Uwaga : w wersjach OpenSSH starszych niż 7.2 funkcje używane przez ssh-keygen do czytania files, nie radził sobie zbyt dobrze z nazwanymi potokami (FIFO), więc ta metoda nie zadziała, co wymaga użycia plików tymczasowych.

Algorytmy haszujące

Najnowsze wersje ssh-keygen print SHA256 skróty linii papilarnych kluczy. Aby uzyskać MD5 skrótów odcisków cyfrowych klucza serwera (stare zachowanie), -E może służyć do określenia algorytmu haszującego:

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

Używanie potoku

Jeśli używasz powłoki POSIX (takiej jak dash), który nie obsługuje podstawiania procesów, inne rozwiązania wykorzystujące pliki tymczasowe będą działać. Jednak w nowszych wersjach OpenSSH (od 7.2) można użyć prostego potoku, ponieważ ssh-keygen zaakceptuje - jako nazwę pliku dla standardowy strumień wejściowy, pozwalający na jednowierszowe polecenie potoku.

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

Komentarze

  • Ładnie i dokładnie odpowiedź, z pewnością jest to lepsze niż posiadanie pliku tymczasowego!Czy mogę zasugerować dostarczenie TL; DR na początku z wersją zastępującą proces, aby niecierpliwi ludzie mogli go szybciej znaleźć? 🙂
  • Wydaje się, że nie działa na Ubuntu 14.04 LTS; Pojawia się błąd ” / dev / fd / 63 nie jest plikiem klucza publicznego „. Podproces działa.
  • @melleb Znalazłem to samo w systemie 12.04, do którego mam dostęp. Podejrzewam, że ssh-keygen ze starszych wersji OpenSSH ma problem z odczytem z potoku FIFO / nazwanego. ' przyjrzę się temu (i zaktualizuję odpowiedź), gdy będę miał trochę wolnego czasu.
  • @melleb Po spędzeniu dużo czasu na pobieraniu różnych wersji kodu źródłowego i wstawiając instrukcje debugowania printf w funkcji do_fingerprint(), stwierdziłem, że w wersjach OpenSSH starszych niż 7.2 funkcje używane przez ssh-keygen do odczytu plików, nie radził sobie zbyt dobrze z nazwanymi potokami (FIFO), więc metoda podstawiania procesów nie zadziała.
  • To działa, ale jeśli używasz go do weryfikacji odcisku palca, użytkownicy powinni być świadomi, że ' sytuacja wyścigu: odcisk palca sprawdzany za pomocą tego polecenia nie jest ' t koniecznie pobrać, chyba że zrzucisz klucz przed wywołaniem na nim ssh-keygen.

Odpowiedź

zapewnia tę możliwość za pomocą skryptu ssh-hostkey.

Aby zwrócić szesnastkowy odcisk palca klucza:

$ nmap [SERVER] --script ssh-hostkey 

Aby zwrócić zawartość klucza:

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

Aby zwrócić wizualną bańkę klucza

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

Aby zwrócić wszystkie powyższe elementy:

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

Źródło: nmap docs

Komentarze

  • Czy w tych przykładach założono, że SSH zawsze działa na porcie 22? Co jeśli ssh nasłuchuje na niestandardowym porcie?
  • @MartinVegter (parafrazując Guarin42, który nie może ' t komentarz 🙂 nmap ma opcję -p, która może określać port, np. -p 22000. ' można również użyć opcji -vv w celu zwiększenia szczegółowości (ilości podanych informacji)

Odpowiedź

filezilla wyświetla klucze zaszyfrowane za pomocą md5 w formacie szesnastkowym format.

aby znaleźć to na ubuntu linux , użyj tego polecenia:

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

uwaga: zamień „localhost” na adres IP maszyny, którą chcesz sprawdzić.

Komentarze

  • U mnie to zadziałało na Ubuntu 18, ale pamiętaj, że wyniki będą się różnić dla localhost 127.0.0.1 lub domain.tld. Sprawdź odcisk palca adresu URL, którego jesteś zainteresowany ~!

Odpowiedź

Oto skrypt powłoki (głównie Powłoka Bournea, ale ze słowem kluczowym local, które jest dostępne w większości współczesnych /bin/sh). Napisałem, żeby to zrobić. Używaj tego jak ssh-hostkey hostname. Pokaże odciski palców w formacie sha256 i md5 dla wszystkich kluczy hosta dla podanej nazwy hosta lub adresu IP. Możesz również ręcznie określić „md5 „lub” sha256 „jako drugi argument, aby wyświetlić tylko ten konkretny format.

Używa pliku tymczasowego zamiast potoku, aby był zgodny ze starszymi pakietami OpenSSH (jak opisano w innych odpowiedziach). Plik tymczasowy używa /dev/shm (pamięć współdzielona), jeśli jest dostępna.

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

Komentarze

  • To jest fajne demo owijania narzędzi niższego poziomu opcjami wiersza poleceń. Zawiera premię dotyczącą używania pamięć współdzielona /dev/shm, o której nigdy nie wiedziałem, że jest tak wygodna. Dzięki za udostępnienie !

Odpowiedź

Dla własnego serwera używam tego:

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) 

Odpowiedź

Prosta odpowiedź jeśli masz już dostęp do serwera to:

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

Teraz możesz nie używać klucza RSA: jeśli podczas łączenia, ssh mówi

ECDSA odcisk cyfrowy klucza to SHA256: XXXXX

Zamiast tego należy użyć /etc/ssh/ssh_host_ecdsa_key.pub. (uwaga _ecdsa_ ). W ten sposób można skonstruować bardziej uniwersalne polecenie, które zawiera listę wszystkich kluczy ( źródło ):

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

Możesz zapisać listę podczas konfigurowania serwera, aby móc z niej skorzystać w przyszłości.Inną opcją jest przechowywanie ich w rekordach DNS


Ze strony podręcznika ssh-keygen (1):

-l Pokaż odcisk palca określonego pliku klucza publicznego. W przypadku kluczy RSA i DSA ssh-keygen próbuje znaleźć pasujący plik klucza publicznego i drukuje swój odcisk palca. W połączeniu z -v, wizualna reprezentacja klucza w formacie ASCII jest dostarczana wraz z odciskiem palca.

-f filename Określa nazwę pliku klucza.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *