Featured image of post Kernel hardening con sysctl

Kernel hardening con sysctl

Il kernel espone centinaia di parametri che cambiano il comportamento di rete e memoria, e alcuni contano per la sicurezza: protezioni anti-spoofing, difese contro link malevoli, restrizioni su ptrace e dmesg, ASLR. Un file sysctl commentato con le impostazioni di hardening che vale la pena applicare, e cosa fa ciascuna. Più il blocco dei moduli kernel inutili.

Perché conta

Il kernel è il cuore del sistema, e molti suoi comportamenti si regolano con i parametri sysctl. Alcuni sono rilevanti per la sicurezza: come tratta pacchetti sospetti, quanto protegge la memoria dei processi, quanto espone ai processi non privilegiati. I default sono scelti per compatibilità, non per massima sicurezza — e irrobustirli costa un file di configurazione. Non è il primo intervento da fare (gli accessi e i servizi vengono prima), ma è un completamento solido.

Come si applicano

1
2
3
4
sysctl net.ipv4.ip_forward            # leggi un parametro
sysctl -w kernel.kptr_restrict=2      # imposta a runtime (temporaneo)
# persistente: metti le righe in /etc/sysctl.d/*.conf
sysctl --system                       # ricarica tutti i file sysctl.d

Un file di hardening commentato

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
# /etc/sysctl.d/99-hardening.conf

# --- Rete: anti-spoofing e pacchetti sospetti ---
net.ipv4.conf.all.rp_filter = 1            # reverse path filter: scarta pacchetti con sorgente impossibile
net.ipv4.conf.all.accept_redirects = 0     # ignora ICMP redirect (possibile MITM)
net.ipv6.conf.all.accept_redirects = 0
net.ipv4.conf.all.accept_source_route = 0  # scarta pacchetti con source routing
net.ipv4.conf.all.log_martians = 1         # logga pacchetti con indirizzi impossibili
net.ipv4.tcp_syncookies = 1                # difesa contro i SYN flood

# --- Memoria e processi ---
kernel.randomize_va_space = 2              # ASLR pieno: randomizza gli indirizzi (ostacola exploit)
kernel.kptr_restrict = 2                   # nascondi gli indirizzi del kernel (/proc, dmesg)
kernel.dmesg_restrict = 1                  # solo root legge il ring buffer del kernel
kernel.yama.ptrace_scope = 1               # un processo non può ispezionarne un altro a piacere
kernel.unprivileged_bpf_disabled = 1       # niente eBPF per utenti non privilegiati
kernel.kexec_load_disabled = 1             # impedisci di caricare un altro kernel a runtime

# --- Filesystem ---
fs.protected_symlinks = 1                  # difesa da attacchi via link simbolici in dir condivise
fs.protected_hardlinks = 1
fs.suid_dumpable = 0                        # i processi SUID non generano core dump (fuga di segreti)

Ciascuna chiude una porta: rp_filter e accept_redirects=0 ostacolano spoofing e MITM; randomize_va_space=2 (ASLR) rende gli exploit di memoria molto più difficili; ptrace_scope=1 impedisce che un processo compromesso ispezioni la memoria di un altro (es. per rubare segreti); protected_symlinks neutralizza una classe classica di attacchi nelle directory world-writable come /tmp.

Bloccare i moduli kernel inutili

Ogni modulo kernel caricabile è codice che gira nel contesto più privilegiato. Moduli per protocolli o filesystem esotici che non usi sono superficie d’attacco inutile: si possono mettere in blacklist.

1
2
3
4
5
# /etc/modprobe.d/blacklist-hardening.conf
install dccp /bin/true          # protocolli di rete rari e storicamente bacati
install sctp /bin/true
install firewire-core /bin/true # interfacce DMA = rischio con accesso fisico
install usb-storage /bin/true   # SOLO se non ti servono chiavette USB (es. server)

install <modulo> /bin/true fa sì che il tentativo di caricare il modulo non faccia nulla. Utile per protocolli obsoleti (dccp, sctp, rds) che hanno avuto CVE e che quasi nessuno usa.

Verificare

1
2
sysctl -a 2>/dev/null | grep -E 'randomize_va_space|rp_filter|ptrace_scope'
lsmod                              # moduli attualmente caricati

Conclusione

Un file sysctl di hardening — anti-spoofing, ASLR pieno, restrizioni su ptrace/dmesg, protezione dei symlink — più la blacklist dei moduli inutili, irrobustiscono il livello più profondo del sistema a costo quasi nullo. Abbiamo coperto l’intero stack, dagli account al kernel; resta da rendere tutto questo ripetibile e verificabile invece che manuale. È il CIS Benchmark e l’automazione, capitolo che chiude la serie.

Built with Hugo
Theme Stack designed by Jimmy