Pierwsze logowanie przez SSH
Moduł 1: Pierwszy serwer · Czas czytania: 10 min
Cel lekcji: Po tej lekcji będą Państwo potrafili po raz pierwszy zalogować się na swój serwer przez SSH, sprawdzić odcisk klucza serwera, zanim mu Państwo zaufają, oraz będą Państwo wiedzieć, co zrobić w przypadku ostrzeżenia, że tożsamość serwera uległa zmianie.
Kluczowe pojęcia: SSH, klient i serwer, port 22, baner wersji, host key, odcisk klucza (SHA256), known_hosts, trust on first use, "REMOTE HOST IDENTIFICATION HAS CHANGED", PowerShell i Terminal
Czym jest SSH
SSH (Secure Shell) to szyfrowane połączenie, za pomocą którego zarządzają Państwo serwerem zdalnie. Polecenia wpisują Państwo na własnym komputerze, a wykonywane są one na serwerze. Wszystko, co przesyłane jest przez łącze, również Państwa hasło, jest szyfrowane.
Połączenie ma dwie strony:
- klient SSH na Państwa komputerze: program
ssh. W systemach macOS i Linux jest dostępny domyślnie. W systemie Windows 10 (od wersji 1809) i Windows 11 klient OpenSSH jest częścią systemu Windows; korzystają z niego Państwo w PowerShell lub Windows Terminal. Jeśli go brakuje, można go dodać przez Ustawienia, Funkcje opcjonalne, "Klient OpenSSH". Programy okienkowe, takie jak PuTTY, również działają, ale w tym kursie używamyssh. - serwer SSH na VPS: program
sshd(z pakietu OpenSSH). Domyślnie nasłuchuje na porcie 22.
Logowanie
Logują się Państwo, podając nazwę użytkownika i adres serwera:
PS C:\Users\anna> ssh root@192.0.2.10Lub nazwę, jeśli została ona wpisana do DNS (lekcja 7.1):
anna@laptop:~$ ssh root@web1.example.comZa pierwszym razem zobaczą Państwo coś takiego:
The authenticity of host '192.0.2.10 (192.0.2.10)' can't be established.
ED25519 key fingerprint is SHA256:Xq3aTnPpC0m1o4cJ2kVqY8mWb7rZs5dLfE6hUyN9tKs.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])?To najważniejszy moment tej lekcji. Prosimy nie wpisywać na ślepo yes.
Host key i odcisk klucza
Każdy serwer SSH ma jeden lub więcej kluczy hosta (host keys): par kluczy, za pomocą których serwer potwierdza swoją tożsamość. Części publiczne znajdują się na serwerze w /etc/ssh/, na przykład /etc/ssh/ssh_host_ed25519_key.pub. Przy każdym połączeniu serwer wykazuje, że posiada część tajną.
Odcisk klucza (fingerprint) to krótkie streszczenie (skrót, hash) takiego klucza publicznego. OpenSSH domyślnie pokazuje postać SHA256: SHA256:, a po nim 43 znaki.
Pytanie "Are you sure you want to continue connecting?" oznacza, że Państwa komputer jeszcze nie zna tego serwera. Kto gwarantuje, że rozmawiają Państwo ze swoim VPS, a nie z kimś, kto przechwytuje ruch? Nikt, chyba że porównają Państwo odcisk klucza z wiarygodnym źródłem.
Tym źródłem jest konsola Państwa dostawcy (lekcja 1.2). Przez konsolę nie komunikują się Państwo z serwerem przez sieć. Prosimy zalogować się w konsoli i wyświetlić odcisk klucza:
root@web1:~# ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub
256 SHA256:Xq3aTnPpC0m1o4cJ2kVqY8mWb7rZs5dLfE6hUyN9tKs root@web1 (ED25519)Jeśli zgadza się on dokładnie z tym, co pokazuje klient, wpisują Państwo yes. Zamiast yes można też wkleić sam odcisk klucza; wtedy ssh porówna go za Państwa. Jeśli się różni, prosimy przerwać i ustalić przyczynę (błędny adres IP, ponownie zainstalowany serwer lub coś poważniejszego).
Prosimy zwrócić uwagę na typ: klient podaje typ klucza (ED25519, ECDSA lub RSA). Porównują Państwo odcisk klucza tego samego typu. Wiele obrazów systemu wyświetla odciski kluczy w konsoli także przy pierwszym uruchomieniu (cloud-init), między wierszami takimi jak BEGIN SSH HOST KEY FINGERPRINTS.
known_hosts i trust on first use
Po wpisaniu yes zobaczą Państwo:
Warning: Permanently added '192.0.2.10' (ED25519) to the list of known hosts.Klient zapisuje klucz w ~/.ssh/known_hosts (w systemie Windows w C:\Users\<naam>\.ssh\known_hosts). Od tej chwili przy każdym połączeniu porównuje go automatycznie. Ten model nazywa się trust on first use (TOFU, zaufanie przy pierwszym użyciu): za pierwszym razem muszą Państwo sprawdzić klucz samodzielnie, potem pilnuje tego klient.
Dlatego ta pierwsza kontrola jest tak ważna: jeśli zaufają Państwo niewłaściwemu kluczowi, klient już nigdy więcej nie ostrzeże.
Jeśli sami pracują Państwo na komputerze z Debianem lub Ubuntu, nazwy w known_hosts są domyślnie zapisywane w postaci skrótu (HashKnownHosts yes w /etc/ssh/ssh_config), więc nie zobaczą tam Państwo czytelnych adresów IP. W systemach Windows i macOS są one zapisane czytelnie. Wyszukiwanie wszędzie działa za pomocą:
anna@laptop:~$ ssh-keygen -F 192.0.2.10
# Host 192.0.2.10 found: line 3
|1|kP9...= ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA..."REMOTE HOST IDENTIFICATION HAS CHANGED"
Czasem pojawia się takie ostrzeżenie:
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
...
Host key verification failed.Serwer przedstawia inny klucz niż ten, który zna Państwa klient. ssh odmawia wtedy połączenia. Przyczyny są dwojakiego rodzaju:
| Normalne | Podejrzane |
|---|---|
| Ponownie zainstalowali Państwo VPS (nowe klucze hosta) | Niczego Państwo nie zmieniali, a mimo to klucz jest inny |
| Adres IP został przydzielony innemu serwerowi | Korzystają Państwo z obcej sieci Wi-Fi |
| Celowo wymienili Państwo klucze hosta | Odcisk klucza w konsoli różni się od tego, co klient widzi teraz |
Jeśli istnieje normalne wyjaśnienie, prosimy ponownie sprawdzić odcisk klucza w konsoli i dopiero potem usunąć stary wiersz:
anna@laptop:~$ ssh-keygen -R 192.0.2.10
# Host 192.0.2.10 found: line 3
/home/anna/.ssh/known_hosts updated.Przy następnym połączeniu pojawi się znowu pytanie jak za pierwszym razem i ponownie sprawdzą Państwo klucz. Prosimy nigdy nie ustawiać StrictHostKeyChecking no w konfiguracji, aby pozbyć się ostrzeżenia: wyłączyliby Państwo dokładnie tę ochronę, o którą chodzi.
Baner wersji
Zanim cokolwiek zostanie zaszyfrowane, klient i serwer wysyłają sobie nawzajem wiersz tekstu: baner wersji. Jest on widoczny dla każdego w internecie. Można go zobaczyć za pomocą ssh -v:
anna@laptop:~$ ssh -v root@192.0.2.10 2>&1 | grep "remote software"
debug1: Remote protocol version 2.0, remote software version OpenSSH_9.6p1 Ubuntu-3ubuntu13.5Serwer informuje tutaj, jakiego protokołu (2.0) i jakiego oprogramowania używa. Debian i Ubuntu dopisują do tego wersję pakietu. Nie jest to tajemnica, którą trzeba ukrywać: atakujący i tak próbują wszystkiego, a chronią się Państwo aktualizacjami (moduł 4), a nie innym banerem. Jest to natomiast przydatne: po banerze widać z zewnątrz, czy na serwerze naprawdę działa zaktualizowana wersja.
W systemach AlmaLinux i Rocky Linux
Logowanie i odciski kluczy działają tak samo. Usługa nazywa się sshd zamiast ssh (systemctl status sshd). Baner nie zawiera nazwy dystrybucji, tylko wersję OpenSSH.
Podsumowanie
- SSH to szyfrowane połączenie z Państwa serwerem;
sshto klient,sshdto serwer na porcie 22. - Przy pierwszym połączeniu klient pokazuje odcisk klucza hosta. Prosimy porównać go z wynikiem
ssh-keygen -lfw konsoli, zanim wpiszą Państwoyes. - Klient zapisuje klucz w
~/.ssh/known_hostsi od tej pory sam ostrzega (trust on first use). - "REMOTE HOST IDENTIFICATION HAS CHANGED" jest normalne po ponownej instalacji; w innych przypadkach jest podejrzane. Stary wiersz prosimy usuwać tylko po sprawdzeniu, za pomocą
ssh-keygen -R. - Baner wersji jest publiczny; ochronę zapewniają aktualizacje, a nie ukrywanie.
Quiz
Zadanie
Zadanie Z1.3: Baner SSH i odcisk klucza Państwa serwera. Prosimy podać adres swojego serwera, wersję oprogramowania z banera (na przykład OpenSSH_9.6p1) oraz odcisk klucza ED25519, który wyświetlili Państwo w konsoli za pomocą ssh-keygen -lf. Program nawiązuje jedno połączenie z Państwa portem SSH, odczytuje baner i klucz hosta, a następnie je porównuje. Program się nie loguje.
Przeczytaj więcej
- Logowanie do VPS przez SSH (i tworzenie klucza SSH)
- Brak dostępu do VPS: co teraz?
- ssh-keygen(1), opcje -l, -F i -R: https://manpages.debian.org/trixie/openssh-client/ssh-keygen.1.en.html
- ssh_config(5), StrictHostKeyChecking, FingerprintHash i HashKnownHosts: https://manpages.debian.org/trixie/openssh-client/ssh_config.5.en.html
- RFC 4253, sekcja 4.2 (baner wersji): https://www.rfc-editor.org/rfc/rfc4253.html
