Aurora Kursy

Kursy SSH od zera do bastionuSSH: zdalna powłoka bez tajemnic

SSH: zdalna powłoka bez tajemnic

Lekcja 1 z 20 Podgląd

SSH: zdalna powłoka bez tajemnic

SSH (Secure Shell) to nie jest po prostu "narzędzie do wpisywania komend na zdalnym komputerze". Dla DevOpsa to fundament. To Twój jedyny bezpieczny kanał komunikacji z infrastrukturą – od pojedynczych instancji w chmurze, przez kontenery, aż po zarządzanie bastionami (jump hostami). Jeśli SSH zawiedzie lub zostanie źle skonfigurowane, tracisz kontrolę nad systemem, a w najgorszym scenariuszu – otwierasz drzwi do przejęcia całej sieci.

Mechanizm działania: Co dzieje się pod maską?

Kiedy wpisujesz komendę ssh user@192.168.1.50, nie nawiązujesz bezpośredniego połączenia z powłoką (shell). Najpierw budujesz bezpieczny, zaszyfrowany tunel. Proces ten dzieli się na dwa kluczowe etapy: uwierzytelnienie serwera oraz uwierzytelnienie użytkownika.

  1. Uwierzytelnienie serwera (Fingerprint): Zanim podasz jakiekolwiek hasło, Twój klient musi mieć pewność, że łączy się z właściwą maszyną, a nie z kimś, kto podsłuchuje ruch (atak Man-in-the-Middle). Serwer wysyła swój klucz publiczny. Klient oblicza jego skrót (fingerprint) i pyta Cię: "Czy ufasz tej maszynie?".
  2. Negocjacja szyfrowania: Klient i serwer ustalają algorytmy szyfrowania. Od tego momentu każda informacja – Twoje hasło, wpisane komendy, wyniki operacji – jest pakowana w zaszyfrowane ramki.
  3. Uwierzytelnienie użytkownika: Dopiero gdy tunel jest bezpieczny, serwer prosi Cię o dowód tożsamości. Może to być hasło lub (co standardem w DevOps) para kluczy kryptograficznych.

Pierwsze połączenie i pułapka "Known Hosts"

Przy pierwszym połączeniu z nową maszyną zobaczysz komunikat: The authenticity of host '192.168.1.50 (192.168.1.50)' can't be established. ECDSA key fingerprint is SHA256:abc123xyz... Are you sure you want to continue connecting (yes/no/[fingerprint])?

To jest moment krytyczny. Jeśli to Twoja własna, nowa maszyna – wpisujesz yes. Twój klient zapisuje ten fingerprint w pliku ~/.ssh/known_hosts. Dzięki temu przy kolejnym logowaniu SSH nie będzie pytać o zgodę, lecz automatycznie sprawdzi, czy klucz serwera się zgadza.

Pułapka produkcyjna: Reinstalacja serwera. Wyobraź sobie, że automatyzujesz infrastrukturę (np. przez Terraform). Usuwasz starą instancję i stawiasz nową z tym samym adresem IP. Przy próbie połączenia SSH wyrzuci potężny błąd: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

To nie jest błąd połączenia – to system bezpieczeństwa. SSH wykryło, że maszyna pod tym adresem ma inny klucz niż ta, którą zapisałeś wcześniej. W środowisku produkcyjnym nie ignoruj tego. Jeśli to spodziewana zmiana (reinstalacja), musisz usunąć stary wpis komendą ssh-keygen -R [adres_IP]. Jeśli to nieplanowana zmiana – prawdopodobnie ktoś właśnie próbuje przejąć Twoją sesję.

Zarządzanie sesją i wyjście

Po poprawnym uwierzytelnieniu Twój prompt zmieni się. Zamiast user@laptop, zobaczysz np. root@server-prod. Od tej chwili każda komenda, którą wpiszesz, jest wykonywana na zdalnej maszynie.

# Przykład typowej sesji
user@laptop:~$ ssh admin@192.168.1.50
admin@192.168.1.50:~$ uptime
 14:20:05 up 45 days, 12:34,  1 user,  load average: 0.01, 0.05, 0.00
admin@192.168.1.50:~$ exit
logout
user@laptop:~$

Zawsze pamiętaj o komendzie exit lub skrócie Ctrl+D. Pozostawianie otwartych, nieużywanych sesji SSH na serwerach produkcyjnych to proszenie się o kłopoty (niepotrzebne zużycie zasobów i większa powierzchnia ataku).

Diagnostyka: Rozpoznawanie błędów

Jako DevOps nie możesz zgadywać, dlaczego "nie działa". Musisz czytać komunikaty. SSH podaje bardzo precyzyjne informacje, które pozwalają błyskawicznie odróżnić problem sieciowy od problemu z uprawnieniami.

  1. Connection refused
    • Co to znaczy: Serwer jest dostępny, ale odrzucił próbę połączenia na tym porcie.
    • Przyczyna: Usługa SSH (sshd) nie działa na serwerze, albo serwer nasłuchuje na innym porcie niż standardowy 22.
  2. Connection timed out
    • Co to znaczy: Twoja prośba o połączenie "zginęła" w sieci. Nie dostałeś żadnej odpowiedzi.
    • Przyczyna: Firewall (np. AWS Security Group, iptables lub ufw) blokuje ruch na porcie 22, albo adres IP jest błędny/maszyna jest wyłączona.
  3. Permission denied (publickey,password)
    • Co to znaczy: Połączyłeś się z serwerem, ale serwer nie uznał Twoich poświadczeń.
    • Przyczyna: Wpisałeś złe hasło lub (najczęściej) Twój klucz prywatny nie został zaakceptowany przez serwer.

Pierwsze ostrzeżenie o uprawnieniach

SSH jest skrajnie paranoiczne w kwestii bezpieczeństwa. Jeśli w kolejnych lekcjach zaczniesz używać kluczy (a będziemy to robić), pamiętaj o jednej złotej zasadzie: SSH nie zadziała, jeśli Twoje pliki konfiguracyjne są zbyt "otwarte" dla innych użytkowników.

Jeśli ustawisz uprawnienia do swojego katalogu .ssh na 777 (każdy może czytać i pisać) lub klucza prywatnego na 644 (klucz jest czytelny dla grupy i innych), SSH po prostu odmówi połączenia, uznając, że Twoje poświadczenia są skompromitowane. W świecie SSH zbyt luźne uprawnienia to błąd krytyczny, a nie tylko "zła praktyka".

Zasada do zapamiętania: W SSH nie ma miejsca na kompromisy w kwestii uprawnień – jeśli system jest zbyt "dostępny" dla innych, SSH odetnie Ci drogę do celu, by chronić Twoje dane.

Ćwiczenia praktyczne

0 / 1