Dziś przeglądałem się liście tematów do opisania, i gdzieś tam na dole, trochę zapomniane grzecznie czekały tematy związane z podstawową konfiguracją serwera opartego (nie tylko) o system Debian (dedykowany, Raspberry Pi czy VPS, nie ma znaczenia). Część zagadnień już za nami, ale zostało jeszcze kilka, może nie tak nośnych jak choćby instalacja i konfiguracja serwera WWW, ale moim zdaniem są to tematy niezbędne – związane z bezpieczeństwem. Dlatego w najbliższych dniach spodziewajcie się 4-6 wpisów poświęconych podstawowym środkom bezpieczeństwa (nie tylko) na serwerze, po których spróbuję zrobić wpis z małym podsumowanie, i zebraniem wszystkich najważniejszych tematów w jednym miejscu/wpisie. Dziś firewall – prosty, a skuteczny…

UFW – Uncomplicated Firewall

Programem, który wykorzystamy do stworzenia/skonfigurowania naszej zapory sieciowej (firewall) będzie UFW, który tak naprawdę jest pewnego rodzaju nakładką na IPtables, ale dzięki swojej skuteczności i prostocie obsługi ma wielu zwolenników.

Instalacja i podstawowa konfiguracja

Standardowo zaczniemy od instalacji, a ta będzie prosta – bo UFW znajduje się w repozytoriach Debiana (Raspbiana, Ubuntu), więc wystarczy skorzystać z polecenia:

sudo apt-get install ufw

Po instalacji jeszcze włączymy automatyczny start usługi wraz z systemem:

sudo nano /etc/ufw/ufw.conf

I zmieniamy:

ENABLED=no

na:

ENABLED=yes

Można się jeszcze upewnić, czy mamy aktywną obsługę IPv6:

IPV6=yes

Nawet jak teraz/jeszcze nie korzystacie z IPv6, to nie zaszkodzi – będzie na przyszłość.

Status usługi

Zanim zaczniemy jakiekolwiek zmiany w konfiguracji dotyczące blokowania, sprawdzamy status usługi, by później nie było niespodzianek:

sudo ufw status verbose

Raczej na pewno otrzymacie w odpowiedzi:

Status: inactive

Gdyby status był „active” (mało prawdopodobne na tym etapie, ale…), to przed dalszą konfiguracją warto tymczasowo wyłączyć UFW:

sudo ufw disable

oraz zrestartować do wartości domyślnych:

sudo ufw reset

Konfiguracja reguł

Standardowo zaczynam konfigurację reguł UFW od 2 podstawowych reguł:

sudo ufw default deny incoming
sudo ufw default allow outgoing

Pierwsza blokuje cały ruch przychodzący, druga pozwala na ruch wychodzący, co jest bazą dla pozostałych reguł, w których będziemy zezwalać na połączenia przychodzące dla różnych portów/usług.

Struktura poleceń

Zacznę od zaprezentowania podstawowych poleceń, i będą to chyba najczęściej używane/najpopularniejsze, choć nie obiecuje, że wszystkie:

sudo ufw allow [nazwa_usługi]
sudo ufw allow [port]
sudo ufw allow [port_od]:[port_do]
sudo ufw allow [port]/[typ_połączenia]
sudo ufw allow [port_od]:[port_do]/[typ_połączenia]
sudo ufw allow from [adres_IP]
sudo ufw allow from [adres_IP] to any port [port]
sudo ufw allow from [adres_IP]/[maska_sieciowa] to any port [port]
sudo ufw allow from [adres_IP]/[maska_sieciowa] to any port [port] proto [typ_połączenia]
sudo ufw allow in on [interfejs_sieciowy] to any port [port]
sudo ufw insert [numer_reguły] deny [port]
sudo ufw insert [numer_reguły] deny from [adres_IP]

