První spuštění Lynisu na čerstvém VPS obvykle dá kolem 60 a dlouhý seznam doporučení, u nějž není jasné, čeho se chytit. Dobrá zpráva: na 80–85 se dostanete za jeden večer a většina cesty není kosmetika, ale věci, které jsou skutečně potřeba. Špatná: posledních patnáct bodů na pronajatém virtuálním stroji vůbec nezískáte a nemá smysl je honit.
Co index ukazuje a co ne
Hardening index je poměr splněných testů k jejich celkovému počtu s váhami — ne procento zabezpečení. Lynis provádí kolem tří set testů a vydává dva různé seznamy: warnings, což vypadá jako skutečný problém, a suggestions, což jsou možná zlepšení. Vždy začínejte varováními; bývají jen jednotky.
Sto bodů neexistuje: část doporučení vyžaduje rozhodnutí přijímaná při instalaci systému (samostatné oddíly pro /home, /tmp a /var), část přístup k zavaděči, který VPS nemá, a část si navzájem odporuje. Porovnávat svůj index s cizím je rovněž zbytečné: Lynis strhává body za to, co na stroji běží. Každá spuštěná služba je další otevřený port, vlastní konfigurace a desítka nových doporučení, takže vysoké hodnoty se častěji vyskytují tam, kde kromě SSH neběží nic. Pro provozní server s webem, databází a poštou je 85 dobrý výsledek.
Spouštějte jako root
sudo lynis audit system
Bez sudo Lynis přeskočí všechny testy, které potřebují systémové soubory, a ukáže podhodnocený index — ne proto, že by byl server špatný, ale proto, že kontroly nebylo možné provést. Zpráva se ukládá do /var/log/lynis-report.dat, čitelný log do /var/log/lynis.log.
Každý řádek výstupu začíná identifikátorem testu typu SSH-7408 nebo KRNL-6000. Podle tohoto identifikátoru se hledá jak vysvětlení, tak způsob vypnutí — zapamatujte si jeho tvar, všechno ostatní se točí kolem něj.
Co přináší nárůst
SSH (SSH-7408). Nejvýznamnější blok: jediný test kontroluje hned desítku parametrů. Neupravujte celý sshd_config, položte samostatný soubor — aktualizace balíčku pak nic nepřepíše:
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 před znovunačtením služby je povinný: chyba v konfiguraci při živém sezení vás nechá venku. A než nastavíte PasswordAuthentication no, ověřte z druhého otevřeného terminálu, že klíč skutečně funguje.
Parametry jádra (KRNL-6000). Test kontroluje dvě desítky hodnot sysctl. Soubor pro ně:
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
Chybějící nástroje. Nemalá část doporučení je prostě „nainstalujte to, co chybí“: auditd (log systémových událostí), aide (kontrola integrity souborů), debsums (integrita balíčků), unattended-upgrades (automatické bezpečnostní aktualizace), sysstat a acct (evidence procesů), antivirový skener. Každý uzavře jedno až dvě doporučení, ale instalovat je stojí za to ne kvůli bodům, nýbrž proto, že bez nich po incidentu nic nezrekonstruujete.
Drobnosti s dobrým poměrem úsilí. umask 027 v /etc/login.defs; doby platnosti hesel tamtéž; bannery /etc/issue a /etc/issue.net; překladače dostupné jen rootovi (chmod 700 /usr/bin/gcc). O bannerech řekněme upřímně: na zabezpečení nemají vliv vůbec, jde o právní formalitu — ale bod dávají.
Jedna past u login.defs
Úprava umask přes sed s nahrazením řádku nezřídka ponechá v souboru několik řádků UMASK najednou. Lynis pak hodnotu nezapočítá a test AUTH-9328 zůstane červený, ačkoli nastavení vypadá hotově. Po úpravě ověřte:
grep -c '^UMASK' /etc/login.defs
Má být přesně jedna. Totéž platí pro všechny další parametry tohoto souboru.
Falešné poplachy a jak je správně umlčet
Některá varování se vašeho serveru vůbec netýkají. Živý příklad: na VPS jednoho velkého poskytovatele test PKGS-7388 hlásí, že bezpečnostní repozitář nebyl nalezen — prostě proto, že repozitáře jsou popsány ve formátu deb822 s odkazem na soubor zrcadel, zatímco Lynis hledá starý řádek. Bezpečnostní aktualizace přitom chodí bez problémů.
Takové věci se neumlčují mazáním řádků ze zprávy, ale profilem. Soubory profilů mají příponu .prf (ne .prof, na tom se dá snadno ztratit půl hodiny) a vlastní pravidla se píší do /etc/lynis/custom.prf:
skip-test=PKGS-7388
skip-test=KRNL-5788
Platí jedno pravidlo: vedle každého řádku má být komentář, proč se test přeskakuje. Za půl roku si nevzpomenete, jestli je vypnutý proto, že se neuplatní, nebo proto, že se vám nechtělo to opravovat — a rozdíl mezi těmito případy je celý smysl.
Co nedělat
Nehoňte číslo. Index lze snadno nafouknout vypnutím nepohodlných testů a je to jediný způsob, jak se dostat nad určitou úroveň — jenže bezpečnější se tím server nestane. Užitečné je něco jiného: zaznamenat si svou hodnotu a sledovat změny. Index, který klesl po aktualizaci nebo po cizí úpravě konfigurace, je mnohem cennější signál než jeho absolutní velikost.
Právě proto má smysl spouštět Lynis ne jednorázově, ale podle rozvrhu a zprávy ukládat, aby bylo s čím porovnávat. Jak to vypadá shromážděné na jedné stránce, ukazuje ukázka níže: index, seznam varování s identifikátory testů a to, co se změnilo od minulého běhu.