Ubuntu Server oraz 2FA na Raspberry PI

Ubuntu Server na Raspberry PI
Ubuntu Server na Raspberry PI

Ubuntu od ponad 15 lat gości na komputerach, serwerach, telefonach komórkowych czy tabletach. Ta, bazująca na Debianie dystrybucja Linuxa swoją początkową popularność zawdzięczała rozdawanymi za darmo płytami z systemem. Dystrybutorem  nośników był właściciel marki i opiekun dystrybucji, firma Canonical. Nazwa Ubuntu nie jest przypadkowa i pochodzi od afrykańskiego “u-bun-tu“, co oznacza człowieczeństwo wobec innych. Czy Ubuntu Server może być dobrym systemem do instalacji również na Raspberry PI? Sprawdźmy!

Z jakim systemem najbardziej kojarzy się każdemu użytkownikowi Raspberry PI? Oczywiście jest to Raspbian, oficjalna dystrybucja przygotowywana przez fundację Raspberry.  Raspbian oferuje użytkownikom wszystko, czego potrzebują, aby rozpocząć swoją przygodę z Raspberry PI jak również z samym Linuxem. Bardziej zaawansowani użytkownicy systemu z pingwinem w tle mają jednak swoje ulubione dystrybucje, z których korzystają na codzień na różnych urządzeniach i często chcą pracować na jednym systemie na różnych platformach. Raspberry PI jest platformą open-source. Pozwala to twórcom systemów wraz ze społecznością na przygotowanie specjalnych wersji swoich systemów (Windows 10 IoT), bądź po prostu wydania specjalnej wersji na tę platformę. Na malince bez problemu uruchomimy wszystkie najpopularniejsze dystrybucje Linuxa (Ubuntu, OpenSUSE, Fedora, CentOS, Kali, Arch czy Gentoo). Po lekkich modyfikacjach na RPI uruchomimy też pełnowartościowy Windows 10 ARM.

Pracuję obecnie nad pewnym projektem, którego głównym elementem będzie właśnie Raspberry PI 3B+ z systemem Ubuntu Server 19.10.1. Dlatego postanowiłem jako małą rozgrzewkę przygotować czystą instalację tego systemu, zaktualizować listę pakietów, zainstalować aktualizacje, oraz skonfigurować uwierzytelnianie dwuetapowe.

Instalacja Ubuntu Server 19.10.1 ARM64 na Raspberry PI 3B+

Instalację systemu rozpoczynamy od pobrania aktualnej wersji systemu ze strony głównej projektu (Dostępnej tutaj). 

Ekran pobierania obrazu Ubuntu PI

Po wybraniu posiadanej przez nas Maliny przeniesieni zostaniemy na stronę, z której rozpocznie się pobieranie wybranej wersji systemu. Pomimo faktu, że nie ma zbyt dużej różnicy pomiędzy wydajnością wersji 32 a 64 bitowej, ja pobieram wersję ARM64, ze względu na możliwość późniejszego przeniesienia systemu do RPI 4, mogącego obsłużyć 4 GB pamięci RAM i działać wydajniej. Rozmiar pobieranego archiwum to około 650 MB. Kiedy obraz zostanie już pobrany, musimy przenieść go na kartę pamięci o rozmiarze przynajmniej 8 GB (Bazowy system po instalacji zajmuje ok. 3.12 GB).

W moim poprzednim wpisie, Raspberry PI – przygotowanie karty pamięci, pokazałem jak zainstalować obraz na karcie za pomocą programu BalenaEtcher. Po udanej instalacji obrazu wkładamy kartę pamięci do Raspberry PI. Następnie podłączamy malinę do sieci za pomocą portu Ethernet i podłączamy zasilanie. Po dwóch – trzech minutach system będzie gotowy do pracy. Kolejną zaletą Ubuntu nad Raspbianem jest automatycznie startujący daemon SSH, dzięki czemu nie musimy wykonywać dodatkowych czynności, aby uzyskać dostęp po sieci do Linuxowego terminala. 

