VPS dla początkujących cz. 1: SSH i firewall

Napisano dnia 9.07.2021 r. o godzinie 7:00
Autor: Piotr Sperka

Wstęp

Witaj w nowej serii artykułów. Tym razem zajmiemy się obsługą i administracją VPS dla początkujących. Docelowo chcemy mieć maszynę, na której znajdą się przynajmniej następujące usługi:

  • WordPress
  • Gitea (Git z interfejsem webowym)
  • Jakiś rodzaj wiki
  • Serwer e-mail wraz z webmailem
  • Chmura do przechowywania plików, np. Owncloud lub Nextcloud

Ponadto zajmiemy się podstawowym zabezpieczeniem serwera przed niepożądanym dostępem. Właściwie to od tego zaczniemy już dzisiaj. Z racji na obecnie panujące trendy i ogólną wygodę zarządzania, postanowiłem, że większość tych usług (o ile nie wszystkie) postawimy w formie kontenerów na Dockerze. Wiadomo – takie podejście powoduje pewien narzut na zasoby (ale nie tak znaczący, jak wiele osób myśli – Docker to nie wirtualizacja!), ale też znacznie przyspiesza cały proces dodawania usług i ich późniejszej aktualizacji. Łatwiej jest też takie usługi usunąć lub czasowo wyłączyć. Jest też znacznie mniejsze prawdopodobieństwo, że aktualizacja systemu skończy się wielogodzinnym poprawianiem konfiguracji poszczególnych usług. Ogólnie rzecz biorąc, po opanowaniu podstaw Dockera, zarządzanie usługami będzie łatwiejsze. Dodatkowo mam wrażenie, że dużo poradników na temat stawiania swojego VPSa ma już swoje lata, i praktycznie w każdym usługi instalowane są klasycznie, a nie w formie kontenerów.

W dzisiejszych czasach VPS posiadający 2 wątki (vCore) i 4GB RAM można mieć spokojnie poniżej 50zł miesięcznie. Taki z połową tych zasobów – za około 20zł. Seria ta będzie dla mnie również pewnego rodzaju note-to-self, ponieważ o ile tego typu poradników jest w sieci cała masa, to w większości przypadków, żeby wszystko działało, musiałem posiłkować się przynajmniej kilkoma i własną wiedzą. Na koniec tego przydługiego wstępu dwie uwagi. Po pierwsze, nie jestem specjalistą od bezpieczeństwa i administracji serwerami! Nie traktuj tego co napiszę jako prawdy objawionej. Nie jest to też droga do konfiguracji serwera mającego obsługiwać duży ruch lub zawierającego wrażliwe dane. Po drugie, siłą rzeczy ciężko jest opisać wszystko od zupełnych podstaw i zachować jako-taką czytelność. W związku z tym zakładam, że masz chociaż podstawowe pojęcie o tym jak działa sieć i systemy Linux. Bez takiej podstawowej wiedzy tak czy siak posiadanie VPS raczej nie będzie zaletą, tylko udręką.

Przygotowanie maszyny

Na początek potrzebujemy maszynę, na której przeprowadzimy wszystkie operacje. Tak naprawdę nie musi to być VPS z domeną. Z powodzeniem możesz przeprowadzić opisywane przeze mnie operacje na przykład na maszynie wirtualnej, albo fizycznym komputerze. Nie powinno to mieć większego znaczenia, jeśli zależy Ci tylko i wyłącznie na eksperymentach i wartości edukacyjnej. Posiadanie dodatkowej „kopii” swojego serwera w postaci lokalnej maszyny wirtualnej również może być dobrym pomysłem. Możesz wtedy bezpiecznie przetestować operacje które chcesz wykonać zanim zaczniesz prace na działającym serwerze. Szczególnie jeśli jesteś początkujący, może uchronić Cię to przed utratą danych lub wielogodzinnym brakiem dostępu do usług. Na potrzeby tej serii wybrałem maszynę z systemem Debian 10, którą podłączę również do domeny. Tak jak wspomniałem, wiele z dalszych punktów można zrobić na przykład na maszynie działającej na VirtualBoksie. Wybór systemu wynika ściśle z moich preferencji co do dystrybucji Linuksa, jednak koncepcja na innych odmianach będzie podobna. W moim przypadku maszyna ma przyznane 2 rdzenie i 6GB pamięci RAM, jednak swoją możesz stworzyć (lub wykupić) wedle swojego uznania. Maszyny wirtualne (a serwery VPS de facto takimi właśnie są) mają tę dodatkową zaletę, że ich zasoby można zmieniać niemal w locie. Swobodnie można zacząć od jednego rdzenia i 2GB RAM, i w przypadku, gdy okaże się to za mało, przyznać większe zasoby. Naszą przygodę zaczynamy z czystym systemem – jedyną opcją dodatkową jaką zaznaczyłem w instalatorze był serwer SSH.

