W tym poradniku znajdziesz wskazówki i porady, jak zwiększyć bezpieczeństwo swojego serwera Linux. Ponieważ (wirtualne) serwery muszą być dostępne z zewnątrz, zdecydowanie warto zadbać o podstawową ochronę przed niepożądanym dostępem i nie należy jej lekceważyć.
Pamiętaj, że te instrukcje nie wyczerpują tematu, a bardziej szczegółowe informacje znajdziesz w innych sekcjach dokumentacji ZAP. (np. 2FA (SSH))
Najprostszy sposób na ochronę serwera jest zawsze taki sam, niezależnie od jego rodzaju: używaj bezpiecznych haseł, regularnie aktualizuj swoje usługi i ogólnie zwracaj uwagę na to, jakie usługi instalujesz oraz z jakich instrukcji korzystasz.
| Usługa | Port |
|---|---|
| SSH | 22 |
| FTP | 21 |
| 25 | |
| DNS | 53 |
| HTTP | 80 |
| HTTPS | 443 |
Usługi takie jak SSH lub FTP domyślnie zawsze korzystają z tych samych portów (niektóre z nich wymieniono w powyższej tabeli). Jeśli zewnętrzny atakujący spróbuje przeprowadzić atak brute force na usługę SSH, najpierw musi wiedzieć, który port jest używany przez SSH. Jeśli nie skonfigurujesz tych portów inaczej, porty 22 i 21 będą najczęściej wybierane, aby bezpośrednio wykonywać polecenia na serwerze lub uzyskać dostęp do plików przez FTP.
Aby temu zapobiec, zalecamy samodzielne ustawienie portów dla usług domyślnych. W następnej sekcji 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!
Za pomocą cat /etc/services możesz wyświetlić kilka standardowych portów i uniknąć wybrania portu, który jest już zajęty.
Aby zmienić port SSH, musisz edytować plik konfiguracyjny. Zazwyczaj znajduje się on w lokalizacji /etc/ssh/sshd_config. Jeśli go tam nie ma, możesz go znaleźć za pomocą następującego polecenia:
find / -name "sshd_config" 2>/dev/null
Otwórz teraz plik za pomocą nano (jako root lub z użyciem sudo).
sudo nano /etc/ssh/sshd_config
Wpisz wybrany port po Port. Jeśli Port jest zakomentowane (czyli widnieje jako #Port 22), usuń „#” i zastąp 22 wybranym portem. Zapisz plik (w Nano za pomocą Ctrl + o) i zamknij go (Nano: Ctrl + x).
Teraz należy ponownie uruchomić usługę SSH, aby zmiany zaczęły obowiązywać.
# Na przykład w Ubuntu/Debian/CentOS
sudo systemctl restart sshd
Jeśli masz zainstalowaną usługę FTP, taką jak proFTPd, możesz równie łatwo zmienić jej port, edytując plik konfiguracyjny. Procedura jest podobna jak w przypadku usługi SSH.
Znajdź plik konfiguracyjny proftpd.conf
find / -name "proftpd.conf" 2>/dev/null
Plik zazwyczaj znajduje się w lokalizacji /etc/proftpd.conf (CentOS) lub /etc/proftpd/proftpd.conf (Ubuntu, Debian).
Otwórz plik za pomocą nano, usuń „#” przed port i wpisz po nim wybrany port. Pamiętaj o powyższych wskazówkach, aby nie wpisać nieprawidłowego portu.
Użyj Ctrl + W, aby wyszukać tekst w nano.
nano /etc/proftpd/proftpd.conf
Fail2Ban to usługa, która blokuje adresy IP próbujące logować się na serwer prawdopodobnie w złych zamiarach. Fail2Ban monitoruje pliki dziennika w poszukiwaniu podejrzanej aktywności, zapewniając stosunkowo łatwą i skuteczną ochronę systemu.
Po zainstalowaniu Fail2Ban zawiera wstępnie skonfigurowane ustawienia dla kilku często używanych usług, w tym:
- apache
- lighttpd
- sshd
- qmail
- postfix
- Courier Mail Server Kolejne usługi można łatwo dodać, określając wyrażenie regularne (RegEx) oraz wybrany plik dziennika.
/var/log/auth.log. Plik ten zawiera wszystkie próby logowania przez 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 korzysta z tego pliku dziennika i monitoruje go pod kątem nieudanych uwierzytelnień. Ponieważ plik zawiera adres IP atakującego, Fail2Ban może zablokować ten adres po kilku nieudanych próbach.
Najpierw zaloguj się na serwerze Linux. Jeśli potrzebujesz pomocy, skorzystaj z naszego poradnika Pierwszy dostęp (SSH). Polecenia należy wykonywać jako root lub z użyciem sudo.
sudo apt update && sudo apt upgrade -y
sudo apt install fail2ban
Po instalacji możesz od razu sprawdzić stan usługi za pomocą systemctl: (Naciśnij Ctrl+C, aby wyjść z systemctl)
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 już zainstalowany, ale nie został jeszcze włączony ani skonfigurowany. Sprawdź zawartość katalogu /etc/fail2ban. Powinny znajdować się w nim następujące 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 utworzyć aktywną „jail”, należy utworzyć plik o nazwie jail.local. Wystarczy skopiować zawartość pliku jail.conf do nowego pliku i go otworzyć:
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local
Teraz możesz zmienić wszystkie ustawienia w pliku jail.local, w tym określić usługi, które mają być monitorowane.
Skup się tylko na sekcji znajdującej się po [Default]. Sekcja Default zawiera ogólne ustawienia podstawowe.
Przewiń nieco w dół, aż znajdziesz tę sekcję, i zmień jej ustawienia, na przykład w następujący sposób:
| Atrybut | Objaśnienie | Wartość |
|---|---|---|
| ignoreip | Adresy IP, które nie mają być blokowane | 127.0.0.1/8 |
| ignorecommand | Nieistotne. | |
| bantime | Czas, przez jaki adres IP pozostaje zablokowany | 1h |
| findtime | Okres, w którym zliczane są nieudane logowania | 10m |
| maxretry | Liczba nieudanych prób, po których następuje blokada | 5 |
# można rozdzielić spacjami (i/lub przecinkami).
#ignoreip = 127.0.0.1/8 ::1
# ignorecommand = /path/to/command <ip>
ignorecommand =
# "bantime" to liczba sekund, przez którą host jest zablokowany.
bantime = 1h
# Host zostanie zablokowany, jeśli w ciągu "findtime" sekund
# popełni "maxretry" błędów.
findtime = 10m
# "maxretry" to liczba błędów, po której host zostanie zablokowany.
maxretry = 5
Podstawowa konfiguracja jest już gotowa. Aby monitorować na przykład usługę SSH, przewiń niżej do sekcji [sshd]. Jeśli zmieniono port, wpisz jego nową wartość w polu port.
Sekcja [sshd] powinna wtedy wyglądać tak:
[sshd]
enabled = true
port = 22
filter = sshd
logpath = /var/log/auth.log
maxretry = 4
Jak widać, możliwe jest również konfigurowanie poszczególnych usług indywidualnie (tutaj na przykład maxretry, którego wartość jest niższa niż ustawienie domyślne). Mimo wcześniejszego skonfigurowania ustawień ogólnych większość z nich możesz ponownie ustawić osobno dla każdej usługi. Jeśli tego nie zrobisz, zostaną użyte ustawienia ogólne.
Teraz wystarczy ponownie uruchomić Fail2Ban, aby rozpocząć monitorowanie.
sudo systemctl restart fail2ban.service
Jeśli masz dostęp do VPN lub drugiego serwera, możesz spróbować zablokować swój adres IP przez Fail2Ban, aby sprawdzić, czy usługa działa. Korzystając z VPN lub hotspotu w telefonie, powinieneś uzyskać inny adres IP, którego możesz użyć do przetestowania Fail2Ban.
Nie testuj tego w swojej zwykłej sieci, ponieważ Twój adres IP może zostać zablokowany i możesz stracić dostęp do serwera.
Spróbuj nawiązać połączenie SSH z serwerem (z innego adresu IP!) i za każdym razem wpisz nieprawidłowe hasło. Wynik powinien wyglądać mniej więcej 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 widać, połączenie z serwerem chronionym przez Fail2Ban jest teraz odrzucane (Connection refused zamiast Permission denied).
Wyświetl teraz stan 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
Jeśli chcesz odblokować adres IP, możesz to zrobić za pomocą następującego polecenia: fail2ban-client set sshd unbanip {deine IP}.
Jeśli liczba blokowanych adresów IP jest wyjątkowo duża, warto wydłużać czas blokady po każdej nieudanej 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
# Czas blokady powinien wydłużać się po każdej blokadzie tego adresu IP
bantime.increment = true
# Współczynnik skalowania dla 24 godzin (1h,24h,48h,3d,4d....)
bantime.factor = 24
# Maksymalny czas blokady = 5 tygodni
bantime.maxtime = 5w
