Ochrona serwera Linux. Co zrobić najpierw

Ochrona serwera Linux. Co zrobić najpierw
Habib M’henni / Wikimedia Commons, CC BY-SA

W dzisiejszych czasach uruchomienie serwera na hostingu zajmuje kilka minut i kilka kliknięć myszką. Jednak zaraz po uruchomieniu trafia on w wrogie otoczenie, ponieważ jest otwarty dla całego internetu jak niewinna dziewczyna na rockowej dyskotece. Szybko wyczuwają go skanery i odkryją tysiące automatycznych botów skryptowych, które krążą po sieci w poszukiwaniu luk i nieprawidłowych konfiguracji. Po uruchomieniu istnieje kilka rzeczy, które należy zrobić, aby zapewnić podstawową ochronę.

Spis treści

Użytkownik bez uprawnień root

Po pierwsze, należy założyć sobie użytkownika bez uprawnień root. Chodzi o to, że użytkownik root ma absolutne przywileje w systemie, a jeśli pozwolisz mu na zdalne zarządzanie, to w połowie wykonasz pracę za hakera, zostawiając mu ważną nazwę użytkownika.

Dlatego trzeba założyć innego użytkownika, a dla roota wyłączyć zdalne zarządzanie przez SSH.

Nowego użytkownika zakłada się poleceniem useradd:

useradd [options]

Następnie dla niego dodaje się hasło poleceniem passwd:

passwd

Na koniec tego użytkownika należy dodać do grupy, która ma prawo do wykonywania poleceń z podwyższonymi przywilejami sudo. W zależności od dystrybucji Linuxa, mogą to być różne grupy. Na przykład, w CentOS i Red Hat użytkownika dodaje się do grupy wheel:

usermod -aG wheel

W Ubuntu dodaje się go do grupy sudo:

usermod -aG sudo

Klucze zamiast haseł SSH

Atak przez brute force lub wyciek haseł to standardowy wektor ataku, więc autoryzację na podstawie haseł w SSH (Secure Shell) lepiej wyłączyć, a zamiast tego zastosować autoryzację na podstawie kluczy.

Są różne programy do realizacji protokołu SSH, takie jak lsh i Dropbear, ale najpopularniejszy jest OpenSSH. Instalacja klienta OpenSSH na Ubuntu:

sudo apt install openssh-client

Instalacja na serwerze:

sudo apt install openssh-server

Uruchomienie demona SSH (sshd) na serwerze z Ubuntu:

sudo systemctl start sshd

Automatyczne uruchamianie demona przy każdym załadunku:

sudo systemctl enable sshd

Należy zauważyć, że część serwerowa OpenSSH zawiera część kliencką. To znaczy przez openssh-server można łączyć się z innymi serwerami. Co więcej, z klienta można uruchomić tunel SSH z zdalnego serwera do zewnętrznego hosta, a wtedy ten zewnętrzny host będzie traktował zdalny serwer jako źródło zapytań. To bardzo przydatna funkcja do maskowania swojego systemu. Więcej informacji w artykule „Praktyczne porady, przykłady i tunelowanie SSH”.

Na maszynie klienckiej zazwyczaj nie ma sensu instalować pełnoprawnego serwera, aby uniknąć możliwości zdalnego dostępu do komputera (ze względów bezpieczeństwa).

Aby utworzyć nowego użytkownika, należy najpierw wygenerować klucze SSH na komputerze, z którego będziesz łączyć się z serwerem:

ssh-keygen -t rsa

Publiczny klucz przechowywany jest w pliku .pub i wygląda jak ciąg losowych znaków, który zaczyna się od ssh-rsa.

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ3GIJzTX7J6zsCrywcjAM/7Kq3O9ZIvDw2OFOSXAFVqilSFNkHlefm1iMtPeqsIBp2t9cbGUf55xNDULz/bD/4BCV43yZ5lh0cUYuXALg9NI29ui7PEGReXjSpNwUD6ceN/78YOK41KAcecq+SS0bJ4b4amKZIJG3JWm49NWvoo0hdM71sblF956IXY3cRLcTjPlQ84mChKL1X7+D645c7O4Z1N3KtL7l5nVKSG81ejkeZsGFzJFNqvr5DuHdDL5FAudW23me3BDmrM9ifUmt1a00mWci/1qUlaVFft085yvVq7KZbF2OP2NQACUkwfwh+iSTP username@hostname