Pewnie część z Was się domyśliła, że tam, gdzie jest „allow” (zezwól) można wpisać „deny” (zabroń), by stworzyć regułę blokującą, zamiast zezwalającej.

To wyjaśnię jeszcze pozostałe zwroty, choć pewnie część/większość również jest dość oczywista:

  • [nazwa_usługi] – zamiast podawać konkretny port czy ty protokołu można podać nazwę usługi (np. ssh, http, https). Raczej nie korzystam, wolę ręcznie/samodzielnie wskazać co, gdzie i jak
  • [port] – port, na którym nasłuchuje jakaś usługa, a których chcemy otworzyć (np. 80 dla HTTP, 443 dla HTTPS, 3306 dla MySQL)
  • [port_od]:[port_do] – zakres portów, „od – do” (np. 80-88)
  • [typ_połączenia] – możecie sprecyzować czy reguła dotyczy protokołu „tcp” czy „udp” (domyślnie oba)
  • [adres_IP] – ograniczamy działanie reguły do konkretnego adresu IP (np. 123.123.123.123)
  • [maska_sieciowa] – maska sieciowa, dzięki której możemy za pomocą jednej reguły zdefiniować wiele adresów IP, np. całą sieć LAN
  • [interfejs_sieciowy] – oznaczenie karty sieciowej, dla ruchu, na której reguła będzie mieć zastosowanie (np. eth0)
  • [numer_reguły] – reguły dotyczące blokowania warto dawać na górze, przed regułami zezwalającymi (w dalszej części będzie o wyświetlaniu zdefiniowanych reguł)

Tak jak napisałem powyżej – pewnie nie wyczerpałem wszystkich dostępnych poleceń dotyczących tworzenia reguł, ale na pewno te podstawowe. Zresztą jak chyba widać na przykładach – można poszczególne elementy właściwie dowolnie ze sobą mieszać/łączyć.

Przykładowe reguły

Poniżej kilka przykładowych reguł – niekoniecznie używanych przeze mnie, ale dotyczących dość popularnych usług, a zarazem pozwalających zobrazować to, o czym pisałem powyżej.

Serwer SSH na porcie 22 (choć zawsze zalecam zmianę):

sudo ufw allow 22

Serwer WWW na porcie 80:

sudo ufw allow 80

Serwer WWW, połączenie szyfrowane na porcie 443:

sudo ufw allow 443

Serwer miniDLNA na porcie 8200, dostępne tylko sieci LAN 10.0.*.*:

sudo ufw allow from 10.0.0.1/16 to any port 8200

Serwer CUPS na porcie 631:

sudo ufw allow from 10.0.0.1/16 to any port 631

Serwer Samba, dostęp z sieci LAN + oddzielne porty dla oddzielnych typów połączenia:

sudo ufw allow from 10.0.0.1/16 to any port 137 proto udp
sudo ufw allow from 10.0.0.1/16 to any port 138 proto udp
sudo ufw allow from 10.0.0.1/16 to any port 139 proto tcp
sudo ufw allow from 10.0.0.1/16 to any port 445 proto tcp

Serwer NTP na porcie 123:

sudo ufw allow 123/udp

Serwer VPN PPTP na porcie 1723:

sudo ufw allow 1723

W przypadku usługi VPN (PPTP) samo otwarcie portu może być za mało – w systemie Raspbian/Debian 7 Wheezy nie było takiej potrzeby, to już w Raspbian/Debian 8 Jessie bez tych dodatkowych operacji UFW nie pozwoli na korzystanie z VPNa.

Zaczynamy od edycji pliku:

sudo nano /etc/ufw/before.rules

gdzie dodajemy:

# Dla VPN/PPTP
-A ufw-before-input -p 47 -j ACCEPT
-A ufw-before-output -p 47 -j ACCEPT

Ja zazwyczaj dodaję zaraz po fragmencie:

# Don't delete these required lines, otherwise there will be errors * filter
(...)
# End required lines

Dodatkowo w pliku:

