Co to jest odcisk palca klucza SSH i jak jest generowany?

128

Zawsze widzę, że otrzymuję ten komunikat, gdy wchodzę sshna nową maszynę:

12:f8:7e:78:61:b4:bf:e2:de:24:15:96:4e:d4:72:53

Co to oznacza? Czy każda maszyna będzie miała za każdym razem ten sam odcisk palca?

Jak generowane są te odciski palców? Od jakich parametrów zależą?

Zestaw Ho
źródło

Odpowiedzi:

65

Odcisk palca jest oparty na kluczu publicznym hosta, zwykle oparty na pliku „/etc/ssh/ssh_host_rsa_key.pub”. Zasadniczo jest to łatwe do identyfikacji / weryfikacji hosta, z którym się łączysz.

Jeśli odcisk palca ulegnie zmianie, urządzenie, z którym się łączysz, zmieniło swój klucz publiczny. To może nie być złą rzeczą (dzieje się to po ponownej instalacji ssh), ale może również oznaczać, że łączysz się z innym komputerem w tej samej domenie / adresie IP (dzieje się to, gdy łączysz się za pomocą usługi równoważenia obciążenia) lub są atakowane przez man-in-the-middle, w którym atakujący w jakiś sposób przechwytuje / przekierowuje twoje połączenie ssh, aby połączyć się z innym hostem, który może szpiegować twojego użytkownika / pw.

Konkluzja: jeśli zostaniesz ostrzeżony o zmianie odcisku palca, bądź ostrożny i dokładnie sprawdź, czy faktycznie łączysz się z właściwym hostem za pośrednictwem bezpiecznego połączenia. Chociaż przez większość czasu jest to nieszkodliwe, może to wskazywać na potencjalny problem

Zobacz: http://www.lysium.de/blog/index.php?/archives/186-How-to-get-ssh-server-fingerprint-information.html
i: http://en.wikipedia.org/ wiki / Public_key_fingerprint

madmaze
źródło
5
„... bądź ostrożny i sprawdź dwukrotnie, czy faktycznie łączysz się z właściwym hostem za pośrednictwem bezpiecznego połączenia” - głupie pytanie, ale jak możesz to zrobić łatwo?
Savara,
1
@Savara Gdy łączysz się z serwerem SSH, z którym się wcześniej nie łączyłeś, powinieneś poprosić o klucz publiczny serwera SSH od administratora serwera. Administrator serwera poda ci fragment tekstu. Powinieneś dołączyć ten tekst do pliku ~/.ssh/known_hosts. W ten sposób, gdy połączysz się z serwerem, twój klient SSH rozpozna ten serwer, ponieważ zapisałeś jego klucz publiczny known_hosts. Dlatego tak naprawdę nigdy nie powinieneś mówić „tak”, gdy klient SSH mówi „Nie można ustalić autentyczności hosta”. Zawsze należy wcześniej dodać klucz publiczny serwera.
Utku
@Savara Jeśli to zrobisz, będziesz wiedzieć, że dzieje się coś podejrzanego, gdy twój klient SSH mówi ci „Nie można ustalić autentyczności klienta” lub gdy mówi ci „Klucz publiczny serwera został zmieniony”. Dlatego zawsze należy wcześniej dodać klucz publiczny serwera do ~/.ssh/known_hostspliku i nigdy nie mówić tak, gdy klient SSH powie ci „Nie można ustalić autentyczności klienta” lub gdy powie ci „Klucz publiczny serwera został zmieniono ”.
Utku
3
Tak, jestem w pełni świadomy, jak działa mechanika przeglądania odcisków palców SSH, ale w dużej części czasu nie masz możliwości pobrania odcisku palca innym kanałem. TOFU jest niestety najlepszym, co często dostajemy.
Savara,
Czy istnieje sposób na sprawdzenie autentyczności, nawet po odpowiedzi „tak”?
wymiana
104

Możesz wygenerować odcisk palca dla klucza publicznego za pomocą ssh-keygen:

ssh-keygen -lf /path/to/key.pub

Konkretny przykład (jeśli używasz klucza publicznego RSA):

$ ssh-keygen -lf ~/.ssh/id_rsa.pub
2048 00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff /Users/username/.ssh/id_rsa.pub (RSA)

Pierwsza część (2048)to długość klucza w bitach, druga część (00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff)to odcisk palca klucza publicznego, a trzecia część to lokalizacja samego pliku klucza publicznego.