Następnie, z poziomu konta root, należy stworzyć w katalogu domowym użytkownika folder SSH i dodać publiczny klucz SSH do pliku authorized_keys, używając edytora tekstu, takiego jak Vim:

mkdir -p /home/user_name/.ssh && touch /home/user_name/.ssh/authorized_keys

vim /home/user_name/.ssh/authorized_keys

Na koniec, należy ustawić poprawne uprawnienia dla pliku:

chmod 700 /home/user_name/.ssh && chmod 600 /home/user_name/.ssh/authorized_keys

i zmienić właściciela na tego użytkownika:

chown -R username:username /home/username/.ssh

Po stronie klienta należy wskazać lokalizację prywatnego klucza do autoryzacji:

ssh-add DIR_PATH/keylocation

Teraz można zalogować się na serwer jako użytkownik za pomocą tego klucza:

ssh [username]@hostname

Po autoryzacji można używać polecenia scp do kopiowania plików lub narzędzia sshfs do zdalnego montowania systemu plików lub katalogów.

Warto wykonać kilka kopii zapasowych prywatnego klucza, ponieważ jeśli wyłączysz autoryzację hasłem i go stracisz, nie będziesz miał absolutnie żadnej możliwości dostępu do swojego serwera.

Jak wspomniano wcześniej, w SSH należy wyłączyć autoryzację dla roota (z tego powodu tworzyliśmy nowego użytkownika).

Na CentOS/Red Hat znajduje się linia PermitRootLogin yes w pliku konfiguracyjnym /etc/ssh/sshd_config i zmieniamy ją:

PermitRootLogin no

Na Ubuntu dodajemy linię PermitRootLogin no do pliku konfiguracyjnego 10-my-sshd-settings.conf:

sudo echo "PermitRootLogin no" >> /etc/ssh/sshd_config.d/10-my-sshd-settings.conf

Po zweryfikowaniu, że nowy użytkownik przechodzi uwierzytelnienie za pomocą swojego klucza, można wyłączyć uwierzytelnienie za pomocą hasła, aby wykluczyć ryzyko jego wycieku lub ataku metodą brute-force. Teraz aby uzyskać dostęp do serwera, osoba nieuprawniona będzie musiała zdobyć prywatny klucz.

Na CentOS/Red Hat znajduje się linia PasswordAuthentication yes w pliku konfiguracyjnym /etc/ssh/sshd_config i zmieniamy go w następujący sposób:

PasswordAuthentication no

Na Ubuntu dodajemy linię PasswordAuthentication no do pliku 10-my-sshd-settings.conf:

sudo echo "PasswordAuthentication no" >> /etc/ssh/sshd_config.d/10-my-sshd-settings.conf

Instrukcję podłączenia dwuskładnikowego uwierzytelnienia przez SSH znajdziesz w tutaj.

Firewall

Zapora ogniowa zapewnia, że na serwerze będzie przechodził tylko ten ruch w wyznaczonych portach, które bezpośrednio zezwoliłeś. To chroni przed wykorzystaniem portów, które przypadkowo włączyły się z innymi usługami, co znacząco zmniejsza powierzchnię ataku.

Przed zainstalowaniem zapory ogniowej należy upewnić się, że SSH znajduje się na liście wyjątków i nie będzie blokowane. W przeciwnym razie po uruchomieniu zapory nie będziemy mogli połączyć się z serwerem.

Z dystrybucją Ubuntu dostarczany jest Uncomplicated Firewall (ufw), a z CentOS/Red Hat — firewalld.

Zezwolenie na SSH w zaporze ogniowej na Ubuntu:

sudo ufw allow ssh

Na CentOS/Red Hat używamy polecenia firewall-cmd:

sudo firewall-cmd --zone=public --add-service=ssh --permanent

Po tej procedurze można uruchomić zaporę ogniową.

Na CentOS/Red Hat uruchamiamy usługę systemd dla firewalld:

sudo systemctl start firewalld
sudo systemctl enable firewalld

Na Ubuntu używamy takiego polecenia:

sudo ufw enable

Fail2Ban

Serwis Fail2Ban analizuje logi na serwerze i zlicza liczbę prób dostępu z każdego adresu IP. W ustawieniach określono zasady, ile prób dostępu jest dozwolone w określonym czasie — po czym dany adres IP jest blokowany na ustalony czas. Na przykład pozwalamy na 5 nieudanych prób uwierzytelnienia przez SSH w ciągu 2 godzin, po czym blokujemy dany adres IP na 12 godzin.

Instalacja Fail2Ban na CentOS i Red Hat:

