1. Dlaczego Wprowadzono SSH
Wczesne protokoły zdalnego dostępu i transferu plików, takie jak Telnet i FTP, mogły przesyłać nazwy użytkowników, hasła, polecenia i zawartość plików jako czysty tekst. Obserwator mający dostęp do ścieżki sieciowej mógł odczytać ten ruch i przechwycić dane uwierzytelniające. SSH wprowadzono jako chroniony pakiet protokołów do zdalnego logowania, wykonywania poleceń i transferu plików.
Gdy internet stał się siecią publiczną, zdalny dostęp w czystym tekście tworzył niedopuszczalne ryzyko. W 1995 roku Tatu Ylönen, badacz z Politechniki Helsińskiej, opracował pierwszą wersję protokołu Secure Shell. zaprojektowano jako następcę Telnetu, zapewniającego szyfrowany kanał zdalnej komunikacji. SSH jest pakietem protokołów szeroko używanym do zdalnego administrowania komputerami i urządzeniami sieciowymi.
2. Podstawowa Architektura: Jedno Chronione Połączenie
SSH działa w modelu klient-serwer. Warstwa transportowa negocjuje ochronę kryptograficzną, a warstwa połączenia multipleksuje usługi w ramach ustanowionego transportu. Po przygotowaniu transportu protokół uruchamia usługę uwierzytelniania użytkownika, a następnie otwiera kanały dla żądanych aplikacji. Kanał może zostać zamknięty, gdy połączenie TCP nadal przenosi inne kanały.
- Klient i Serwer SSH
Sesja SSH angażuje dwa komponenty:
- Klient SSH: Oprogramowanie na maszynie lokalnej, które inicjuje połączenie. Przykłady to narzędzie wiersza poleceń 'ssh' dostępne w systemach Linux, macOS i Windows, lub aplikacje graficzne takie jak PuTTY.
- Serwer SSH (Demon): Program, często nazywany 'sshd', działający na maszynie zdalnej. Ciągle nasłuchuje na przychodzące żądania połączeń i jest odpowiedzialny za uwierzytelnianie użytkownika i zapewnienie dostępu.
- Jedno połączenie TCP, domyślnie port 22
Cała sesja, w tym uwierzytelnianie, wykonywanie poleceń i transfer danych, jest multipleksowana przez pojedyncze połączenie TCP. Serwery SSH domyślnie nasłuchują na porcie TCP , lecz port można skonfigurować inaczej. Zapora może zezwolić na zdalny dostęp jedną regułą, gdy serwer korzysta z tego portu, w przeciwieństwie do protokołów wymagających oddzielnych portów sterowania i danych. Warstwa połączenia przypisuje kanały logiczne i okna sterowania przepływem, dlatego powłoka, przekierowany strumień i podsystem transferu plików mogą współdzielić transport.
3. Właściwości Bezpieczeństwa SSH
Połączenie SSH zapewnia uzgodnioną poufność, ochronę integralności i uwierzytelnianie. Skuteczność tych mechanizmów zależy od negocjacji algorytmów, weryfikacji klucza hosta i polityki uwierzytelniania użytkowników na serwerze. Transport wiąże także wymianę z identyfikatorem sesji i utrzymuje numery sekwencyjne pakietów, co pomaga zapobiegać użyciu danych uwierzytelniania w innej sesji oraz cichej zmianie kolejności chronionych pakietów.
A. Poufność i szyfrowanie
Po pomyślnej wymianie kluczy SSH szyfruje dane przesyłane kanałem za pomocą uzgodnionego szyfru. Bierny obserwator nie może odczytać chronionego ruchu, gdy algorytmy i klucze sesji pozostają bezpieczne. Proces ten jest dwuetapowy:
- Wstępna wymiana kluczy: Podczas ustanawiania połączenia klient i serwer używają , na przykład wymiany z rodziny Diffiego-Hellmana, aby wyprowadzić wspólną tajemnicę sesji. Klucz hosta serwera uwierzytelnia wymianę tylko wtedy, gdy klient zweryfikuje oczekiwany klucz hosta.
- Szyfrowanie Sesji: Po ustanowieniu wspólnego klucza cała późniejsza komunikacja jest szyfrowana za pomocą szybkiego i wydajnego algorytmu , takiego jak AES (Advanced Encryption Standard) lub ChaCha20. Każdy znak, który wpisujesz i każda linia wyjściowa są zamieniane w niezrozumiały szyfrogram.
B. Ochrona integralności
SSH wykrywa modyfikację przesyłanych danych. Zależnie od uzgodnionego szyfru transport dołącza do każdego pakietu albo używa trybu szyfrowania uwierzytelnionego.
- W przypadku szyfru z MAC nadawca oblicza kluczową wartość integralności, na przykład HMAC-SHA2, dla danych pakietu i dołącza wynikowy MAC.
- Odbiorca wykonuje dokładnie te same obliczenia na otrzymanych danych.
- Jeśli kontrola integralności powiedzie się, odbiorca uznaje pakiet za autentyczny i niezmieniony. Po nieudanej kontroli pakiet jest odrzucany, a połączenie zwykle zostaje przerwane.
C. Uwierzytelnianie
SSH uwierzytelnia serwer wobec klienta za pomocą klucza hosta, a użytkownika wobec serwera za pomocą skonfigurowanej metody uwierzytelniania.
- Uwierzytelnianie serwera i weryfikacja klucza hosta:
Jest to krok, który może zapobiec , gdy odcisk palca zostanie zweryfikowany. Każdy serwer SSH ma parę kluczy hosta. Przy pierwszym połączeniu klient wyświetla odcisk palca publicznego klucza serwera i prosi o potwierdzenie:
Autentyczność hosta 'serwer.przyklad.pl ()' nie może zostać ustalona.
Odcisk palca klucza ED25519 to SHA256:AbCdEf123...
Czy na pewno chcesz kontynuować łączenie (tak/nie)?Wpisanie 'tak' zapisuje klucz w pliku 'known_hosts'. Przed pierwszą akceptacją należy sprawdzić odcisk palca z użyciem zaufanego kanału. Przy kolejnych połączeniach klient porównuje przedstawiony klucz z zapisanym. Niezgodność wywołuje ostrzeżenie, ponieważ serwer może być podstawiony albo rekonfigurowany.
- Uwierzytelnianie klienta i logowanie użytkownika:
Po zweryfikowaniu tożsamości serwera, użytkownik musi udowodnić swoją własną tożsamość serwerowi. Istnieją dwie podstawowe metody:
- Uwierzytelnianie Hasłem: Użytkownik podaje nazwę użytkownika i hasło. SSH szyfruje te dane przed wysłaniem ich do serwera w celu weryfikacji. Chociaż jest to bezpieczne przed podsłuchem sieciowym, jest wciąż podatne na ataki siłowe (brute-force) i polega na silnych hasłach.
- Uwierzytelnianie kluczem publicznym: Użytkownik generuje parę kluczy prywatny/publiczny i umieszcza klucz publiczny na serwerze, podczas gdy prywatny pozostaje po stronie klienta. Klient potwierdza posiadanie klucza, podpisując związane z sesją dane uwierzytelniania. Serwer sprawdza podpis zapisanym kluczem publicznym, więc hasło nie musi przechodzić przez sieć. Metoda jest częsta w automatycznym dostępie SSH, pod warunkiem ochrony klucza prywatnego i możliwości jego unieważnienia po zakończeniu użycia.
4. Stos protokołów SSH
Protokół SSH jest warstwowy, co rozdziela ochronę transportu, uwierzytelnianie użytkownika i obsługę kanałów.
Podstawowe dokumenty RFC 4251, RFC 4252, RFC 4253 i RFC 4254 mają status Standards Track. Konkretne algorytmy i rozszerzenia są wybierane podczas negocjacji, więc polityka serwera określa dopuszczalne warianty.
- Protokół Warstwy Transportowej (RFC 4253): Najniższa warstwa, działająca na TCP. Odpowiada za ustanowienie połączenia, prezentację klucza hosta, negocjację algorytmów szyfrowania i integralności, wymianę kluczy oraz bieżącą ochronę i kontrolę pakietów.
- Protokół Uwierzytelniania Użytkownika (RFC 4252): Ta warstwa działa na warstwie transportowej. Jej jedynym celem jest uwierzytelnienie klienta na serwerze za pomocą metod takich jak hasło, klucz publiczny lub inne.
- Protokół Połączenia (RFC 4254): To najwyższa warstwa. Definiuje, w jaki sposób wiele kanałów logicznych jest multipleksowanych w ramach uwierzytelnionego i zaszyfrowanego transportu. Kanały mogą przenosić interaktywną powłokę, przekierowania portów i sesję SFTP w ramach jednego połączenia SSH.
5. Zastosowania SSH
Protokół połączenia pozwala SSH obsługiwać więcej niż interaktywne zdalne logowanie.
- Bezpieczny transfer plików (SFTP i SCP): SFTP działa jako podsystem SSH, a tradycyjny SCP wykorzystuje transport SSH do operacji kopiowania plików. Połączenie SSH chroni zawartość plików i polecenia zgodnie z uzgodnionymi algorytmami.
- Tunelowanie SSH (Przekierowanie Portów): SSH może być używany do bezpiecznego tunelowania innych, niezabezpieczonych protokołów sieciowych.
- Lokalne Przekierowanie Portów: Pozwala na bezpieczny dostęp do usługi w sieci zdalnej, tak jakby działała ona na Twojej lokalnej maszynie. Na przykład, możesz przekierować lokalny port na swoim laptopie do serwera bazy danych działającego na porcie 3306 w prywatnej sieci firmowej.
- Zdalne przekierowanie portów: Odwrotność lokalnego przekierowania. Pozwala, aby gniazdo nasłuchujące na serwerze zdalnym przekazywało połączenia do usługi po stronie klienta. Dopuszczenie tej funkcji i zakres odbiorców zależą od polityki serwera SSH.
- Zdalne Wykonywanie Poleceń:SSH pozwala na bezpieczne wykonanie pojedynczego polecenia na zdalnym serwerze bez otwierania pełnej interaktywnej sesji, co jest niezbędne do automatyzacji i pisania skryptów. Na przykład: 'ssh uzytkownik@serwer 'uptime''
- Systemy Kontroli Wersji: Systemy takie jak Git intensywnie używają SSH jako bezpiecznego transportu do wysyłania (push) i pobierania (pull) zmian do i z repozytoriów zdalnych.
6. Wnioski
SSH łączy szyfrowanie transportu i ochronę integralności z weryfikacją klucza hosta, uwierzytelnianiem użytkownika i multipleksowaniem kanałów. Taka konstrukcja obsługuje zdalne powłoki, wykonywanie poleceń, przekierowanie portów, SFTP i inne usługi w ramach jednego połączenia TCP. Bezpieczne użycie nadal wymaga weryfikacji kluczy hosta, wyboru odpowiednich algorytmów, ochrony kluczy prywatnych, stosowania polityki dostępu serwera i audytowania decyzji dostępowych.