Konfiguracja domeny

Jeżeli zdecydowałeś się na użycie „prawdziwego” VPS z domeną, pierwszą rzeczą jaką musisz zrobić, jest ustawienie rekordu A u dostawcy DNS tak, by wskazywał na IP serwera VPS. Warto również w konfiguracji VPS (w panelu administracyjnym dostawcy) ustawić reverse DNS na swoją domenę. Gdzie dokładnie można to zrobić musisz już sprawdzić w dokumentacji swojego dostawcy VPS. Jeśli chodzi o DNS, nie korzystam z serwerów rejestratora domeny, tylko z Cloudflare w darmowym wariancie. Zapewnia on łatwą konfigurację rekordów, cache, a także łatwą i automatyczną integrację z LetsEncrypt, co przyda się później, gdy będziemy generować certyfikat SSL. Celowo nie opisuję tutaj dokładnie konfiguracji domeny – na ten temat można znaleźć bardzo dużo materiałów. Podsumowując, na początek potrzebujemy dodać rekord A. Całą resztą zajmiemy się później w miarę potrzeb.

Dostęp zdalny – SSH

Żeby móc zarządzać naszym serwerem, potrzebujemy możliwości zdalnego zalogowania się. Można to zrobić bezpośrednio z interfejsu maszyny wirtualnej (odpowiednik fizycznego operowania przy komputerze) lub poprzez SSH. Domyślnie SSH działa na porcie 22. Do zalogowania się poprzez SSH potrzebujemy w zasadzie jedynie adresu IP serwera oraz nazwy użytkownika i hasła (oraz klienta, na przykład PuTTY na Windowsie lub poprostu ssh na Linuksie). W systemie Debian 10 domyślnie poprzez SSH nie można zalogować się bezpośrednio na konto z pełnymi uprawnieniami (root), co jest już pewnym zabezpieczeniem. Należy jednak pamiętać, że jeśli system instalowany jest przez dostawcę VPS, opcja ta może być aktywna – tak było w przypadku mojego VPS. Było to podyktowane tym, że po stworzeniu VPS root był jedynym użytkownikiem w systemie. Aby dodatkowo utrudnić próby niepowołanego dostępu do serwera, sugeruję zmianę portu na którym działa SSH na inny od domyślnego.

Jeżeli jedynym użytkownikiem w systemie jest root, całą zabawę należy rozpocząć od stworzenia konta swojego użytkownika, po zalogowaniu się jako root. Zrobisz to poleceniem useradd -m nazwa_uzytkownika. Przełącznik -m nakazuje również stworzyć katalog domowy użytkownika. Następnie musisz użyć polecenia passwd nazwa_uzytkownika aby ustalić hasło dla nowo stworzonego konta. Od tego momentu do logowania się poprzez SSH można używać swojego użytkownika.

