Go to main content

VPS: Poradnik Bezpieczeństwa Linux

Ten poradnik został stworzony z wykorzystaniem następujących produktów:

(Szczegóły mogą się różnić w zależności od produktów różnych dostawców, ale główne koncepcje pozostają takie same)

Wprowadzenie

Ten poradnik zawiera kilka wskazówek i porad, jak uczynić Twój serwer Linux bardziej bezpiecznym. Szczególnie, że (wirtualne) serwery muszą być dostępne z zewnątrz, podstawowa ochrona przed niechcianym dostępem jest zdecydowanie zalecana i nie powinna być pomijana.

informacja

Pamiętaj, że te instrukcje nie są wyczerpujące, a bardziej szczegółowe informacje znajdziesz w innych sekcjach dokumentacji ZAP. (np. 2FA (SSH))

tip

Najprostszy sposób na zabezpieczenie serwera jest zawsze taki sam, niezależnie od serwera: używaj bezpiecznych haseł, regularnie aktualizuj swoje usługi i ogólnie zwracaj uwagę, które usługi instalujesz i jakich poradników używasz.

Zabezpieczenie SSH

SSH (Secure Shell) to usługa, która pozwala na zdalny dostęp do konsoli serwera w celu wykonywania poleceń. Tutaj dowiesz się, jak skonfigurować SSH na swoim serwerze: Początkowy dostęp (SSH)

Domyślnie do SSH używa się logowania na hasło. Ma to jednak dużą wadę – uwierzytelnianie można stosunkowo łatwo obejść atakiem brute force, zwłaszcza jeśli używasz zbyt prostego hasła do logowania SSH. Jeśli więc zdecydujesz się na logowanie hasłem, używaj bezpiecznego hasła.

Aby jeszcze lepiej chronić serwer przed niechcianym dostępem SSH, powinieneś włączyć uwierzytelnianie wyłącznie za pomocą kluczy SSH i wyłączyć logowanie na hasło. Sprawdź poradnik Klucz SSH, który wyjaśnia, jak wygenerować i dodać klucze SSH.

Konfiguracja portów usług

UsługaPort
SSH22
FTP21
Mail25
DNS53
HTTP80
HTTPS443

Usługi takie jak SSH czy FTP domyślnie korzystają z tych samych portów (niektóre z nich wymienione są w tabeli powyżej). Jeśli złośliwy aktor z zewnątrz chce przeprowadzić atak brute force na usługę SSH Twojego serwera, najpierw musi znać port, na którym działa SSH. Jeśli nie zmienisz tych portów, to porty 22 i 21 są zwykle celem do wykonywania poleceń bezpośrednio na serwerze lub dostępu do plików przez FTP.

Aby temu zapobiec, zalecamy ustawienie portów standardowych usług na niestandardowe. W kolejnej części poradnika dowiesz się, jak to zrobić:

ważne

Wybrany port musi mieścić się w zakresie od 1024 do 65536 i nie może być już używany przez inną usługę!

Możesz użyć cat /etc/services, aby wyświetlić standardowe porty i uniknąć wyboru portu już zajętego.

Port SSH

Aby zmienić port SSH, musisz edytować plik konfiguracyjny. Domyślnie znajduje się on w /etc/ssh/sshd_config, ale jeśli go tam nie ma, możesz użyć poniższego polecenia, aby go znaleźć.

find / -name "sshd_config" 2>/dev/null

Teraz otwórz plik za pomocą nano (jako root lub z sudo).

sudo nano /etc/ssh/sshd_config