No tak, malina podłączona, ale skąd mam wiedzieć jak się do niej podłączyć? Najprościej zalogować się do panelu routera i sprawdzić, jaki adres IP został przypisany przez DHCP. Alternatywnie możemy użyć aplikacji skanującej hosty w sieci i znaleźć ten o nazwie ubuntu. W moim przypadku Raspberry otrzymało adres 192.168.0.106.

Lista klientów serwera DHCP.

Logujemy się do serwera za pomocą SSH, używając do logowania użytkownika ubuntu oraz hasłem ubuntu. Po zalogowaniu się do systemu, przywita nas standardowy terminal systemu Ubuntu Linux, informujący nas o konieczności natychmiastowej zmiany hasła.  Wprowadzamy aktualne hasło do systemu, następnie dwukrotnie nowe hasło. Po poprawnej zmianie hasła, sesja SSH zostanie zamknięta, a my ponownie musimy połączyć się z maliną, używając już nowego hasła. 

 

Zmiana nazwy hosta i instalacja aktualizacji

Pierwszym krokiem, który zawsze wykonuję po instalacji systemu Linux jest zmiana domyślnej nazwy hosta. Dokonuję jej z dwóch zasadniczych powodów. Pierwszym jest chęć lepszej identyfikacji maszyny w sieci. Drugim natomiast jest ograniczenie prób ataku na system, gdzie atakujący ma podane na tacy, z jakim systemem ma do czynienia. Własna nazwa zmniejsza ryzyko ataku. W celu zmiany nazwy hosta wpisuję w terminal polecenia, które zmienią nazwę maszyny na NAZWAMASZYNY oraz zrestartują system operacyjny:

sudo hostnamectl set-hostname NAZWAMASZYNY
sudo reboot

Po ponownym uruchomieniu systemu, czas wykonać aktualizację list pakietów oraz samych pakietów. W tym celu uruchamiam znane z Raspbiana polecenie apt z odpowiednimi parametrami

sudo apt update && apt upgrade

Po zainstalowaniu wszystkich aktualizacji dobrze uruchomić ponownie naszą malinę, aby nowe jądro zostało załadowane.

Uwierzytelnianie dwuskładnikowe

Uwierzytelnianie dwuskładnikowe to jeden z najlepszych sposobów za zabezpieczenie przed nieautoryzowanym dostępem. Wymaga ono od nas przynajmniej 2 składników. Jednego który jest znany tylko nam, drugiego, który mamy przy sobie. Najczęściej elementem znanym jest hasło, a elementem, który mamy przy sobie jest klucz sprzętowy lub kod wygenerowany na posiadanym urządzeniu. Pozwala to systemowi pełną weryfikację naszej tożsamości i udostępnienie zasobów, do których dostęp powinniśmy mieć. W przypadku Maliny zamierzam wykorzystać udostępnioną przez Google implementację 2FA, gdzie rolę tokenu będzie spełniać telefon komórkowy. 

Implementację rozpoczynamy od instalacji na telefonie aplikacji do obsługi logowania dwuskładnikowego. Możemy wybrać dowolną spośród dostępnych w sklepach dostawców oprogramowania telefonu. Ja ze swojej strony polecam Microsoft Authenticator, który oprócz kodów do produktów firmy Microsoft, obsługuje logowanie do usług Google, Facebook i wielu innych. 

Konfiguracja serwera

Po instalacji aplikacji mobilnej rozpoczynamy instalację i konfigurację 2FA na naszym serwerze. Najpierw instalujemy niezbędny pakiet i uruchamiamy narzędzie konfiguracyjne:

sudo apt install libpam-google-authenticator
google-authenticator

