Serwer konfiguruje się raz, a potem żyje dalej sam. Miesiąc później część pakietów czeka na aktualizację, certyfikat zbliżył się na trzy tygodnie do końca ważności, po instalacji czegoś obcego w konfiguracji SSH pojawiła się zbędna linia, a więzienie, które miało pilnować logowań, zatrzymało się i nikt się o tym nie dowiedział. Nic z tego nie krzyczy. Wszystko po prostu cicho przestaje być prawdą.
Poniżej dwanaście rzeczy, które warto sprawdzać regularnie, wraz z poleceniami. Obchód zajmuje kwadrans. Kolejność prowadzi od tego, czym się wchodzi, do tego, co psuje się samo.
SSH: pięć linii
Patrzeć trzeba nie na plik, lecz na konfigurację wynikową: składa się ona z /etc/ssh/sshd_config, całego katalogu sshd_config.d i wartości domyślnych kompilacji.
sudo sshd -T | grep -iE 'permitrootlogin|passwordauthentication|permitemptypasswords|maxauthtries|x11forwarding'
Chcemy zobaczyć: permitrootlogin no, passwordauthentication no, permitemptypasswords no, maxauthtries na poziomie 3–4 oraz x11forwarding no. Trzy pierwsze to drzwi, dwie ostatnie to ich zawiasy — limit prób na połączenie i przekazywanie grafiki, z którego serwer nie ma żadnego pożytku.
Dwa zastrzeżenia, dwa łatwe sposoby na zamknięcie się na zewnątrz. Po pierwsze: nie wyłączaj logowania hasłem ani logowania na root, zanim nie sprawdzisz, że klucz działa — w osobnej sesji, nie zamykając bieżącej. Jeśli czytasz to zalogowany jako root przy użyciu hasła, to właśnie te dwie linie zamkną na zewnątrz ciebie.
Po drugie: kolejność plików. OpenSSH bierze pierwszą napotkaną wartość parametru, a pliki z sshd_config.d czytane są alfabetycznie. Obrazy chmurowe zwykle zostawiają tam 50-cloud-init.conf, który przebije twój własny plik, jeśli nazwałeś go na przykład 90-hardening.conf. Własne ustawienia wędrują pod mniejszy numer — 00- albo 10-. A wynik sprawdza się poleceniem sshd -T, nie czytaniem pliku.
Zapora: jedna kontrola
sudo ufw status verbose
Trzeba pamiętać, że ten wydruk pokazuje zamiary, a nie wynik. Reguła może stać na liście i niczego nie zamykać: sam UFW jest wyłączony, port obsługuje coś opublikowanego przez Dockera (który pisze własne reguły w iptables poniżej UFW), albo ruch dociera do serwera inną drogą. Warto więc zestawić listę reguł z tym, co naprawdę nasłuchuje na zewnątrz:
sudo ss -tulpn | grep -v '127.0.0.1\|::1'
fail2ban: dwie kontrole
Nie wystarczy, że usługa działa — potrzebne jest też sprawne więzienie dla SSH.
sudo fail2ban-client status
sudo fail2ban-client status sshd
Najczęstszy kłopot to tutaj milczące więzienie. Na Debianie 12 i nowych Ubuntu pliku /var/log/auth.log może w ogóle nie być: rsyslog nie jest zainstalowany, a wpisy żyją wyłącznie w journald. Więzienie z fabrycznym logpath uruchamia się wtedy, melduje się jako aktywne i nigdy nikogo nie banuje. Leczy się przestawieniem go na dziennik systemd:
printf '[sshd]\nenabled = true\nbackend = systemd\n' | sudo tee /etc/fail2ban/jail.d/sshd-systemd.local
sudo systemctl restart fail2ban
Znak, po którym rozpozna się to bez grzebania w konfiguracjach: w fail2ban-client status sshd pozycje „Currently failed” i „Total failed” stoją na zerze, choć w dzienniku nieudane logowania są aż nadto widoczne.
Aktualizacje: trzy kontrole
Osobno: ile pakietów czeka w ogóle, ile z nich dotyczy bezpieczeństwa i czy system prosi o restart po aktualizacji jądra.
sudo apt update
apt list --upgradable 2>/dev/null | grep -c -- '-security'
ls /var/run/reboot-required 2>/dev/null && echo 'potrzebny restart'
Trzecia kontrola to sprawdzenie, czy włączone są automatyczne aktualizacje bezpieczeństwa, żeby dwie pierwsze nie zmieniły się w comiesięczny rytuał:
systemctl status unattended-upgrades --no-pager
cat /etc/apt/apt.conf.d/20auto-upgrades
W tym pliku w obu linijkach powinna stać jedynka. Jeśli pakietu nie ma: sudo apt install unattended-upgrades && sudo dpkg-reconfigure -plow unattended-upgrades.
Certyfikaty: jedna kontrola
Certyfikat Let's Encrypt żyje dziewięćdziesiąt dni, a odnowienie działa samo dokładnie do dnia, w którym przestaje. Patrzeć trzeba nie na panel rejestratora, lecz na to, co serwer naprawdę wydaje:
echo | openssl s_client -connect localhost:443 -servername example.com 2>/dev/null | openssl x509 -noout -enddate
sudo certbot renew --dry-run
Pierwsze polecenie podaje datę końca certyfikatu wydawanego dla tej nazwy, drugie sprawdza, że odnowienie przejdzie, bez czekania na prawdziwy termin. Warto przejść wszystkie nazwy obsługiwane przez serwer, nie tylko domenę główną: zapomina się z reguły o poddomenie dodanej później.
Dysk: jedna kontrola
df -h
df -i
Dwa polecenia, bo miejsce i wpisy o plikach kończą się niezależnie od siebie. Na większości serwerów to drugie uderza w sufit wcześniej — miliony drobnych plików w sesjach PHP albo w pamięci podręcznej aplikacji dają IUse% równe 100 przy wolnych gigabajtach. O obu przypadkach mamy osobny tekst.
Co jest nie tak z tą listą
Lista jest słuszna, ale ma pewną właściwość: wymaga, by ktoś o niej pamiętał. Kwadrans tygodniowo to niewiele, dopóki serwer jest jeden i dopóki jest powód. Po dwóch spokojnych miesiącach obchód wypada, a o tym, że więzienie się zatrzymało, dowiadujemy się z cudzych logów.
Dlatego zebraliśmy dokładnie te dwanaście kontroli w osobny, bezpłatny panel — Arcivéo FREE. Instaluje się jednym poleceniem, działa na twoim serwerze, nic do nas nie wysyła i nie wymaga rejestracji. Zbieracz uruchamia się z crona co pięć minut i zapisuje to samo do lokalnej bazy: logowania SSH i odrzucone połączenia, stan UFW i fail2ban, oczekujące aktualizacje bezpieczeństwa, terminy certyfikatów, miejsce na dysku. Historia obejmuje siedem dni, interfejs jest w 34 językach. Cena wynosi zero, także na serwerze firmowym: licencja pozwala instalować panel na własnych maszynach, w tym maszynach firmy, i nie pozwala go odsprzedawać ani udostępniać jako usługi dla cudzych serwerów.
Stos bezpłatnej edycji jest skromny: instaluje i włącza UFW oraz fail2ban, a dalej pokazuje stan. ModSecurity, Suricaty, AIDE i pozostałych modułów tam nie ma, te należą do wersji płatnej. Ale żeby przestać nosić tygodniowy obchód w głowie, wystarczy. Jak te same dane wyglądają na pełnym panelu, pokazują strony demonstracyjne poniżej.