Czym są klucze SSH?

2 march 2023
Jakub Rojek Jakub Rojek
Zdjęcie autorstwa Marii Ziegler na Unsplash (https://unsplash.com/photos/jJnZg7vBfMs)
Categories: IT fundamentals

W związku z upowszechnieniem się informatyzacji, jednymi z najczęściej powtarzanych haseł na przestrzeni ostatnich lat są np. "jak to zautomatyzować?", "o ile przyspieszy to moją pracę?" lub "czy może to integrować się z moimi urządzeniami?". Jednak coraz częściej w tym gronie pojawiają się pytania w rodzaju "jak to zabezpieczyć?" lub "czy nikt nie wykradnie mi przez to danych?". Nie da się ukryć, że wygoda powstała przez wprowadzenie rozwiązań IT oraz umieszczanie coraz większej ilości danych w chmurze ma konsekwencje w postaci innego podejścia do ochrony naszych informacji.

Wiemy, że używanie haseł nie jest jedynym sposobem na zabezpieczenie przed niepowołanym dostępem. Mało tego - nie jest to taka dobra blokada, jakby się mogło wydawać. W bardziej wrażliwych przypadkach bardzo przydatne lub wręcz konieczne może być wykorzystanie kryptografii i możliwości, które ona ze sobą niesie. Najbardziej znaną z nich jest wykorzystanie kluczy, zwanymi potocznie kluczami SSH. Wielu osobom ten skrót może wydać się znajomy i słusznie - znamy w końcu takie pojęcie jak "logowanie przez protokół SSH" i klucze są tutaj... kluczowe.

Opowiedzmy sobie zatem, czym one są.

Po co tworzone i używane są klucze SSH?

Klucze SSH (ang. Secure Shell) są plikami, które zawierają ciągi znaków umożliwiające zidentyfikowanie nas jako użytkowników. Co za tym idzie - logowanie się klucz SSH to alternatywa forma udowodnienia, że my to my, dzięki czemu nie będziemy musieli podawać hasła (chyba że sam klucz będzie takie posiadał, co jest możliwe - to tak zwany passphrase). Właśnie ta miła właściwość jest jedną z zalet stosowania tego sposobu uwierzytelniania - nie ma potrzeby zapamiętywania i wpisywania kodu, a także łatwiejsza staje się integracja z różnymi narzędziami. Jednak jeszcze większą zaletą jest zwiększone bezpieczeństwo.

Nie bez powodu napisałem "pliki", a nie "plik". Klucz SSH składa się z dwóch ciągów znaków - klucza prywatnego oraz klucza publicznego. Jak sama nazwa wskazuje, ten pierwszy powinien być zawsze wyłącznie w naszym posiadaniu, natomiast drugi możemy (a nawet musimy) wysłać na serwer, do którego chcemy się logować. Clou całego rozwiązania polega na tym, że klucze pasują do siebie i umożliwiają zaszyfrowanie oraz odszyfrowanie danych - mówią one jednym językiem, które znają tylko one. Jeden służy do zakodowania informacji, a drugi do odkodowania i dzięki temu bezpieczne staje się przesłanie wartości przez sieć.

Klucze SSH są podstawą do działania innych metod uwierzytelniania, z których bardzo znane są choćby certyfikaty SSL. Samo zastosowanie klucza najlepiej widać na przykładzie dostępu do serwerów, jednak programiści doskonale wiedzą, że także przy korzystaniu z repozytoriów ta metoda uwierzytelniania jest w cenie, głównie ze względu na wygodę. Wówczas należy pamiętać, aby w takich serwisach jak GitHub, Bitbucket czy Gogs umieszczać wyłącznie klucz publiczny.

Jak wygląda taki klucz SSH?

Tak, jak wspomniałem, klucze SSH to dwa pliki, które posiadają najczęściej domyślne nazwy:

  • klucz prywatny - zazwyczaj jest to plik id_rsa, który zachowujemy na swoim dysku i nigdzie go nie przesyłamy.
  • klucz publiczny - zazwyczaj jest to plik id_rsa.pub, który możemy przesłać tam, gdzie chcemy się uwierzytelniać tą metodą.

Najprostsza para plików może wyglądać następująco - najpierw przykładowy klucz prywatny (dokonałem paru zmian w środku w celu bezpieczeństwa):

-----BEGIN OPENSSH PRIVATE KEY-----
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
-----END OPENSSH PRIVATE KEY-----

Tymczasem klucz publiczny jest trochę krótszy i zawiera także komentarz, jak np. nazwę komputera, na którym został wygenerowany:

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDNtBWB9d73zkzX/iE6B120Ij4hY0NzKEMaOWgEvFiH5ZpRxsTxPR2fA6FONqwUerQctRViaONl7cFWrUvrI6dfV0b87Z0fuzEFYy9lByLSNl96d5apm4v1KaAkxFc0AOZITCxQ/Si5oj8UcyRg2cuzJ5GGviYWTrQHxghBOGSSIlvOBsOEX0U5c6yORX43rSYAKFSI2sPlV5YggacMILlTPzmAwjJUhJryL/V0fv0iGSlqC3WAJRJ66D54GD8LqxGP+MDkQLIVjnXPJhd/v1cv5X4JAsmMtPuqvBbOg/rVdLf143QdqnbIN2Jd77B32aSI+I+PND0VibeEHBKlwG5HKu9u8kJqaIrSmp0xO/mNG3mPpyeFMkuPCm3GiXf6nve1Bl7iIYN56kmln2eXfHxF8OEjsAmb4PLvIVBMLDQf0Hdfhw2+TL1O2XZmi2m6lppWr8T9Ea0K2V2GKwdffVhPG/QwShs1HXKzlZkP8LGdYUTtXz72HdvYKKM1Mi6zcBU= user@DESKTOP-ABC1234

To domyślna wersja - nic nie stoi na przeszkodzie, aby wygenerować dłuższy klucz o większej liczbie bitów, co oznacza większe bezpieczeństwo, ale też niższą wydajność. Klucze gromadzone są zazwyczaj w katalogu domowym użytkownika, w folderze .ssh. W przypadku Linuxa będzie to ~/.ssh (lub, używając pełnej ścieżki, /home/nazwauzytkownika/.ssh), natomiast w Windowsie domyślna lokalizacja to C:/Users/nazwauzytkownika/.ssh).