Dodaj swój wybrany port po Port. Jeśli Port jest zakomentowany (np. #Port 22), usuń "#" i zamień 22 na swój port. Następnie zapisz plik (w Nano Ctrl + o) i zamknij go (Nano: Ctrl + x).

Port sshd

Teraz musisz zrestartować usługę SSH, aby zmiany zaczęły działać.

#Na Ubuntu/Debian/CentOS np.
sudo systemctl restart sshd

Port FTP

Jeśli masz zainstalowaną usługę FTP, np. proFTPd, port również można zmienić, edytując plik konfiguracyjny. Procedura jest podobna do tej dla SSH.

Znajdź plik konfiguracyjny proftpd.conf

find / -name "proftpd.conf" 2>/dev/null

Plik zwykle znajduje się w /etc/proftpd.conf (CentOS) lub /etc/proftpd/proftpd.conf (Ubuntu, Debian). Otwórz plik nano i usuń "#" przed port, wpisując swój port. Pamiętaj o wcześniejszych wskazówkach, aby nie wybrać nieprawidłowego portu.

tip

W nano użyj Ctrl + W, aby wyszukać.

nano /etc/proftpd/proftpd.conf

Port proftpd

Użycie zapory sieciowej (firewall)

Zasada zewnętrznej dostępności serwera jest zawsze taka sama: port musi być otwarty, aby serwer był dostępny z zewnątrz. W przypadku SSH jest to domyślnie port 22/TCP. (patrz wyżej, jak zmienić domyślny port)

Problem polega na tym, że ten port jest teraz dostępny dla każdego, bez względu na osobę, lokalizację i intencje. To poważna luka bezpieczeństwa, ponieważ złośliwi aktorzy mogą zalewać serwer próbami logowania, aby poznać prawidłowe hasło (przez atak brute force, jeśli logowanie na hasło jest włączone) lub próbować przeciążyć sieć serwera (np. DDoS).

Aby ograniczyć te zagrożenia, możesz zastosować reguły zapory sieciowej, które ograniczą dostęp do otwartych portów.

Masz do wyboru dwie metody:

  • IPTables: to oryginalna zapora Linuxa, oferuje wiele opcji, ale jest trochę bardziej skomplikowana.
  • UFW: to prostszy interfejs do IPTables, który ułatwia obsługę, ale jest mniej elastyczny.

Wybór należy do Ciebie. W zależności od potrzeb możesz potrzebować wszechstronności IPTables, ale czasem UFW wystarczy (np. do prostego otwierania/zamykania portów, co i tak jest lepsze niż nic!).

IPTables

W tej sekcji użyjesz IPTables, aby stworzyć reguły ograniczające liczbę prób połączeń. Wyjaśnienia do poszczególnych poleceń znajdziesz pod blokiem kodu.

Pamiętaj, że ta reguła działa tylko dla portu 22 (wartość po --dport), a polecenia dla innych usług trzeba dostosować.

notatka

Poniższe polecenia mogą nie działać na każdej dystrybucji Linuxa, ale zadziałają na większości popularnych.

Zaloguj się na swój serwer Linux. Jeśli potrzebujesz pomocy, skorzystaj z naszego poradnika Początkowy dostęp (SSH). Następnie wykonaj poniższe polecenia w podanej kolejności.

iptables -A INPUT -p tcp --syn --dport 22 -m connlimit --connlimit-above 2 --connlimit-mask 32 -j DROP
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 1 --hitcount 2 -j DROP
  1. Pierwsza reguła odrzuca pakiety, jeśli jest więcej niż 2 połączenia w stanie TIME_WAIT do portu 22 z jednego adresu IP.
  2. Druga reguła dodaje adres IP nowego połączenia do listy recent.
  3. Trzecia reguła odrzuca nowe połączenia z adresów IP, które próbowały nawiązać więcej niż 2 połączenia w ciągu ostatniej sekundy.

UFW

Jak wspomniano, UFW to prostszy interfejs do IPTables. Najpierw trzeba zainstalować UFW, bo nie jest domyślnie dostępny we wszystkich dystrybucjach. Polecenia wykonuj jako root lub z sudo.

Zaloguj się na serwer Linux. Jeśli potrzebujesz pomocy, skorzystaj z poradnika Początkowy dostęp (SSH). Instrukcje testowaliśmy na Debianie i Ubuntu, ale powinny działać na innych dystrybucjach.

Najpierw zaktualizuj repozytoria i pakiety.

sudo apt update && sudo apt upgrade -y

Następnie zainstaluj UFW.

sudo apt install ufw -y

Sprawdź, czy instalacja się powiodła.

sudo ufw status
> Firewall not loaded

Aby nie zablokować sobie dostępu do serwera, najpierw włącz usługę ssh, zanim aktywujesz zaporę.

uwaga

Jeśli zmieniłeś port SSH, wpisz tutaj nowy port zamiast 22.

Włącz usługę ssh:

sudo ufw allow 22/tcp
sudo ufw enable
sudo ufw status

Poprawny wynik powinien wyglądać mniej więcej tak:

Status: active

To Action From
-- ------ ----
22/tcp ALLOW Anywhere
22/tcp (v6) ALLOW Anywhere (v6)

Teraz ogranicz liczbę połączeń do 6 na minutę:

ufw limit 22/tcp
notatka

UFW pozwala ograniczyć liczbę połączeń tylko do 6 na minutę. Limiter UFW jest prosty i może nie sprawdzić się w każdej sytuacji. Do bardziej szczegółowej i elastycznej konfiguracji polecamy IPTables.

tip

Zapora (IPTables lub UFW) tylko "bezmyślnie" liczy próby połączeń i blokuje je. Dzięki Fail2Ban można analizować logi pod kątem anomalii. W następnej sekcji dowiesz się, jak zainstalować i aktywować Fail2Ban.

Dodatkowe zabezpieczenia z Fail2Ban

Fail2Ban to usługa, która blokuje adresy IP, które próbują łączyć się z serwerem z prawdopodobnie złośliwymi intencjami. Monitoruje logi pod kątem anomalii i skutecznie zabezpiecza system w prosty sposób.

Po instalacji Fail2Ban ma gotowe konfiguracje dla popularnych usług, m.in.:

  • apache
  • lighttpd
  • sshd
  • qmail
  • postfix
  • Courier Mail Server Dodatkowe usługi można dodać, definiując wyrażenia regularne (RegEx) i wskazując odpowiednie pliki logów.

Przykład: wpis w /var/log/auth.log. Ten plik zawiera wszystkie próby logowania SSH, zarówno udane, jak i nieudane. /var/log/auth.log

Widzisz wpis:

Dec 2 12:59:19 vps-zap515723-2 sshd[364126]: Failed password for root from 92.117.xxx.xxx port 52504 ssh2

Fail2Ban monitoruje ten plik i wykrywa nieudane próby logowania. Ponieważ plik zawiera adres IP atakującego, Fail2Ban może zablokować ten adres po kilku nieudanych próbach.

Instalacja Fail2Ban

Zaloguj się na serwer Linux. Jeśli potrzebujesz pomocy, skorzystaj z poradnika Początkowy dostęp (SSH). Polecenia wykonuj jako root lub z sudo.

sudo apt update && sudo apt upgrade -y
sudo apt install fail2ban

Po instalacji sprawdź status Fail2Ban:

systemctl status fail2ban.service
* fail2ban.service - Fail2Ban Service
Loaded: loaded (/lib/systemd/system/fail2ban.service; enabled; vendor pres>
Active: active (running) since Sat 2023-12-02 13:10:33 UTC; 24s ago
Docs: man:fail2ban(1)
Process: 23988 ExecStartPre=/bin/mkdir -p /run/fail2ban (code=exited, statu>
Main PID: 23989 (fail2ban-server)
CPU: 409ms
CGroup: /system.slice/fail2ban.service
`-23989 /usr/bin/python3 /usr/bin/fail2ban-server -xf start

Dec 02 13:10:33 vps-zap515723-1 systemd[1]: Starting Fail2Ban Service...
Dec 02 13:10:33 vps-zap515723-1 systemd[1]: Started Fail2Ban Service.
Dec 02 13:10:34 vps-zap515723-1 fail2ban-server[23989]: Server ready

Konfiguracja Fail2Ban

Fail2Ban jest zainstalowany, ale jeszcze nieaktywny i nie skonfigurowany. W katalogu /etc/fail2ban znajdziesz pliki:

action.d fail2ban.d jail.conf paths-arch.conf paths-debian.conf
fail2ban.conf filter.d jail.d paths-common.conf paths-opensuse.conf

Aby aktywować "jail", stwórz plik jail.local. Skopiuj do niego zawartość jail.conf i otwórz:

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local

W pliku jail.local możesz ustawić wszystkie opcje, w tym usługi do monitorowania. Skup się na sekcji [Default], gdzie definiuje się ustawienia domyślne.

Przewiń trochę w dół i zmodyfikuj tak, np.:

AtrybutWyjaśnienieWartość
ignoreipAdresy IP, które nie będą blokowane127.0.0.1/8
ignorecommandNieistotne
bantimeCzas blokady adresu IP1h
findtimeOkres, w którym liczone są nieudane próby logowania10m
maxretryLiczba nieudanych prób, po której następuje blokada5
# można definiować za pomocą spacji (lub przecinka).
#ignoreip = 127.0.0.1/8 ::1

# ignorecommand = /path/to/command <ip>
ignorecommand =

# "bantime" to liczba sekund, na jaką host jest zablokowany.
bantime = 1h

# Host jest zablokowany, jeśli wygenerował "maxretry" błędów w ciągu "findtime"
# sekund.
findtime = 10m

# "maxretry" to liczba błędów przed zablokowaniem hosta.
maxretry = 5

Ustawienia domyślne są gotowe. Aby monitorować usługę SSH, przewiń do sekcji [sshd]. Jeśli zmieniłeś port, wpisz go pod port.

Sekcja [sshd] powinna wyglądać tak:

[sshd]

enabled = true
port = 22
filter = sshd
logpath = /var/log/auth.log
maxretry = 4
tip

Jak widzisz, można ustawić indywidualne opcje dla każdej usługi (tu maxretry jest niższe niż domyślne). Jeśli nie zmienisz, użyte zostaną ustawienia domyślne.

Na koniec zrestartuj Fail2Ban, aby zaczął działać.

sudo systemctl restart fail2ban.service

Sprawdzenie działania Fail2Ban

Jeśli masz dostęp do VPN lub drugiego serwera, możesz spróbować zablokować się samemu, aby sprawdzić, czy Fail2Ban działa. VPN lub hotspot z telefonu dadzą Ci inny adres IP, co pozwoli na test.

ważne

Nie testuj tego na swojej normalnej sieci, bo możesz zablokować własny adres IP i stracisz dostęp.

Spróbuj połączyć się przez SSH (z innego IP!) i wpisuj błędne hasło. Powinno to wyglądać tak:

root@185.223.29.xxx's password:
Permission denied, please try again.
root@185.223.29.xxx's password:
Permission denied, please try again.
root@185.223.29.xxx's password:
root@185.223.29.xxx: Permission denied (publickey,password).
root@vps-zap515723-2:/var/log# ssh root@185.223.29.179
root@185.223.29.xxx's password:
Permission denied, please try again.
root@185.223.29.xxx's password:
Permission denied, please try again.
root@185.223.29.xxx's password:
^C
root@vps-zap515723-2:/var/log# ssh root@185.223.29.xxx
ssh: connect to host 185.223.29.xxx port 22: Connection refused

Jak widzisz, połączenie jest odrzucane (Connection refused zamiast Permission denied).

Sprawdź status Fail2Ban. Zobaczysz, że adres IP został zablokowany.

fail2ban-client status sshd
Status for the jail: sshd
|- Filter
| |- Currently failed: 4
| |- Total failed: 8
| `- File list: /var/log/auth.log
`- Actions
|- Currently banned: 1
|- Total banned: 1
`- Banned IP list: xxx

Aby odblokować IP, użyj: fail2ban-client set sshd unbanip {twój IP}.

informacja

Jeśli masz dużo blokad IP, warto wydłużyć czas blokady po każdej kolejnej próbie, aby ograniczyć liczbę prób logowania.

[sshd]

enabled = true
port = 22
filter = sshd
logpath = /var/log/auth.log
maxretry = 4

bantime = 1h
#Czas blokady rośnie z każdą kolejną blokadą tego IP
bantime.increment = true
#Współczynnik skalowania 24 godziny (1h,24h,48h,3d,4d....)
bantime.factor = 24
#Maksymalny czas blokady = 5 tygodni
bantime.maxtime = 5w

Zabezpieczenie serwerów WWW za pomocą Cloudflare

Wiele osób korzysta z Cloudflare jako menedżera DNS domeny. Cloudflare ma jedną z największych sieci na świecie, co przekłada się na krótszy czas ładowania stron, niższy ping i lepsze doświadczenia użytkownika. Dodatkowo chroni Twoje strony przed atakami DoS/DDoS, w tym zalewaniem i nowymi typami ataków, które pojawiają się codziennie.

W tym poradniku dowiesz się, jak chronić swój serwer WWW przed atakami.

Zakładamy, że Twoja domena jest już zarządzana przez Cloudflare. Jeśli nie, możesz skorzystać z ich poradnika jak przenieść domenę. Przejdź do zakładki DNS Records w panelu Cloudflare i upewnij się, że rekord do Twojego serwera WWW ma pomarańczową chmurkę i status "Proxied".

Wszystkie połączenia przez Twoją domenę będą przechodzić przez Cloudflare, a następnie do Twojego serwera, będąc legalnym ruchem. Twój serwer jest jednak nadal dostępny spoza Cloudflare, dlatego musisz ograniczyć dostęp do portów 80 i 443 protokołu TCP na serwerze Linux i zezwolić tylko na ruch pochodzący z legalnych adresów Cloudflare.

Możesz to zrobić ręcznie, dodając reguły zapory na podstawie publicznej listy IPv4 Cloudflare i publicznej listy IPv6 Cloudflare.

Alternatywnie, możesz zaoszczędzić czas i użyć narzędzi takich jak Cloudflare-ufw, które szybko zaimportują te reguły masowo. Upewnij się, że nie masz innych reguł pozwalających na nieograniczony dostęp do serwera WWW poza tymi, które właśnie dodałeś, bo inaczej nie będą działać.

Podsumowanie – Twój serwer jest teraz dużo bezpieczniejszy!

Ten poradnik pokazał Ci podstawowe i zaawansowane funkcje zabezpieczające serwer Linux. Jeśli wdrożyłeś wszystkie zalecenia, które pasują do Twojego systemu, Twój serwer jest już znacznie bezpieczniejszy – gratulacje!

Oczywiście można podjąć dalsze kroki:

  • 2FA (SSH)
  • Dodanie kolejnych konfiguracji do Fail2Ban
  • Ustawienie powiadomień mailowych w Fail2Ban
  • I wiele innych...