Сървърът се настройва веднъж, а след това живее сам. След месец част от пакетите чакат обновяване, сертификатът е наближил на три седмици от края си, след инсталирането на нещо странично в конфигурацията на SSH се е появил излишен ред, а jail-ът, който трябва да следи влизанията, е спрял и никой не е разбрал. Нищо от това не крещи. Всичко просто тихо престава да бъде вярно.

По-долу са дванайсет неща, които си струва да се проверяват редовно, заедно с командите. Обиколката отнема петнайсет минути. Редът върви от това, през което се влиза, към това, което се разваля само.

SSH: пет реда

Гледа се не файлът, а действащата конфигурация: тя се сглобява от /etc/ssh/sshd_config, цялата директория sshd_config.d и подразбиращите се стойности на компилацията.

sudo sshd -T | grep -iE 'permitrootlogin|passwordauthentication|permitemptypasswords|maxauthtries|x11forwarding'

Това, което искаме да видим: permitrootlogin no, passwordauthentication no, permitemptypasswords no, maxauthtries в границите на 3–4 и x11forwarding no. Първите три са вратата, последните две са нейните панти — таван за опитите на връзка и препращане на графика, от което сървърът няма никаква полза.

Две уговорки, и двете лесен начин да се заключиш отвън. Първата: не изключвайте влизането с парола и влизането като root, преди да сте проверили, че ключът работи — в отделна сесия, без да затваряте текущата. Ако четете това, влезли като root с парола, точно тези два реда ще заключат отвън именно вас.

Втората: редът на файловете. OpenSSH взема стойността на параметъра, която срещне първа, а файловете от sshd_config.d се четат по азбучен ред. Облачните образи обикновено оставят там 50-cloud-init.conf и той ще надделее над вашия файл, ако сте го нарекли например 90-hardening.conf. Собствените настройки отиват под по-малък номер — 00- или 10-. А резултатът се проверява с sshd -T, не с четене на файла.

Защитна стена: една проверка

sudo ufw status verbose

Тук си струва да се помни, че изходът показва намерения, а не резултат. Правилото може да стои в списъка и да не затваря нищо: самият UFW е изключен, портът се обслужва от нещо, публикувано от Docker (той пише свои правила в iptables под UFW), или трафикът стига до сървъра по друг път. Затова си струва списъкът с правила да се сверява с това, което наистина слуша навън:

sudo ss -tulpn | grep -v '127.0.0.1\|::1'

fail2ban: две проверки

Не е достатъчно услугата да работи — нужен е и действащ jail за SSH.

sudo fail2ban-client status
sudo fail2ban-client status sshd

Най-честата беда тук е мълчащ jail. На Debian 12 и новите Ubuntu файлът /var/log/auth.log може изобщо да липсва: rsyslog не е инсталиран, а записите живеят само в journald. Jail със стандартния logpath тогава тръгва, обявява се за активен и не блокира никого никога. Лекува се с насочване към журнала на systemd:

printf '[sshd]\nenabled = true\nbackend = systemd\n' | sudo tee /etc/fail2ban/jail.d/sshd-systemd.local
sudo systemctl restart fail2ban

Признакът, по който това се хваща без ровене в конфигурации: в fail2ban-client status sshd редовете „Currently failed“ и „Total failed“ стоят на нула, докато в журнала неуспешните влизания са повече от очевидни.

Обновявания: три проверки

Поотделно: колко пакета чакат изобщо, колко от тях са свързани със сигурността и дали системата иска рестарт след обновяване на ядрото.

sudo apt update
apt list --upgradable 2>/dev/null | grep -c -- '-security'
ls /var/run/reboot-required 2>/dev/null && echo 'нужен е рестарт'

Третата проверка е дали са включени автоматичните обновявания за сигурност, за да не се превърнат първите две в месечен ритуал:

systemctl status unattended-upgrades --no-pager
cat /etc/apt/apt.conf.d/20auto-upgrades

В този файл и на двата реда трябва да стои единица. Ако пакетът липсва: sudo apt install unattended-upgrades && sudo dpkg-reconfigure -plow unattended-upgrades.

Сертификати: една проверка

Сертификатът на Let's Encrypt живее деветдесет дни, а подновяването работи само точно до деня, в който спре. Гледа се не панелът на регистратора, а това, което сървърът наистина отдава:

echo | openssl s_client -connect localhost:443 -servername example.com 2>/dev/null | openssl x509 -noout -enddate
sudo certbot renew --dry-run

Първата команда дава датата на изтичане на сертификата, отдаван за това име; втората проверява, че подновяването ще мине, без да се чака истинският срок. Струва си да се обходят всички имена, които сървърът обслужва, а не само главният домейн: забравя се по правило поддомейнът, добавен по-късно.

Диск: една проверка

df -h
df -i

Две команди, защото мястото и записите за файлове свършват независимо едно от друго. На повечето сървъри второто опира в тавана по-рано — милиони дребни файлове в сесиите на PHP или в кеша на приложението дават IUse% равно на 100 при свободни гигабайти. За двата случая имаме отделен текст.

Какво не е наред с този списък

Списъкът е правилен, но има едно свойство: изисква някой да си спомня за него. Петнайсет минути седмично не са много, докато сървърът е един и докато има повод. След два спокойни месеца обиколката отпада, а че jail-ът е спрял, се разбира от чужди дневници.

Затова събрахме точно тези дванайсет проверки в отделен безплатен панел — Arcivéo FREE. Инсталира се с една команда, работи на вашия сървър, не ни изпраща нищо и не изисква регистрация. Събирач се пуска от cron на всеки пет минути и записва същото в локална база: влизания по SSH и отказани връзки, състоянието на UFW и fail2ban, чакащи обновявания за сигурност, сроковете на сертификатите, мястото на диска. Историята обхваща седем дни, интерфейсът е на 34 езика. Цената е нула, включително на работен сървър: лицензът позволява панелът да се инсталира на собствени машини, включително на фирмени, и не позволява да се препродава или да се предлага като услуга за чужди сървъри.

Стекът на безплатното издание е скромен: инсталира и включва UFW и fail2ban, а оттам нататък показва състоянието. ModSecurity, Suricata, AIDE и останалите модули ги няма в него — те принадлежат на платеното. Но за да спрете да носите седмичната обиколка в главата си, стига. Как изглеждат същите данни на пълния панел, показват демо страниците по-долу.