W naszym wypadku dla SSH wybrałem port 1222. Aby zmienić port, logujemy się na serwer przy pomocy konta użytkownika, następnie przechodzimy na konto roota poleceniem su. Edytujemy plik /etc/ssh/sshd_config przy pomocy wybranego edytora, na przykład nano: nano /etc/ssh/sshd_config. W pliku szukamy linię zawierającą słowo Port, odkomentowujemy ją (usuwamy znak # na początku linii) i zmieniamy liczbę 22 na wybraną przez nas, na przykład 1222. Dodatkowo upewniamy się, że parametr PremitRootLogin jest ustawiony na no. Teraz zapisujemy plik (Ctrl+O) i zamykamy nano (Ctrl+X). Pozostaje tylko zrestartować sshd poleceniem systemctl restart sshd, i możesz spróbować zalogować się poprzez SSH na wybranym przez nas porcie. Jeżeli wszystko zostało wykonane poprawnie, logowanie powinno przejść pomyślnie.

Pierwsze kroki

Skoro już jesteśmy w stanie zalogować się, warto na sam początek zaktualizować system i zainstalować dwa przydatne programy: htop i Midnight Commander. Żeby to zrobić, musisz zalogować się na konto roota poleceniem su -, a następnie wykonać:

apt update
apt upgrade
apt install htop mc

Firewall – UFW

Firewall jest podstawowym narzędziem pomagającym zabezpieczyć nasz serwer. Zasada jest taka, żeby otworzyć tylko te porty, które muszą być otwarte. Na początek instalujemy firewall ufw. Jako root wykonujemy apt install ufw. Po instalacji sprawdzamy stan firewalla poleceniem ufw status.

Jeżeli teraz dostaniemy odpowiedź w stylu bash: ufw: command not found, oznacza to, że ufw nie ma w lokalizacji obecnej w ścieżkach w PATH. Rozwiązaniem na to jest wyjście z roota poleceniem exit i ponowne zalogowanie poleceniem su -. Pusty przełącznik (myślnik) zapewni pełne przelogowanie się na konto roota, łącznie ze zmianą PATH na ten odpowiedni dla roota. Więcej na ten temat można znaleźć w wielu źródłach, na przykład tutaj.

Polecenie ufw status powinno dać odpowiedź Status: inactive. Oznacza to, że firewall jest nieaktywny.

Pierwszym krokiem jest podejrzenie domyślnej polityki firewalla. Wykonujemy cat /etc/default/ufw. W moim wypadku dostałem odpowiedź, której fragment zamieściłem poniżej:

[...]
# Set the default input policy to ACCEPT, DROP, or REJECT. Please note that if
# you change this you will most likely want to adjust your rules.
DEFAULT_INPUT_POLICY="DROP"

# Set the default output policy to ACCEPT, DROP, or REJECT. Please note that if
# you change this you will most likely want to adjust your rules.
DEFAULT_OUTPUT_POLICY="ACCEPT"

# Set the default forward policy to ACCEPT, DROP or REJECT.  Please note that
# if you change this you will most likely want to adjust your rules
DEFAULT_FORWARD_POLICY="DROP"
[...]

Wynika z niej, że po włączeniu firewalla domyślnie cały ruch przychodzący będzie odrzucany (DEFAULT_INPUT_POLICY), natomiast cały ruch wychodzący będzie odbywał się bez ograniczeń (DEFAULT_OUTPUT_POLICY). Jeżeli teraz włączylibyśmy firewall, zablokowalibyśmy sobie dostęp do SSH. Wtedy na ratunek przychodzi dostęp do maszyny poprzez konsolę maszyny wirtualnej (np. VirtualBoxa, albo naszego dostawcy VPS). Aby tego uniknąć, najpierw dodamy regułę odblokowującą port 1222, na którym działa SSH. Wykonujemy ufw allow 1222/tcp. Teraz możemy aktywować firewall poleceniem ufw enable. Na komunikat stwierdzający, że włączenie firewalla może zaburzyć istniejące połączenia odpowiadamy twierdząco. Na koniec sprawdzamy status firewalla poleceniem ufw status verbose. W moim przypadku dostałem następującą odpowiedź:

Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), deny (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
1222/tcp                   ALLOW IN    Anywhere
1222/tcp (v6)              ALLOW IN    Anywhere (v6)

Oznacza to, że obecnie nasza maszyna będzie akceptowała ruch przychodzący jedynie na porcie 1222.

Podsumowanie

W tej części zabezpieczyliśmy w podstawowy sposób naszą maszynę. Oczywiście, na nic te działania jeśli hasło użytkownika i jego nazwa są typowe i „słownikowe”, albo bardzo krótkie (to dotyczy głównie hasła), toteż zalecam tutaj kreatywność ;). W takim stanie maszyna może spokojnie oczekiwać na kolejną część serii. Zajmiemy się w niej instalacją Dockera i postawieniem pierwszej usługi. Do zobaczenia i jak zwykle – zapraszam do kontaktu!