sudo yum install fail2ban

Instalacja na Ubuntu i Debianie:

sudo apt install fail2ban

Uruchomienie:

systemctl start fail2ban
systemctl enable fail2ban

Program ma dwa pliki konfiguracyjne: /etc/fail2ban/fail2ban.conf i /etc/fail2ban/jail.conf. Ograniczenia dla banów podane są w drugim pliku.

Jail dla SSH jest włączony domyślnie z ustawieniami fabrycznymi (5 prób, interwał 10 minut, ban na 10 minut).

[DEFAULT]
ignorecommand =
bantime = 10m
findtime = 10m
maxretry = 5

Oprócz SSH, Fail2Ban może chronić także inne usługi na serwerze WWW nginx lub Apache.

Automatyczne aktualizacje zabezpieczeń

Jak wiadomo, w każdym oprogramowaniu ciągle odkrywane są nowe luki. Po publikacji informacji, exploity są dodawane do popularnych pakietów exploitów, które są powszechnie wykorzystywane przez hakerów i nastolatków do skanowania wszystkich serwerów po kolei. Dlatego bardzo ważne jest, aby aktualizacje bezpieczeństwa były instalowane natychmiast po ich wydaniu.

Na serwerze Ubuntu w domyślnej konfiguracji włączone są automatyczne aktualizacje bezpieczeństwa, więc nie są wymagane dodatkowe działania.

Na CentOS/Red Hat należy zainstalować aplikację dnf-automatic i włączyć zegar:

sudo dnf upgrade
sudo dnf install dnf-automatic -y
sudo systemctl enable --now dnf-automatic.timer

Sprawdzenie zegara:

sudo systemctl status dnf-automatic.timer

Zmiana domyślnych portów

SSH został stworzony w 1995 roku jako zamiennik telnet (port 23) i ftp (port 21), dlatego autor programu Tatu Ylönen wybrał port 22 jako domyślny, i został on zatwierdzony w IANA.

Oczywiście, wszyscy przestępcy są świadomi, na którym porcie działa SSH — i skanują go razem z pozostałymi standardowymi portami, aby sprawdzić wersję oprogramowania, weryfikować standardowe hasła roota itd.

Zmiana standardowych portów — obfuskacja — kilkakrotnie zmniejsza objętość zbędnego ruchu, rozmiar logów i obciążenie serwera, a także zmniejsza powierzchnię ataku. Chociaż niektórzy krytykują tę metodę "ochrony przez niejasność" (security through obscurity). Powód jest taki, że technika ta stoi w sprzeczności z fundamentalną ochroną architektoniczną. Dlatego na przykład Narodowy Instytut Standardów i Technologii USA w "Podręczniku bezpieczeństwa serwera" podkreśla potrzebę otwartej architektury serwera: "Bezpieczeństwo systemu nie powinno polegać na ukryciu implementacji jego komponentów", mówi dokument.

Teoretycznie, zmiana domyślnych portów jest sprzeczna z praktyką otwartej architektury. Jednak w praktyce wystąpienie złośliwego ruchu rzeczywiście maleje, więc to prosta i skuteczna miara.

Numer portu można skonfigurować, zmieniając dyrektywę Port 22 w pliku konfiguracyjnym. /etc/ssh/sshd_configJest on również określany poprzez parametr -p do sshd. Klient SSH i programy sftp również wspierają parametr -p.

Parametr -p można użyć do określenia numeru portu podczas łączenia za pomocą polecenia ssh w systemie Linux. W sftp i scp używa się parametru -P (nagłówek P). Polecenie z wiersza poleceń nadpisuje każdą wartość w plikach konfiguracyjnych.

Jeśli serwerów jest wiele, prawie wszystkie te czynności związane z zabezpieczeniem serwera Linux można zautomatyzować w skrypcie. Jednak w przypadku pojedynczego serwera lepiej ręcznie kontrolować proces.

Reklama

Zamów i od razu pracuj! Tworzenie VDS dowolnej konfiguracji i z dowolnym systemem operacyjnym w ciągu minuty. Maksymalna konfiguracja pozwoli na pełne wykorzystanie możliwości — 128 rdzeni CPU, 512 GB RAM, 4000 GB NVMe. Epicko 🙂

Ochrona serwera Linux. Co zrobić najpierw

Źródło: habr.com

Kup niezawodny hosting stron z ochroną DDoS, serwery VPS VDS 🔥 Kup niezawodny hosting stron z ochroną DDoS, serwery VPS VDS - ProHoster