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
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ówssh_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 funkcjido_fingerprint()
, stwierdziłem, że w wersjach OpenSSH starszych niż 7.2 funkcje używane przezssh-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
lubdomain.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.
ssh-keygen -l -f - <(ssh-keyscan host)
tak jest?ssh-keyscan host | ssh-keygen -lf -
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 lubssh-keyscan host 2>/dev/null | ssh-keygen -l -f -
2048 SHA256:gYz11pP/v/SMzUD58jrZ+m1EFC1pvyMxvIrg4PYlvDY
) Jeśli chcesz, aby był w starym formacie, podaj-E md5
, a ' zobaczysz coś takiego jak2048 MD5:0b:f5:49:d2:69:a5:49:2c:d9:45:75:87:4d:a0:7d:33
.