Ten przewodnik zawiera kilka wskazówek i porad, jak uczynić Twój serwer Linux bardziej bezpiecznym. Ponieważ serwery muszą być dostępne z zewnątrz, podstawowa ochrona przed niechcianym dostępem jest zdecydowanie zalecana i nie powinna być pomijana.
Pamiętaj, że te instrukcje nie są wyczerpujące, a bardziej szczegółowe informacje znajdziesz w innych częściach dokumentacji ZAP. (np. 2FA (SSH))
Najprostszy sposób na zabezpieczenie serwera jest zawsze taki sam, niezależnie od typu serwera: używaj silnych haseł, regularnie aktualizuj swoje usługi i zwracaj uwagę, jakie usługi instalujesz oraz jakich instrukcji przestrzegasz.
| Usługa | Port |
|---|---|
| SSH | 22 |
| FTP | 21 |
| 25 | |
| DNS | 53 |
| HTTP | 80 |
| HTTPS | 443 |
Usługi takie jak SSH czy FTP domyślnie korzystają z tych samych portów (niektóre z nich podane są w tabeli powyżej). Jeśli zewnętrzny atakujący próbuje złamać Twój serwer SSH metodą brute-force, musi najpierw znać port, na którym działa SSH. Jeśli nie zmienisz tych portów, najczęściej będą to porty 22 i 21, które umożliwiają bezpośredni dostęp do serwera lub plików przez FTP.
Aby temu zapobiec, zalecamy dostosowanie portów standardowych usług do własnych potrzeb. W następnym rozdziale dowiesz się, jak to zrobić:
Wybrany port musi mieścić się w zakresie od 1024 do 65535 i nie może być już używany!
Możesz wyświetlić listę standardowych portów poleceniem cat /etc/services, aby nie wybrać zajętego portu.
Aby zmienić port SSH, musisz edytować plik konfiguracyjny. Zwykle znajduje się on pod ścieżką /etc/ssh/sshd_config. Jeśli nie, możesz go znaleźć poleceniem:
find / -name "sshd_config" 2>/dev/null
Otwórz plik za pomocą nano (jako root lub z użyciem sudo).
sudo nano /etc/ssh/sshd_config
Wpisz swój wybrany port po Port. Jeśli Port jest zakomentowany (np. #Port 22), usuń znak "#" i zamień 22 na wybrany port. Zapisz plik (w nano Ctrl + o) i zamknij (Ctrl + x).
Musisz teraz zrestartować usługę SSH, aby zmiany zaczęły działać.
# Na przykład w Ubuntu/Debian/CentOS
sudo systemctl restart sshd
Jeśli masz zainstalowany serwer FTP, np. proFTPd, port również możesz zmienić w pliku konfiguracyjnym. Procedura jest podobna jak w przypadku SSH.
Znajdź plik proftpd.conf
find / -name "proftpd.conf" 2>/dev/null
Zazwyczaj znajduje się on w /etc/proftpd.conf (CentOS) lub /etc/proftpd/proftpd.conf (Ubuntu, Debian).
Otwórz plik w nano, usuń znak "#" przed port i wpisz swój port. Pamiętaj o wcześniejszych wskazówkach, aby nie wybrać nieprawidłowego portu.
W nano możesz użyć Ctrl + W, aby wyszukać.
nano /etc/proftpd/proftpd.conf
Fail2Ban to usługa, która blokuje adresy IP próbujące uzyskać dostęp do serwera z prawdopodobnie złośliwymi zamiarami. Monitoruje logi pod kątem podejrzanych zdarzeń i w ten sposób skutecznie zabezpiecza system.
Po instalacji Fail2Ban ma już prekonfigurowane ustawienia dla popularnych usług, takich jak:
- apache
- lighttpd
- sshd
- qmail
- postfix
- Courier Mail Server Można łatwo dodać kolejne usługi, definiując wyrażenia regularne (RegEx) i wskazując pliki logów.
/var/log/auth.log. Ten plik zawiera wszystkie próby logowania SSH, zarówno udane, jak i nieudane.
Oto przykładowy wpis:
Dec 2 12:59:19 vps-zap515723-2 sshd[364126]: Failed password for root from 92.117.xxx.xxx port 52504 ssh2
Fail2Ban wykorzystuje ten plik i monitoruje nieudane próby uwierzytelnienia. Ponieważ log zawiera adres IP atakującego, Fail2Ban może po kilku nieudanych próbach zablokować ten adres.
Zaloguj się na serwer. Jeśli potrzebujesz pomocy, skorzystaj z przewodnika Pierwsze logowanie (SSH). Polecenia wykonuj jako root lub z sudo.
sudo apt update && sudo apt upgrade -y
sudo apt install fail2ban
Po instalacji sprawdź status usługi:
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
Fail2Ban jest zainstalowany, ale jeszcze nie aktywny ani skonfigurowany. Sprawdź katalog /etc/fail2ban, gdzie powinny znajdować się 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ć „więzienie” (jail), utwó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 teraz ustawić wszystkie opcje, w tym usługi do monitorowania.
Skup się na sekcji [Default], która zawiera ustawienia ogólne.
Znajdź i zmodyfikuj np. tak:
| Atrybut | Opis | Wartość |
|---|---|---|
| ignoreip | Adresy IP, które nie będą blokowane | 127.0.0.1/8 |
| ignorecommand | Nieistotne | |
| bantime | Czas blokady adresu IP | 1h |
| findtime | Okres, w którym liczone są nieudane próby logowania | 10m |
| maxretry | Maksymalna liczba nieudanych prób przed blokadą | 5 |
# można definiować z odstępami i/lub przecinkami
#ignoreip = 127.0.0.1/8 ::1
# ignorecommand = /path/to/command <ip>
ignorecommand =
# "bantime" to czas w sekundach, przez jaki host jest zablokowany.
bantime = 1h
# Host zostaje zablokowany, jeśli "maxretry" błędów wystąpi w ciągu "findtime"
findtime = 10m
# "maxretry" to liczba błędów przed blokadą.
maxretry = 5
To podstawowa konfiguracja. Aby monitorować np. SSH, znajdź sekcję [sshd]. Jeśli zmieniłeś port, wpisz go w port.
Sekcja [sshd] może wyglądać tak:
[sshd]
enabled = true
port = 22
filter = sshd
logpath = /var/log/auth.log
maxretry = 4
Możesz ustawić indywidualne opcje dla każdej usługi (np. maxretry niższe niż domyślne). Jeśli nie, używane są ustawienia ogólne.
Na koniec zrestartuj Fail2Ban, aby zaczął działać.
sudo systemctl restart fail2ban.service
Jeśli masz dostęp do VPN lub innego serwera, możesz przetestować działanie Fail2Ban, blokując się samemu. Połącz się z innym IP (np. przez VPN lub hotspot z telefonu) i spróbuj wielokrotnie zalogować się z błędnym hasłem.
Nie testuj tego w swojej normalnej sieci, bo możesz się zablokować.
Próbuj połączyć się przez SSH i podawać błędne hasło. Powinieneś zobaczyć:
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, aby zobaczyć zablokowane IP.
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 polecenia: fail2ban-client set sshd unbanip {twoje IP}.
Jeśli masz dużo blokad, warto wydłużyć czas blokady po każdej kolejnej próbie, aby ograniczyć liczbę możliwych prób logowania.
[sshd]
enabled = true
port = 22
filter = sshd
logpath = /var/log/auth.log
maxretry = 4
bantime = 1h
# Bantime rośnie z każdą blokadą tego IP
bantime.increment = true
# Skala do 24 godzin (1h,24h,48h,3d,4d...)
bantime.factor = 24
# Maksymalny czas blokady = 5 tygodni
bantime.maxtime = 5w
