Hardening del kernel¶
El hardening del kernel restringe lo que hace el núcleo en tiempo de ejecución: qué funcionalidades quedan activas, cómo gestiona la memoria y la red, y qué se expone en /proc y dmesg. Se configura casi todo con sysctl, sin recompilar ni tocar el código.
Baja prioridad
Esta capa es refuerzo opcional y tardío. Protege al propio kernel, pero no impide los ataques reales a un servidor expuesto (fuerza bruta, exploits de la aplicación...). Aplícala después de asegurar la superficie: SSH, PAM, Firewall y las Actualizaciones.
Además, muchos de estos valores ya vienen por defecto en kernels modernos. Cada receta indica cómo comprobar si realmente cambia algo, y conviene validar que un valor no rompa red, contenedores o rendimiento antes de asumirlo.
Cómo se aplica¶
Se usa un drop-in en /etc/sysctl.d/, igual que en Limitar core dumps:
sudo vim /etc/sysctl.d/99-hardening.conf
sudo sysctl -p /etc/sysctl.d/99-hardening.conf
sysctl -p aplica el fichero al momento; los valores quedan persistentes para los siguientes reinicios. Para verificar un valor concreto:
sudo sysctl net.ipv4.conf.all.rp_filter
Enfoque por niveles¶
Como en las demás páginas, se sube de nivel añadiendo capas. Puedes parar donde quieras u omitir las que no apliquen a tu caso.
| Nivel | Área | ¿Aplicarlo? |
|---|---|---|
| 1 | Rutas y spoofing | Recomendado |
| 2 | SYN flood y pings broadcast | Recomendado en servidor expuesto |
| 3 | Memoria, dmesg y punteros | Recomendado |
| 4 | Ejecución: bpf, ptrace, filesystem | Opcional |
Nivel 1 — Rutas y spoofing¶
Recomendado. Impide la manipulación de rutas y filtra paquetes con direcciones fuente falsas (rp_filter), antiespoofing.
-
Añadir al drop-in:
sudo vim /etc/sysctl.d/99-hardening.conf# Nivel 1 - rutas y spoofing net.ipv4.conf.all.rp_filter = 1 net.ipv4.conf.default.rp_filter = 1 net.ipv4.conf.all.accept_redirects = 0 net.ipv4.conf.default.accept_redirects = 0 net.ipv6.conf.all.accept_redirects = 0 net.ipv6.conf.default.accept_redirects = 0 net.ipv4.conf.all.send_redirects = 0 net.ipv4.conf.default.send_redirects = 0 -
Aplicar:
sudo sysctl -p /etc/sysctl.d/99-hardening.conf
rp_filter y redes complejas
En configuraciones multi-homing o con multicast extenso, rp_filter = 1 puede descartar tráfico legítimo. Si compruebas que algo deja de funcionar, valida con sudo sysctl net.ipv4.conf.all.rp_filter antes de quitarlo — en la mayoría de servidores expuestos es seguro y ya es el valor por defecto.
Nivel 2 — SYN flood y pings broadcast¶
Recomendado en un servidor expuesto. Mitiga el ataque SYN flood (desbordar la cola de conexiones media-abiertas) y los pings broadcast (Smurf).
-
Añadir al drop-in:
sudo vim /etc/sysctl.d/99-hardening.conf# Nivel 2 - SYN flood y pings broadcast net.ipv4.tcp_syncookies = 1 net.ipv4.icmp_echo_ignore_broadcasts = 1 -
Aplicar:
sudo sysctl -p /etc/sysctl.d/99-hardening.conf
Nivel 3 — Memoria, dmesg y punteros¶
Recomendado. Es la protección más relevante contra exploits: ASLR completo, restringe quién lee el log del kernel y oculta punteros del kernel en /proc. Consolida además fs.suid_dumpable = 0, que ya configuras en Limitar core dumps.
-
Añadir al drop-in:
sudo vim /etc/sysctl.d/99-hardening.conf# Nivel 3 - memoria y kernel kernel.randomize_va_space = 2 kernel.dmesg_restrict = 1 kernel.kptr_restrict = 2 kernel.core_uses_pid = 1 fs.suid_dumpable = 0 -
Aplicar:
sudo sysctl -p /etc/sysctl.d/99-hardening.conf
kernel.randomize_va_space = 2es el valor por defecto en la mayoría de distribuciones; compruébalo consudo sysctl kernel.randomize_va_spaceantes de asumir que introduce un cambio.kernel.kptr_restrict = 2oculta las direcciones del kernel salvo para root. Herramientas de profiling que necesitenptrace/perfsin privilegios dejarán de verlas.fs.suid_dumpable = 0se duplica aquí para tenerlo todo en un único fichero, aunque tu drop-in de core dumps ya lo tenga.
Nivel 4 — Ejecución: bpf, ptrace y filesystem¶
Opcional. Restringe vectores de ejecución de código en el kernel y enlaces de ficheros que se aprovechan en escaladas de privilegios.
-
Añadir al drop-in:
sudo vim /etc/sysctl.d/99-hardening.conf# Nivel 4 - ejecución y filesystem kernel.perf_event_paranoid = 3 kernel.unprivileged_bpf_disabled = 1 kernel.yama.ptrace_scope = 1 fs.protected_hardlinks = 1 fs.protected_symlinks = 1 -
Aplicar:
sudo sysctl -p /etc/sysctl.d/99-hardening.conf
kernel.unprivileged_bpf_disabled = 1desactiva BPF para usuarios no privilegiados. Si tu stack usa eBPF para observabilidad (Cilium, Falco, Datadog...), confirma que corre con privilegios antes de activarlo.kernel.yama.ptrace_scope = 1limitaptraceentre procesos distintos (afecta a depuradores y a herramientas comogdbsobre otros procesos).fs.protected_hardlinksyfs.protected_symlinksse activan desde siempre en las imágenes modernas.
Referencia¶
Estado del fichero al completar los cuatro niveles:
# Nivel 1 - rutas y spoofing
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
net.ipv6.conf.default.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
# Nivel 2 - SYN flood y pings broadcast
net.ipv4.tcp_syncookies = 1
net.ipv4.icmp_echo_ignore_broadcasts = 1
# Nivel 3 - memoria y kernel
kernel.randomize_va_space = 2
kernel.dmesg_restrict = 1
kernel.kptr_restrict = 2
kernel.core_uses_pid = 1
fs.suid_dumpable = 0
# Nivel 4 - ejecución y filesystem
kernel.perf_event_paranoid = 3
kernel.unprivileged_bpf_disabled = 1
kernel.yama.ptrace_scope = 1
fs.protected_hardlinks = 1
fs.protected_symlinks = 1
Verificar¶
sudo sysctl -p /etc/sysctl.d/99-hardening.conf
No debe salir ningún error de clave desconocida. Para comprobar valores puntuales, con el nombre exacto de la clave:
sudo sysctl net.ipv4.conf.all.rp_filter
sudo sysctl net.ipv4.tcp_syncookies
sudo sysctl kernel.randomize_va_space
sudo sysctl kernel.dmesg_restrict
sudo sysctl kernel.unprivileged_bpf_disabled
Debe devolver el valor configurado en cada nivel aplicado (p. ej. net.ipv4.conf.all.rp_filter = 1).
Reinicia-crítico
Valida tras un reinicio que los valores se han persistido (sysctl -a muestra los activos) y que la red, los contenedores y el acceso SSH siguen funcionando antes de asumir que el hardening es inocuo en tu kernel.
Y ahora qué
El núcleo está reforzado (siempre que lo necesites). La sección de seguridad queda cubierta — para una visión completa del estado, ejecuta una auditoría con Lynis, que puntúa este hardening.