Benjamin Oakes
źródło
czy wiesz, jak przetłumaczyć na ten format z tego klucza publicznego na 12: f8: 7e: 78: 61: b4: bf: e2: de: 24: 15: 96: 4e: d4: 72: 53?
Kit Ho
@KitHo Nie jestem pewien, czy rozumiem twoje pytanie. Zaktualizowałem przykład, ponieważ myślę, że ssh-keygen -lfzrobię to, co chcesz.
Benjamin Oakes
5
Podczas SSH-owania na nowej maszynie to, co widzi, to nie odcisk palca użytkownika, ale odcisk palca gospodarza. Lepszym przykładem jest kontekst pytania ssh-keygen -lf /etc/ssh/ssh_host_rsa_key.pub. Pokazuje odcisk palca, który jest również wyświetlany przy logowaniu SSH do localhost.
tanius
57
Moje ssh-keygenzgłoszone sha256odciski palców. Aby pobrać md5odciski palców, pobiegłem ssh-keygen -l -E md5 -f ~/.ssh/id_rsa.pub. #archlinux
Justin C
5
(@JustinC) OpenSSH wersje 6.8 (marzec 2015) i nowsze zmieniły się na SHA256, domyślnie wyświetlany w base64 zamiast hex. Do użytku klienta ssh -o FingerprintHash=md5lub jego odpowiednika ssh_configna rzecz rzeczy, które używają sshjak scp.
dave_thompson_085
72

Odcisk palca to MD5 nad danymi binarnymi w kluczu publicznym zakodowanym w Base64.

$ ssh-keygen -f foo
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in foo.
Your public key has been saved in foo.pub.
The key fingerprint is:
65:30:38:96:35:56:4f:64:64:e8:e3:a4:7d:59:3e:19 andrew@localhost
The key's randomart image is:
+--[ RSA 2048]----+
|       +*..+*    |
|      =. +.=     |
|     . . .o .    |
|         o+   E  |
|        S= . + o |
|        . o o +  |
|           .   . |
|                 |
|                 |
+-----------------+
$ cat foo.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDEbKq5U57fhzQ3SBbs3NVmgY2ouYZfPhc6cXBNEFpRT3T100fnbkYw+EHi76nwsp+uGxk08kh4GG881DrgotptrJj2dJxXpWp/SFdVu5S9fFU6l6dCTC9IBYYCCV8PvXbBZ3oDZyyyJT7/vXSaUdbk3x9MeNlYrgItm2KY6MdHYEg8R994Sspn1sE4Ydey5DfG/WNWVrzFCI0sWI3yj4zuCcUXFz9sEG8fIYikD9rNuohiMenWjkj6oLTwZGVW2q4wRL0051XBkmfnPD/H6gqOML9MbZQ8D6/+az0yF9oD61SkifhBNBRRNaIab/Np7XD61siR8zNMG/vCKjFGICnp andrew@localhost
$ echo 'AAAAB3NzaC1yc2EAAAADAQABAAABAQDEbKq5U57fhzQ3SBbs3NVmgY2ouYZfPhc6cXBNEFpRT3T100fnbkYw+EHi76nwsp+uGxk08kh4GG881DrgotptrJj2dJxXpWp/SFdVu5S9fFU6l6dCTC9IBYYCCV8PvXbBZ3oDZyyyJT7/vXSaUdbk3x9MeNlYrgItm2KY6MdHYEg8R994Sspn1sE4Ydey5DfG/WNWVrzFCI0sWI3yj4zuCcUXFz9sEG8fIYikD9rNuohiMenWjkj6oLTwZGVW2q4wRL0051XBkmfnPD/H6gqOML9MbZQ8D6/+az0yF9oD61SkifhBNBRRNaIab/Np7XD61siR8zNMG/vCKjFGICnp' \
    | base64 -D | md5
6530389635564f6464e8e3a47d593e19

Numer md5sum 6530389635564f6464e8e3a47d593e19 to odcisk palca wyświetlany podczas generowania klucza, tylko bez dwukropków oddzielających.


Jeśli jednak masz do czynienia z odciskami palców wyświetlanymi przez Amazon w konsoli par kluczy EC2, niestety może to być inna bestia . Jeśli jest to 32-cyfrowy ciąg szesnastkowy, jest to standardowy odcisk palca klucza publicznego MD5 SSH powyżej. Ale jeśli ma 40 cyfr szesnastkowych, to w rzeczywistości jest to odcisk palca obliczony na podstawie SHA1 klucza prywatnego w formacie PKCS # 8:

