De eerste Lynis-run op een verse VPS levert meestal iets rond de 60 op en een lange lijst suggesties waarbij onduidelijk is waar u moet beginnen. Het goede nieuws: 80 tot 85 is het werk van één avond, en de meeste stappen zijn geen cosmetica maar werkelijk zinvol. Het slechte: de laatste vijftien punten zijn op een gehuurde virtuele machine onbereikbaar, en erachteraan jagen is een fout.
Wat de index toont en wat niet
De hardeningsindex is de gewogen verhouding tussen geslaagde tests en het totaal — geen percentage veiligheid. Lynis voert een stuk of driehonderd tests uit en levert twee aparte lijsten: warnings, die op een echt probleem lijken, en suggestions, oftewel wat verbeterd zou kunnen worden. Begin altijd bij de waarschuwingen; het zijn er meestal weinig.
Honderd punten bestaan niet: sommige aanbevelingen vooronderstellen beslissingen die bij de installatie van het systeem zijn genomen (aparte partities voor /home, /tmp en /var), andere vragen toegang tot de opstartlader die een VPS niet heeft, en weer andere spreken elkaar tegen. En uw index vergelijken met die van iemand anders heeft geen zin: Lynis trekt punten af voor wat er op de machine draait. Elke actieve dienst is weer een open poort, een eigen configuratie en een dozijn nieuwe suggesties — daarom vindt u hoge waarden vooral waar niets anders dan SSH draait. Voor een werkserver met site, database en mail is 85 een goed resultaat.
Als root uitvoeren
sudo lynis audit system
Zonder sudo slaat Lynis alle tests over die systeembestanden nodig hebben en meldt een lagere index — niet omdat de server slecht is, maar omdat de controles onzichtbaar bleven. Het rapport komt in /var/log/lynis-report.dat, het leesbare logboek in /var/log/lynis.log.
Elke uitvoerregel begint met een testaanduiding als SSH-7408 of KRNL-6000. Via die aanduiding vindt u zowel de uitleg als de manier om een test uit te zetten — onthoud de vorm ervan, al het overige draait daaromheen.
Wat het getal werkelijk beweegt
SSH (SSH-7408). Het zwaarste blok: één test controleert een dozijn parameters tegelijk. Bewerk niet de hele sshd_config, leg een apart bestand neer zodat een pakketupdate uw werk niet wist:
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 vóór het herladen van de dienst is verplicht: een fout in de configuratie terwijl uw sessie loopt, laat u buiten staan. En voordat u PasswordAuthentication no zet, verzeker u ervan dat de sleutel echt werkt — vanuit een tweede geopende terminal.
Kernelparameters (KRNL-6000). De test controleert een stuk of twintig sysctl-waarden. Een bestand daarvoor:
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
Ontbrekende hulpmiddelen. Een flink deel van de suggesties komt neer op «installeer wat er niet is»: auditd (registratie van systeemgebeurtenissen), aide (bestandsintegriteit), debsums (pakketintegriteit), unattended-upgrades (automatische beveiligingsupdates), sysstat en acct (procesboekhouding), een virusscanner. Elk sluit een of twee aanbevelingen af, maar installeer ze niet om de punten: zonder die reconstrueert u na een incident niets.
Kleinigheden met een goede verhouding tussen moeite en resultaat. umask 027 in /etc/login.defs; de geldigheidsduur van wachtwoorden in datzelfde bestand; de banners /etc/issue en /etc/issue.net; compilers alleen leesbaar voor root (chmod 700 /usr/bin/gcc). Over de banners eerlijk gezegd: aan de veiligheid dragen ze niets bij, het is een juridische formaliteit — een punt leveren ze wel op.
Een valkuil in login.defs
Het aanpassen van umask met een regelvervanging via sed laat vaak meerdere UMASK-regels in het bestand achter. Lynis telt de waarde dan niet mee, en test AUTH-9328 blijft rood hoewel de instelling gedaan lijkt. Controleer na het bewerken:
grep -c '^UMASK' /etc/login.defs
Het moet er precies één zijn. Hetzelfde geldt voor elke andere parameter in dat bestand.
Vals alarm en hoe u het correct het zwijgen oplegt
Sommige waarschuwingen gelden helemaal niet voor uw server. Een voorbeeld uit de praktijk: op de VPS van een grote aanbieder meldt test PKGS-7388 dat er geen beveiligingsrepository is gevonden — eenvoudigweg omdat de repository's in deb822-formaat zijn beschreven met een verwijzing naar een spiegelbestand, terwijl Lynis de vertrouwde regel zoekt. De beveiligingsupdates komen intussen prima binnen.
Zoiets legt u het zwijgen op, niet door regels uit het rapport te schrappen, maar met een profiel. Profielbestanden hebben de extensie .prf (niet .prof — daar verliest u makkelijk een half uur mee), en uw eigen regels horen in /etc/lynis/custom.prf:
skip-test=PKGS-7388
skip-test=KRNL-5788
Eén regel: naast elke regel hoort een opmerking waarom de test wordt overgeslagen. Over een half jaar weet u niet meer of hij is uitgezet omdat hij niet van toepassing is of omdat het herstellen te veel moeite kostte — en het verschil tussen die twee gevallen is de hele kwestie.
Wat u niet moet doen
Jaag niet op het getal. De index is makkelijk op te blazen door lastige tests uit te zetten, en boven een bepaald niveau is dat de enige weg — alleen wordt de server er niet veiliger van. Iets anders is wel nuttig: uw eigen waarde vastleggen en de veranderingen volgen. Een index die daalt na een update of na een configuratiewijziging van iemand anders is een veel waardevoller signaal dan de absolute hoogte ervan.
Juist daarom loont het Lynis volgens schema te draaien in plaats van eenmalig, en de rapporten te bewaren zodat er iets te vergelijken valt. Hoe dat op één pagina samengebracht eruitziet, toont de demo hieronder: de index, de lijst met waarschuwingen met hun testaanduidingen en wat er sinds de vorige run is veranderd.