sudo nano /etc/default/ufw

zmieniamy:

DEFAULT_FORWARD_POLICY="DROP"

na:

DEFAULT_FORWARD_POLICY="ACCEPT"

Start usługi

Gdy już zablokowaliście wszystkie połączenia przychodzące, zezwoliliście na połączenia wychodzące, i odblokowaliście choćby port dla SSH (jeśli tak jesteście połączeni z serwerem/komputerem) możecie aktywować zaporę za pomocą polecenia:

sudo ufw enable
W tym momencie jeszcze raz uczulam, że gdy łączycie się z danym komputerem/serwerem zdalnie (np. za pomocą SSH) przed aktywacją zapory (UFW) odblokować niezbędne porty dla danego połączenia, tak byście nie odcięli sobie dostępu do systemu.

Jeśli jesteście pewni, że wszystko jest OK, na pytanie, które pojawi się przy próbie uruchomienia zapory, odpowiadacie „y”:

Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup

Lista reguł, stan zapory

W każdej chwili – po aktywacji usługi – może sprawdzić listę ustawionych/zdefiniowanych reguł za pomocą polecenia:

sudo ufw status

lub:

sudo ufw status verbose

Przykładowa odpowiedź:

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

To                         Action      From
--                         ------      ----
22			   ALLOW IN    Anywhere
1723                       ALLOW IN    Anywhere
80                         ALLOW IN    Anywhere
443                        ALLOW IN    Anywhere
8200                       ALLOW IN    10.0.0.1/16
631                        ALLOW IN    10.0.0.1/16
137/udp                    ALLOW IN    10.0.0.1/16
138/udp                    ALLOW IN    10.0.0.1/16
139/tcp                    ALLOW IN    10.0.0.1/16
445/tcp                    ALLOW IN    10.0.0.1/16
123/udp                    ALLOW IN    Anywhere
22		           ALLOW IN    Anywhere (v6)
1723                       ALLOW IN    Anywhere (v6)
80                         ALLOW IN    Anywhere (v6)
443                        ALLOW IN    Anywhere (v6)
123/udp                    ALLOW IN    Anywhere (v6)

Choć jak polecam wersję z numerowaniem, co przyda się np. przy kasowaniu niepotrzebnych reguł:

sudo ufw status numbered

W odpowiedzi – dla naszego testowego zestawu – zobaczycie coś takiego:

Status: active

     To                         Action      From
     --                         ------      ----
[ 1] 22		                ALLOW IN    Anywhere
[ 2] 1723                       ALLOW IN    Anywhere
[ 3] 80                         ALLOW IN    Anywhere
[ 4] 443                        ALLOW IN    Anywhere
[ 5] 8200                       ALLOW IN    10.8.0.0/16
[ 6] 631                        ALLOW IN    10.8.0.0/16
[ 7] 137/udp                    ALLOW IN    10.8.0.0/16
[ 8] 138/udp                    ALLOW IN    10.8.0.0/16
[ 9] 139/tcp                    ALLOW IN    10.8.0.0/16
[10] 445/tcp                    ALLOW IN    10.8.0.0/16
[11] 123/udp                    ALLOW IN    Anywhere
[12] 22		                ALLOW IN    Anywhere (v6)
[13] 1723                       ALLOW IN    Anywhere (v6)
[14] 80                         ALLOW IN    Anywhere (v6)
[15] 443                        ALLOW IN    Anywhere (v6)
[16] 123/udp                    ALLOW IN    Anywhere (v6)

Kasowanie niepotrzebnych reguł

Kasować reguły możecie za pomocą polecenia, za pomocą którego zostały wcześniej utworzone – wystarczy po „ufw” dodać „delete”:

sudo ufw delete allow 22
sudo ufw delete allow 123/udp

To moim zdaniem dużo wygodniejszą metodą jest skorzystanie z polecenia:

sudo ufw status numbered