$ openssl pkcs8 -in foo -nocrypt -topk8 -outform DER | openssl sha1 -c
e2:77:39:d3:53:a7:62:68:5f:da:82:0e:99:61:30:64:a2:88:c4:58
andrew.n
źródło
1
Uznałem tę odpowiedź za przydatną w następującym scenariuszu. Twój system używa SHA1 do obliczenia odcisku palca, ale twój przyjaciel używa md5. Udostępniłem odcisk palca, który był SHA1 i nie był zgodny z MD5 wygenerowanym przez jej system. To pomogło - dziękuję! sed 's | ^ ssh-rsa ||' /etc/ssh/ssh_host_rsa_key.pub | sed 's | ==. * $ | == |' | base64 -d | md5sum
Liczyrzepa
Jest to bardzo istotne dla zrozumienia, dlaczego ten odcisk palca nie będzie pasował do tych w rekordach SSHFP DNS, ponieważ używają skrótów SHA-1 lub SHA-256.
neirbowj
1
@Liczyrzepa pole publickey może mieć na końcu „==”, w zależności od typu klucza i rozmiaru bitów; bezpieczniejszy i IMO łatwiejszy w użyciu awk '{print $2}' /path/to/keyfile.publub podobny.
dave_thompson_085
13
To jedyna odpowiedź, która wyjaśnia, w jaki sposób obliczany jest odcisk palca
greuze
2
Jednak w Linux Mint polecenie brzmi:cat id_rsa.pub | cut -d' ' -f2 | base64 -d | md5sum
greuze
13

Jeśli chcesz sprawdzić plik klucza SSH, aby sprawdzić, czy jest on taki sam, jak ten, który jest zgłaszany przez github jako „Wdróż klucz”, jest to dla Ciebie ...

Z prywatnego adresu URL: https://github.com/<nazwa_użytkownika>/<repo_name>/settings/keys zobaczysz zrzut ekranu z github

Na terminalu:

$ ls -l id*
-rw-------  1 bruno  staff  1675 Mar 29 17:03 id_rsa
-rw-r--r--  1 bruno  staff   416 Mar 29 17:03 id_rsa.pub

$ ssh-keygen -E md5 -lf id_rsa
2048 MD5:07:b4:00:a4:65:ef:44:89:05:84:60:0c:c9:b2:36:5e [email protected] (RSA)

$ ssh-keygen -E md5 -lf id_rsa.pub
2048 MD5:07:b4:00:a4:65:ef:44:89:05:84:60:0c:c9:b2:36:5e [email protected] (RSA)

Zauważysz, że otrzymasz ten sam odcisk palca zarówno dla klucza prywatnego, jak i publicznego.

To samo polecenie można połączyć z ciekawą funkcją GitHub, polegającą na tym, że publicznie obsługują klucze publiczne SSH użytkowników pod adresem https://github.com/<nazwa_użytkownika>. Klucze

Oto jedna linijka, której możesz użyć, aby z niej skorzystać.

$ curl -sL https://github.com/RichardBronosky.keys | while read; do echo -e "\nkey #$((++i)):"; ssh-keygen -E md5 -lf - <<<"$REPLY"; echo $REPLY; done

key #1:
2048 MD5:07:b4:00:a4:65:ef:44:89:05:84:60:0c:c9:b2:36:5e no comment (RSA)
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDJGT35gvsFveu+80qgurrLHId0h55E9jliM7Fo0mV9b7eg3EfyagkAcJUSMFkoov3HY4CW0yzOc7WlN57ABwvpRz1ioFDex0n0FkjoSEs5ROeT1OneRK6Bf6XnplgPuQ/LSSkv3kmK6I29R+YWi6TjDvLLoA5BrXJjOMfUv36jxWCDtk/5ZdhMZqhsMuDm06Jg5JBu6n5jQaZkmaIaunz7vOfwVG9LoCI+MYyIdo2S4VTva7Ee7jfAvgSUUgHTjhzsPO0/Ww5a/Kz2ehXW27aJxj/QPLfYR2LmTMbQKm3WpB8P1LjoiU7zjPoVoZ43a4P2JLUDidGKCd3eY5b5xewz

key #2:
2048 MD5:f7:98:f1:0b:73:c6:2a:21:00:7a:70:1d:0f:cf:d8:cc no comment (RSA)
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCQsZrjwKjB4WnE4SwVdDX5eEMxKzPHFBVKKpo9vvWUXRQwdTZy6iVOkyF26IPR+xDPzslzXOClKXUrWEh6La/EMpRwuMrWAbMIJFeDHOb56q4azgopoJmMJHo0yxGu0Ts4XszMACYRhlG6uK2AP5SYiOTp1zKPFjazXAdwLXyOvJurzy6KKuGJdSs/sj9+4uehgyRNOhehCSfg71tJJYwRvO2DDfLgaVEKOgZx58gEnJfhhz9D7rbvdZNhw/hCgtVNJaQF9Mdke2OPwWSo8i0/XNb9Bu/GRXqwMZrxDBhyzieocW40cwuzxWfzoi03aISdtQ1HtawH8+/sswviM1+B
Bruno Bronosky
źródło
1
ssh-keygen -r host.name.com

Wysyła odciski palców dla wszystkich skonfigurowanych kluczy publicznych w instancji sshd.

Można je następnie umieścić w rekordach SSHFP DNS .

Mike Schroll
źródło