Saltar a contenido

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.

  1. 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
    
  2. 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).

  1. 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
    
  2. 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.

  1. 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
    
  2. Aplicar:

    sudo sysctl -p /etc/sysctl.d/99-hardening.conf
    

 

  • kernel.randomize_va_space = 2 es el valor por defecto en la mayoría de distribuciones; compruébalo con sudo sysctl kernel.randomize_va_space antes de asumir que introduce un cambio.
  • kernel.kptr_restrict = 2 oculta las direcciones del kernel salvo para root. Herramientas de profiling que necesiten ptrace/perf sin privilegios dejarán de verlas.
  • fs.suid_dumpable = 0 se 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.

  1. 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
    
  2. Aplicar:

    sudo sysctl -p /etc/sysctl.d/99-hardening.conf
    

 

  • kernel.unprivileged_bpf_disabled = 1 desactiva 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 = 1 limita ptrace entre procesos distintos (afecta a depuradores y a herramientas como gdb sobre otros procesos).
  • fs.protected_hardlinks y fs.protected_symlinks se 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.