Co spowoduje wyświetlenie listy reguł z przyporządkowanymi im numerami:

Status: active

     To                         Action      From
     --                         ------      ----
[ 1] 22		                ALLOW IN    Anywhere
[ 2] 1723                       ALLOW IN    Anywhere
[ 3] 80                         ALLOW IN    Anywhere
[ 4] 443                        ALLOW IN    Anywhere
[ 5] 8200                       ALLOW IN    10.8.0.0/16
[ 6] 631                        ALLOW IN    10.8.0.0/16
[ 7] 137/udp                    ALLOW IN    10.8.0.0/16
[ 8] 138/udp                    ALLOW IN    10.8.0.0/16
[ 9] 139/tcp                    ALLOW IN    10.8.0.0/16
[10] 445/tcp                    ALLOW IN    10.8.0.0/16
[11] 123/udp                    ALLOW IN    Anywhere
[12] 22		                ALLOW IN    Anywhere (v6)
[13] 1723                       ALLOW IN    Anywhere (v6)
[14] 80                         ALLOW IN    Anywhere (v6)
[15] 443                        ALLOW IN    Anywhere (v6)
[16] 123/udp                    ALLOW IN    Anywhere (v6)

Dzięki temu możemy kasować reguły szybko i precyzyjnie za pomocą polecenia:

sudo ufw delete 1

Co spowoduje skasowanie reguły:

[ 1] 22		                ALLOW IN    Anywhere

Reset ułatwień

Gdyby tak się stało, że z jakichś przyczyn (np. testy ;-)) tak namieszaliście w konfiguracji, że sami już nie wiecie która reguła, do czego służy, to zawsze możecie zresetować/wyczyścić dodane reguły:

sudo ufw reset

Tylko pamiętajcie, by wcześniej – na wszelki wypadek – zdezaktywować zaporę:

sudo ufw disable

GUFW, czyli UFW z graficznym interfejsem użytkownika (GUI)

Jeśli zamiast poleceń wydawanych z konsoli (wiersza poleceń – windowsowiec ze mnie) wolicie korzystać z graficznego interfejsu użytkownika, to możecie doinstalować sobie program GUFW:

sudo apt-get install gufw

Program ten uruchomicie bezpośrednio z poziomu systemu (gdy korzystacie z trybu graficznego), lub gry u Was tak jak u mnie Linux to tylko konsola (tylko na potrzeby serwerów, prywatnie/na co dzień Windows ;-)) za pomocą X11/Xming:

gksudo gufw

W głównym oknie programu znajdziecie status usługi, podstawowe opcje związane ze sterowaniem UFW, oraz listę zdefiniowanych reguł:

linux_ufw_gufw

Samo dodawanie reguł oczywiście też możecie wykonać w trybie graficznym, tutak w trybie zaawansowanym:

linux_ufw_gufw_add-rule01

Podsumowanie

I to właściwie wszystko – mam nadzieję, że dzięki temu poradnikowi Ci z Was (zwłaszcza na serwerze), którzy do tej pory nie korzystali z żadnej zapory, zdecydują się na wdrożenie u siebie choćby UFW, co jest, jak widzieliście – a przynajmniej mam taką nadzieje – proste, a zarazem skuteczne.

By uzyskać więcej informacji, wystarczy, że skorzystacie z polecenia:

man ufw

Jak napisałem we wstępie – to pierwszy wpis z kilku które wisiały, a które chyba pozwolą nam zamknąć temat przygotowania serwera VPS do pracy jako m.in. serwer WWW…

(!) Zgłoś błąd na stronie
Pomogłem? To może postawisz mi wirtualną kawę?
LUTy dla D-Cinelike (DJI Mini 3 Pro, DJI Avata, OSMO Pocket) od MiniFly
Wdrożenie Omnibusa w sklepie na WooCommerce
Jak (legalnie) latać dronem w Kategorii Otwartej
Patryk