W tym artykule zebraliśmy nasze najlepsze triki na skuteczniejsze korzystanie z SSH. Dowiesz się, jak:
- Dodać drugi czynnik do logowania SSH
- Bezpiecznie korzystać z agent forwarding
- Wyjść z zamrożonej sesji SSH
- Utrzymać otwarty stały terminal
- Podzielić się zdalną sesją terminala z przyjacielem (bez Zooma!)
Dodanie drugiego czynnika do swojego SSH
Drugi czynnik uwierzytelniania dla połączeń SSH można dodać na pięć różnych sposobów:
- Zaktualizować swój OpenSSH i używać klucza szyfrowania. W lutym 2020 roku do OpenSSH dodano wsparcie dla kluczy szyfrowania FIDO U2F (Universal Second Factor). To świetna nowa funkcja, ale jest pewien problem: tylko ci klienci i serwery, które zaktualizowały się do wersji OpenSSH 8.2 i wyższej, będą mogły używać kluczy szyfrowania, ponieważ lutowe aktualizacje wprowadzają dla nich nowe typy kluczy. Komendą
ssh -Vmożna sprawdzić wersję klienta SSH, a wersję serwera — komendąnc [servername] 22
W lutowej wersji dodano dwa nowe typy kluczy — ecdsa-sk i ed25519-sk (wraz z odpowiednimi certyfikatami). Aby wygenerować plik klucza, wystarczy wprowadzić swój klucz szyfrowania i uruchomić komendę:$ ssh-keygen -t ecdsa-sk -f ~/.ssh/id_ecdsa_skTo stworzy klucz publiczny i prywatny i powiąże je z twoim urządzeniem U2F. Zadaniem prywatnego klucza w urządzeniu U2F jest odszyfrowanie tajnego deskryptora klucza na dysku po aktywacji klucza szyfrowania.
Ponadto, jako drugi czynnik możesz podać hasło dla swoich kluczy.
Klucz-rezydent to kolejny wspierany przez OpenSSH typ generacji -sk- kluczy. Przy takim podejściu deskryptor jest przechowywany na urządzeniu U2F i pozwala ci go mieć przy kluczu szyfrowania, gdy zajdzie potrzeba. Stworzenie klucza-rezydenta można wykonać komendą:
$ ssh-keygen -t ecdsa-sk -O resident -f ~/.ssh/id_ecdsa_skNastępnie, aby przywrócić deskryptor ponownie do pamięci na nowym urządzeniu, wprowadź klucz szyfrowania i uruchom komendę:
$ ssh-add -KPodczas łączenia się z hostem nadal będziesz musiał aktywować klucz szyfrowania.
- Skorzystać z PIV+PKCS11 i Yubikey. Aby połączyć się z urządzeniami z wcześniejszymi wersjami SSHD przy pomocy klucza szyfrowania, potrzebny będzie inny sposób. Na Yubico znajduje się przewodnik po użyciu U2F+SSH z PIV/PKCS11 (ang.). To nie to samo co FIDO U2F, a chociaż metoda działa, wymaga dużego wysiłku, aby zrozumieć, jaka magia nią kieruje.
- Zastosuj niestandardowego agenta ssh yubikey-agent. Filippo Valsorda napisał agenta SSH dla Yubikeyów. Jest on całkowicie nowy i zawiera minimum funkcji.
- Użyj Touch ID i sekey. Sekey to agent SSH z otwartym kodem źródłowym, który przechowuje tajne klucze w zabezpieczonym enclave Apple i pozwala na użycie Touch ID do funkcji dostępu.
- Użyj Single Sign On SSH. Napisałem poradnik, który pomoże w konfiguracji tej metody (po angielsku). Jedną z zalet single sign on SSH jest możliwość wykorzystania polityk bezpieczeństwa dostawcy tożsamości — w tym wsparcie dla wieloskładnikowej autoryzacji (MFA).
Bezpieczne korzystanie z przekazywania agenta.
W SSH przekazywanie agenta pozwala zdalnemu węzłowi uzyskać dostęp do agenta SSH twojego lokalnego urządzenia. Gdy korzystasz z SSH z włączonym przekazywaniem agenta (zwykle przez ssh -A), w połączeniu będą dwa kanały: twoja interaktywna sesja oraz kanał dla przekazywania agenta. Przez ten kanał unixowy gniazdo stworzone przez lokalnego agenta SSH łączy się ze zdalnym węzłem. To ryzykowna metoda, ponieważ użytkownik z dostępem root na zdalnym urządzeniu może uzyskać dostęp do twojego lokalnego agenta SSH i potencjalnie podszyć się pod ciebie w sieci. Korzystając z standardowego agenta SSH w zestawie Open SSH, nawet nie będziesz wiedział, że to się stało. Posiadanie klucza U2F (lub Sekey) pomoże ci skutecznie zablokować wszelkie próby użycia twojego agenta SSH z zewnątrz.
Nawet z takim środkiem ostrożności dobrym pomysłem będzie jak najrzadsze korzystanie z przekazywania agenta. Nie używaj go na każdej sesji — korzystaj z przekazywania agenta tylko wtedy, gdy jesteś pewny, że jest to konieczne w danej sesji.
Wyjście z zawieszonej sesji.
Przerwanie sieci, niekontrolowane zachowanie programów lub sekwencja sterująca, która blokuje wprowadzanie z klawiatury — to wszystko możliwe przyczyny zerwania sesji SSH.
Można zakończyć zawieszoną sesję na kilka sposobów:
- Automatycznie wyjść przy przerwaniu sieci. W swoim .ssh/config należy dodać następujące:
ServerAliveInterval 5 ServerAliveCountMax 1ssh będzie wysyłać echo do zdalnego węzła co ServerAliveInterval sekund, aby sprawdzić połączenie. Jeśli więcej niż ServerAliveCountMax echa nie otrzyma odpowiedzi, ssh zakończy połączenie z powodu timeoutu i wyjdzie z sesji.
- Wyrwij się z sesji. ssh domyślnie używa symbolu ~ (tylda) jako znaku sterującego. Komenda ~. zamyka otwarte połączenie i przenosi cię z powrotem do terminala. (Sekwencje sterujące można wprowadzać tylko z nowej linii.) Komenda ~? wyświetli pełną listę dostępnych komend w tej sesji. Pamiętaj, że aby wpisać symbol ~ na międzynarodowych klawiaturach, może być konieczne naciśnięcie klawisza ~ dwukrotnie.
Dlaczego w ogóle zdarzają się zawieszone sesje? W czasach, gdy tworzono internet, komputery rzadko zmieniały miejsce. Kiedy korzystasz z laptopów i przełączasz się między różnymi sieciami WiFi IPv4, twój adres IP się zmienia. Ponieważ SSH polega na połączeniach TCP, a te z kolei polegają na końcówce ze stabilnym adresem IP, za każdym razem, gdy przełączasz się między sieciami, twoje połączenia SSH tracą deskryptor gniazda i właściwie się gubią. Kiedy zmienia się twój adres IP, twojemu stosowi sieciowemu potrzeba czasu, aby wykryć utratę deskryptora. Kiedy występują problemy z siecią, nie chcemy, aby jeden z węzłów w połączeniu TCP przerwał je zbyt wcześnie. Dlatego protokół spróbuje ponownie przesłać dane jeszcze kilka razy, zanim w końcu się podda. W międzyczasie, w twoim terminalu sesja będzie wyglądać na zawieszoną. IPv6 dodaje kilka cech związanych z mobilnością, które pozwalają urządzeniu zachować adres domowy podczas zmiany sieci. Może kiedyś to przestanie być problemem.
Jak utrzymać stały terminal otwarty na zdalnym węźle
Istnieją dwa różne podejścia do utrzymywania połączenia podczas przechodzenia między różnymi sieciami lub chęci na chwilę się rozłączyć.
1. Skorzystaj z lub
Jeśli naprawdę potrzebujesz połączenia, które się nie przerywa nawet podczas przełączania między sieciami, skorzystaj z mobilnej powłoki Mosh. To zabezpieczona powłoka, która najpierw wykorzystuje handshake SSH, a następnie przełącza się na własny zaszyfrowany kanał na czas trwania sesji. W ten sposób Mosh tworzy oddzielny, bardzo odporny i zabezpieczony kanał, który jest w stanie wytrzymać zarówno przerwy w internecie, jak i zmianę adresu IP twojego laptopa, poważne rozłączenia sieciowe i wiele więcej, a wszystko to dzięki magii połączeń UDP oraz zastosowanemu przez Mosh protokołowi synchronizacji.
Aby korzystać z Mosh, musisz go zainstalować zarówno na kliencie, jak i na serwerze oraz otworzyć porty 60000-61000 dla bezpołączeniowego ruchu UDP do swojego zdalnego hosta. Następnie, aby się połączyć, wystarczy użyć mosh user@server.
Mosh działa na poziomie ekranów i naciśnięć klawiszy, co daje mu szereg zalet w porównaniu do przesyłania binarnego strumienia standardowego wejścia i wyjścia między klientem a serwerem SSH. Jeśli potrzebujemy synchronizować tylko ekrany i naciśnięcia klawiszy, to późniejsze przywrócenie przerwanego połączenia staje się znacznie łatwiejsze. Podczas gdy SSH buforuje i wysyła wszystko, co się wydarzyło, Mosh wystarczy buforować naciśnięcia klawiszy i synchronizować ostatnią klatkę okna terminala z klientem.
2. Użyj tmux
Jeśli chcesz „przychodzić i odchodzić kiedy chcesz” i utrzymywać sesję terminala na zdalnym węźle, skorzystaj z tmux. Uwielbiam tmux i używam go na co dzień. Jeśli twoje połączenie SSH się przerwało, wystarczy ponownie połączyć się i wpisać tmux attach. Dodatkowo ma wiele niesamowitych funkcji, takich jak zakładki wewnątrz terminala i panele, analogiczne do zakładek w terminalu iOS, oraz możliwość dzielenia się terminalami z innymi.
Niektórzy lubią ozdabiać swój tmux za pomocą Byobu, pakietu, który znacznie poprawia wygodę korzystania z tmux i dodaje wiele skrótów klawiszowych. Byobu jest dostarczany z Ubuntu i łatwo go zainstalować na Macu za pomocą Homebrew.
Dziel się zdalną sesją terminala z przyjacielem
Czasami podczas debugowania złożonych problemów na twoich serwerach może pojawić się chęć podzielenia sesji SSH z kimś, kto nie jest w tym samym pomieszczeniu. Tmux idealnie nadaje się do tego zadania! Wystarczy wykonać kilka kroków:
- Upewnij się, że tmux jest zainstalowany na twoim hoście-bastionie lub na jakimkolwiek serwerze, z którym zamierzasz pracować.
- Oboje musicie połączyć się przez SSH z urządzeniem, używając jednego konta.
- Jeden z was musi uruchomić tmux, aby rozpocząć sesję tmux.
- Drugi powinien uruchomić tmux attach
- Voilà! Macie wspólny terminal.
Jeśli chcesz bardziej zaawansowanych wieloosobowych sesji tmux, spróbuj tmate, to fork tmux, który znacznie upraszcza wspólne sesje terminala.
Źródło: habr.com