Powyżej przedstawiony ciąg znaków został zakodowany za pomocą algorytmu RSA (od nazwisk twórców - Rivesta-Shamira-Adlemana), który pod spodem opiera się na operowaniu bardzo dużymi liczbami pierwszymi. Jest to domyślna metoda szyfrowania dostępna dla SSH, choć istnieją też inne, rzadziej używane, jak np. ECDSA.

Jak wygenerować klucz SSH?

Klucz najczęściej generuje się za pomocą polecenia ssh-keygen, które zaraz omówimy, natomiast nie oznacza to, że jesteśmy na nie skazani i dodatkowo musimy to robić na Linuxie. Jeśli mamy zainstalowanego Gita na Windowsie i wraz z nim program Git GUI, to istnieje w nim opcja wygenerowania pary kluczy za pomocą jednego kliknięcia. Jeszcze bardziej popularny PuTTy ma taką możliwość. Samo polecenie jest dostępne także w Git Bashu czy PowerShellu po zainstalowaniu odpowiedniego rozszerzenia. Skupmy się jednak na podstawowej komendzie.

Najprostsze wywołanie polecenia ssh-keygen spowoduje:

  • sprawdzenie, czy w domyślnym katalogu istnieją już klucze - jeśli tak, to program zapyta, czy je zamienić (należy przy tym bardzo uważać - poprzednie klucze bezpowrotnie stracimy),
  • wyświetlenie prośby o podanie i powtórzenie passphrase'a, dodatkowo zabezpieczający klucz (bardzo często zostawia się go pustego),
  • pokazanie informacji o powodzeniu operacji i tzw. odcisku palca (ang. fingerprint) klucza, służącego do weryfikacji, czy łączymy się z właściwą maszyną.

Jest to zatem całkiem proste, ale czasami chcemy coś zmienić - umieścić klucz w innym pliku, zastosować mocniejsze szyfrowanie itd. Na szczęście, polecenie udostępnia parę przełączników, z których można wyróżnić kilka szczególnie użytecznych:

  • -t - wybór metody szyfrowania (domyślnie RSA)
  • -b - liczba bitów klucza (czyli jego długość)
  • -f - lokalizacja i nazwa pliku, do którego zostaną zapisane klucze (domyślnie ~/.ssh/id_rsa)

Można zatem wygenerować klucz w następujący sposób, używając innych parametrów niż domyślne:

ssh-keygen -t ecdsa -b 384 -f ./my_key

Czy klucz SSH jest bezpieczny?

Podobnie, jak większość uznanych metod związanych z ochroną danych i dostępu do zasobów, klucze SSH nie są bezpieczne w 100%. Są jednak na tyle dobre (powiedzmy w 99,8%), że jeśli mamy taką możliwość, powinniśmy używać ich zamiast podawania zwykłego hasła. Gdzie zatem leży sekret?

W stopniu złożoności samego klucza. Pamiętamy, że klucz publiczny jest jawny i teoretycznie może zostać "wykradziony". Jednak do wykorzystania go w nieuprawniony sposób konieczna jest jeszcze zawartość klucza prywatnego, a ten jest bardzo trudno "odgadnąć". To trochę tak, gdybyśmy zgubili zamek do skrzyni, ale nie sam klucz, który go otwiera. Tym niemniej, przy ogromnej mocy obliczeniowej lub gigantycznym szczęściu, złamanie klucza jest możliwe i dlatego nie można powiedzieć, że klucze SSH są nie do podrobienia. Dają jednak na tyle dużą pewność, że musielibyśmy używać naprawdę słabych i krótkich ciągów znaków, aby realnie bać się o swoje bezpieczeństwo.

Zwykle do normalnego korzystania z Internetu nie musimy wiedzieć, w jaki sposób powstają te klucze i do czego służą. To jednak nie oznacza, że nie warto znać tego zagadnienia, a w przypadku programistów jest ono wręcz niezbędne, aby czuć się swobodnie we współpracy z różnymi usługami i administratorami. W końcu - im większą wiedzę mamy, tym lepiej rozumiemy, co dzieje się dookoła, a jeśli dodatkowo dotyczy to naszego bezpieczeństwa, to wybór staje się jeszcze prostszy.

Pozdrawiam i dziękuję - Jakub Rojek.

We like to write, even a lot, but on a daily basis we develop web and mobile applications. Check some of the programs we have made.

About author

Jakub Rojek

Lead programmer and co-owner of Wilda Software, with many years of experience in software creation and development, but also in writing texts for various blogs. A trained analyst and IT systems architect. At the same time he is a graduate of Poznan University of Technology and occasionally teaches at this university. In his free time, he enjoys playing video games (mainly card games), reading books, watching american football and e-sport, discovering heavier music, and pointing out other people's language mistakes.

Jakub Rojek