Prima rulare a Lynis pe un VPS proaspăt dă de obicei în jur de 60 și o listă lungă de recomandări în care nu e clar de unde să începi. Vestea bună: până la 80–85 se ajunge într-o singură seară, iar cea mai mare parte a drumului nu este cosmetică, ci lucruri chiar necesare. Cea rea: ultimele cincisprezece puncte nu se pot obține deloc pe o mașină virtuală închiriată și nu are rost să fie urmărite.

Ce arată indicele și ce nu arată

Hardening index este raportul dintre testele trecute și numărul lor total, cu ponderi — nu un procent de securitate. Lynis rulează în jur de trei sute de teste și produce două liste diferite: warnings, adică ceea ce seamănă cu o problemă reală, și suggestions, adică îmbunătățiri posibile. Începe întotdeauna cu avertismentele; de obicei sunt doar câteva.

O sută de puncte nu există: o parte dintre recomandări cer decizii luate la instalarea sistemului (partiții separate pentru /home, /tmp și /var), o parte cer acces la încărcătorul de sistem, pe care un VPS nu îl are, iar o parte se contrazic între ele. Compararea indicelui tău cu al altcuiva este la fel de inutilă: Lynis scade puncte pentru ceea ce rulează pe mașină. Fiecare serviciu pornit înseamnă încă un port deschis, o configurație proprie și încă zece recomandări, așa că valorile mari se întâlnesc mai des acolo unde, în afară de SSH, nu rulează nimic. Pentru un server de producție cu site, bază de date și e-mail, 85 este un rezultat bun.

Rulează ca root

sudo lynis audit system

Fără sudo, Lynis sare peste toate testele care au nevoie de fișiere de sistem și arată un indice subestimat — nu pentru că serverul ar fi prost, ci pentru că verificările nu au putut fi făcute. Raportul ajunge în /var/log/lynis-report.dat, jurnalul lizibil în /var/log/lynis.log.

Fiecare linie din ieșire începe cu un identificator de test de forma SSH-7408 sau KRNL-6000. După acest identificator se găsesc și explicația, și modul de dezactivare — ține minte forma lui, tot restul se învârte în jurul ei.

Ce aduce creștere

SSH (SSH-7408). Blocul cel mai greu: un singur test verifică deodată vreo zece parametri. Nu edita tot fișierul sshd_config, pune un fișier separat — astfel actualizarea pachetului nu suprascrie nimic:

sudo tee /etc/ssh/sshd_config.d/10-hardening.conf <<'EOF'
PermitRootLogin no
PasswordAuthentication no
MaxAuthTries 3
MaxSessions 2
X11Forwarding no
AllowTcpForwarding no
ClientAliveInterval 300
ClientAliveCountMax 2
LogLevel VERBOSE
TCPKeepAlive no
EOF
sudo sshd -t && sudo systemctl reload ssh

sshd -t înainte de reîncărcarea serviciului este obligatoriu: o eroare în configurație, cu sesiunea activă, te lasă pe dinafară. Iar înainte de a pune PasswordAuthentication no, verifică dintr-un al doilea terminal deschis că cheia funcționează cu adevărat.

Parametrii nucleului (KRNL-6000). Testul verifică vreo douăzeci de valori sysctl. Un fișier pentru ele:

sudo tee /etc/sysctl.d/99-hardening.conf <<'EOF'
kernel.dmesg_restrict = 1
kernel.kptr_restrict = 2
kernel.sysrq = 0
fs.protected_hardlinks = 1
fs.protected_symlinks = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.all.log_martians = 1
EOF
sudo sysctl --system

Instrumente care lipsesc. O bună parte dintre sugestii înseamnă pur și simplu „instalează ce nu există”: auditd (jurnal de evenimente de sistem), aide (control al integrității fișierelor), debsums (integritatea pachetelor), unattended-upgrades (actualizări automate de securitate), sysstat și acct (evidența proceselor), un scaner antivirus. Fiecare închide una sau două recomandări, dar merită instalate nu pentru puncte, ci pentru că fără ele, după un incident, nu vei putea reconstitui nimic.

Mărunțișuri cu raport bun efort/rezultat. umask 027 în /etc/login.defs; duratele de viață ale parolelor tot acolo; bannerele /etc/issue și /etc/issue.net; compilatoare accesibile doar pentru root (chmod 700 /usr/bin/gcc). Despre bannere să spunem cinstit: nu influențează deloc securitatea, sunt o formalitate juridică — dar dau punct.

O capcană cu login.defs

Modificarea umask prin sed cu înlocuirea liniei lasă adesea în fișier mai multe linii UMASK deodată. Lynis nu ia atunci valoarea în calcul, iar testul AUTH-9328 rămâne roșu, deși setarea pare făcută. Verifică după modificare:

grep -c '^UMASK' /etc/login.defs

Trebuie să fie exact una. Același lucru este valabil pentru orice alt parametru din acest fișier.

Alarme false și cum se reduc corect la tăcere

Unele avertismente nu se referă deloc la serverul tău. Un exemplu real: pe un VPS al unui furnizor mare, testul PKGS-7388 raportează că depozitul de securitate nu a fost găsit — pur și simplu pentru că depozitele sunt descrise în format deb822, cu trimitere la un fișier de oglinzi, în timp ce Lynis caută linia veche. Actualizările de securitate sosesc între timp fără probleme.

Asemenea lucruri se reduc la tăcere printr-un profil, nu prin ștergerea liniilor din raport. Fișierele de profil au extensia .prf (nu .prof, aici se pierde ușor o jumătate de oră), iar regulile proprii se scriu în /etc/lynis/custom.prf:

skip-test=PKGS-7388
skip-test=KRNL-5788

O singură regulă: lângă fiecare linie trebuie să existe un comentariu despre motivul pentru care testul este sărit. Peste o jumătate de an nu îți vei aminti dacă e dezactivat pentru că nu se aplică sau pentru că nu ai avut chef să repari — iar diferența dintre aceste două cazuri este toată miza.

Ce să nu faci

Nu urmări cifra. Indicele se umflă ușor dezactivând testele incomode, și este singurul mod de a urca peste un anumit nivel — numai că serverul nu devine mai sigur din asta. Util este altceva: notează-ți valoarea și urmărește schimbările. Un indice care a scăzut după o actualizare sau după modificarea configurației de către altcineva este un semnal mult mai valoros decât mărimea lui absolută.

Tocmai de aceea are sens să rulezi Lynis nu o singură dată, ci după un program, și să păstrezi rapoartele, ca să ai cu ce compara. Cum arată totul adunat pe o pagină arată demonstrația de mai jos: indicele, lista avertismentelor cu identificatorii testelor și ce s-a schimbat față de rularea anterioară.