Kreator zada nam pytanie, czy klucze powinny działać w oparciu o czas, wybieramy opcję Y i naszym oczom ukażą się następujące dane:

  • Adres URL, pod którym możemy uzyskać nasz kod QR do konfiguracji w aplikacji Authenticator
  • Kod QR do aplikacji Authenticator (zależnie od użytego terminala, kod może być nieczytelny)
  • Klucz prywatny, kod weryfikacyjny i klucze zapasowe

Kolejnym pytaniem zadanym przez aplikację jest, czy mamy zapisać ustawienia. Odpowiadamy twierdząco.

Następnie odpowiadamy na pytanie, czy chcemy uniemożliwić wielokrotne logowanie tym samym kodem (wynikiem tego jest ograniczenie kolejnych logowań do terminala do 30 sekund. Zwiększa to możliwość zauważenia i przeciwdziałania atakom man-in-the-middle). Odpowiadamy zależnie od naszych potrzeb.

Kolejne pytanie zadane przez kreator dotyczy możliwych opóźnień w komunikacji i wydłużenie domyślnego czasu przechowywania informacji o poprzednim tokenie. Kod zmienia się co 30 sekund, ale jeżeli połączenie jest wolne, to czas potrzebny na przekazanie kodu może się wydłużyć. Jeżeli mamy do czynienia ze słabym połączeniem sieciowym to warto odpowiedzieć y na zadane pytanie, w przeciwnym razie, dla większego bezpieczeństwa lepiej wybrać n.

Ostatnie pytanie dotyczy limitu prób logowania z wykorzystaniem kodu z tokenu. Jeżeli system nie posiada odpowiednich zabezpieczeń blokujących konto po wpisaniu niewłaściwego hasła to ta opcja konfiguracyjna pozwala na zabezpieczenie naszego konta i blokadzie logowania na 30 sekund, jeżeli kod z tokenu został podany błędnie 3 razy.  Tutaj odpowiadamy również zgodnie z naszymi potrzebami.

W tym momencie należy dodać do aplikacji Authenticator nasz kod QR i sprawdzić, czy kody są generowane. 

Wymuszenie 2FA podczas połączenia SSH

Włączyliśmy obsługę dwuskładnikowego uwierzytelniania w systemie. Musimy jeszcze poinformować o tym demona SSH, aby podczas logowania używał usługi authenticator do pytania o kod z urządzenia mobilnego. W tym celu otwieramy w edytorze tekstu plik (jako root)

sudo nano /etc/pam.d/sshd

i dodajemy w miejscu wskazanym na obrazku poniżej linię

auth       required     pam_google_authenticator.so

 

Zapisujemy zmiany naciskając Ctrl+X, następnie potwierdzamy klawiszem Y. 

Ostatnim krokiem jest modyfikacja parametru w pliku sshd. W tym celu w konsoli wpisujemy

sudo nano /etc/ssh/sshd_config

Odszukujemy linię 

ChallengeResponseAuthentication no

I zmieniamy jej wartość na Yes, następnie zapisujemy zmiany. Wykonujemy restart maliny.

Po ponownym uruchomieniu i próbie logowania, system poprosi nas o podanie kodu weryfikacyjnego, a następnie o podanie hasła. Po podaniu poprawnych wartości zostaniemy zalogowani do systemu:

Podsumowując, pokazałem dzisiaj, w jaki sposób zainstalować i zabezpieczyć za pomocą dwuskładnikowego logowania Ubuntu Server. Uważam, że posiadanie wieloskładnikowego logowania jest przyszłością, z której powinniśmy w miarę możliwości korzystać wszyscy. W ten sposób dodatkowo zabezpieczamy serwery przed atakami. A jakie są wasze doświadczenia z innymi niż Raspbian systemami? Jaki system macie Wy na swoich malinkach? 

Arek Kożuch

Cześć, jestem Arek! Na co dzień informatyk, w wolnych chwilach pasjonat druku 3D, nowych technologii i ciągłego doskonalenia się. W życiu najbardziej cenię sobie radość i ludzi, którzy mnie otaczają każdego dnia.

Może Ci się również spodoba

%d bloggers like this: