Cómo proteger FreeBSD

Introducción

Bienvenido a mi guía para reforzar la seguridad de FreeBSD, actualizada para FreeBSD 15.1. FreeBSD ya es de por sí conservador y seguro tal y como viene de fábrica, pero un sistema conectado a Internet se merece algo más. Esta guía es un tutorial práctico de defensa en profundidad que puedes aplicar a una instalación nueva de la versión 15.1: parches, cuentas, SSH, el cortafuegos, el kernel, reducción de la superficie de ataque, el sistema de archivos y la supervisión. Aplica lo que se ajuste a tu modelo de amenazas; no necesitas todos los elementos en cada máquina. A lo largo de la guía, el símbolo # significa que debes ejecutar el comando como root.

1. Mantén el sistema actualizado

Nada de lo que viene a continuación importa si el equipo ejecuta código con vulnerabilidades conocidas. Aplicar parches es la medida de seguridad más importante.

Sistema base: freebsd-update

En una versión RELEASE, descarga e instala los parches básicos de seguridad y las erratas:

# freebsd-update fetch install

Paquetes: pkg upgrade y pkg audit

Mantén los paquetes actualizados y, lo que es más importante, comprueba si tienen vulnerabilidades en la base de datos VuXML. El antiguo portaudit ya no existe; ahora está integrado en pkg:

# pkg update
# pkg upgrade
# pkg audit -F

pkg audit -F actualiza la base de datos de vulnerabilidades e informa de cualquier paquete instalado que tenga un problema conocido.

Automatízalo

Deja que el sistema te avise cuando necesite atención. Añade una comprobación diaria de base-update que solo envíe un correo a root cuando haya parches pendientes:

# echo '@daily root freebsd-update cron' >> /etc/crontab

Y haz que la ejecución diaria de periodic revise tus paquetes, a través de /etc/periodic.conf:

security_status_pkgaudit_enable="YES"

2. Cuentas y autenticación

Hash de contraseñas y política (login.conf)

El FreeBSD moderno ya aplica el hash SHA-512 a las contraseñas por defecto; el antiguo MD5 ya es cosa del pasado. Confírmalo (o cambia a Blowfish con blf) en la clase default de /etc/login.conf, y establece una longitud mínima razonable:

:passwd_format=sha512:\
:minpasswordlen=12:\

Después de editarlo, vuelve a generar la base de datos de hash:

# cap_mkdb /etc/login.conf

Inicio de sesión como root y escalada de privilegios

No compartas la contraseña de root ni inicies sesión como root a través de la red. Crea un usuario administrador, añádelo al grupo wheel y eleva sus privilegios con una herramienta que registre y limite lo que concede. doas es pequeña y fácil de auditar:

# pkg install doas
# echo 'permit persist :wheel' > /usr/local/etc/doas.conf

(security/sudo es la alternativa más pesada y con más opciones de configuración). En la siguiente sección bloquearemos el inicio de sesión directo como root por SSH.

3. Fortalece SSH (OpenSSH)

SSH suele ser la única puerta de acceso al servidor, así que asegúrate de que sea segura.

sshd_config

En /etc/ssh/sshd_config, da prioridad a la autenticación basada en claves y desactiva las opciones poco seguras:

PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no
PubkeyAuthentication yes
AllowUsers youradmin

Instala tu clave pública (~/.ssh/authorized_keys) y prueba el inicio de sesión con clave antes de desactivar las contraseñas, o te quedarás fuera. A continuación, vuelve a cargar el servicio:

# service sshd reload

Restringir AllowUsers (o AllowGroups wheel) exactamente a quienes necesitan acceso al shell es una de las líneas más importantes del archivo.

Protección contra ataques de fuerza bruta con blacklistd

FreeBSD incluye blacklistd, que detecta los fallos de autenticación repetidos y le indica al cortafuegos que rechace la fuente. Actívalo:

# sysrc blacklistd_enable=YES
# service blacklistd start

Añade UseBlacklist yes a sshd_config, recarga sshd e integra blacklistd en pf (más abajo).

4. Cortafuegos con pf

FreeBSD ha heredado «pf» de OpenBSD, un filtro de paquetes limpio y potente. Una buena configuración por defecto es rechazar todo el tráfico entrante y abrir solo lo que realmente sirvas; normalmente basta con filtrar en la interfaz externa.

Un conjunto de reglas de denegación por defecto

Un archivo /etc/pf.conf mínimo para un servidor que ofrece SSH y HTTPS:

ext_if = "vtnet0"          # your external interface

set skip on lo
scrub in all

# blacklistd inserts its block rules here
anchor "blacklistd/*" in on $ext_if

block in all
pass out quick keep state

# only the services you actually offer
pass in on $ext_if proto tcp to ($ext_if) port { 22 443 } keep state

# allow ping
pass in on $ext_if inet proto icmp icmp-type echoreq

Comprueba la sintaxis y, a continuación, actívalo e inícialo:

# pfctl -nf /etc/pf.conf
# sysrc pf_enable=YES
# service pf start

Integrar blacklistd en pf

La línea anchor "blacklistd/*" es donde blacklistd inserta sus bloqueos, así que cualquier ataque de fuerza bruta a SSH que active blacklistd quedará bloqueado automáticamente en el cortafuegos. El archivo predeterminado /etc/blacklistd.conf ya incluye ssh.

5. Fortalecimiento del kernel y de sysctl

Sysctls útiles

Añade esto a /etc/sysctl.conf (se aplican al arrancar; configúralos ahora con sysctl <nombre>=<valor>):

# hide other users' processes
security.bsd.see_other_uids=0
security.bsd.see_other_gids=0
# don't let unprivileged users debug other processes
security.bsd.unprivileged_proc_debug=0
# stricter hardlink handling in sticky dirs
security.bsd.hardlink_check_uid=1
security.bsd.hardlink_check_gid=1
# stack guard page
security.bsd.stack_guard_page=1
# randomize the IP ID field
net.inet.ip.random_id=1

ASLR ya está activado

Buenas noticias: la aleatorización de la disposición del espacio de direcciones (ASLR) está activada por defecto en FreeBSD base (desde la versión 13.0), así que ya no necesitas un kernel de terceros solo para eso. Compruébalo:

# sysctl kern.elf64.aslr.enable kern.elf64.aslr.pie_enable
kern.elf64.aslr.enable: 1
kern.elf64.aslr.pie_enable: 1

securelevel (ten en cuenta las ventajas y desventajas)

kern.securelevel es un mecanismo unidireccional: hace que los indicadores de los archivos schg/sappnd sean inmutables, bloquea la carga de módulos del kernel y, en el nivel 3, congela tu conjunto de reglas de firewall. Es muy seguro, pero supone una carga operativa: necesitarás el modo de usuario único para modificar los archivos protegidos, y a algunos programas no les gusta. Actívalo deliberadamente a través de /etc/rc.conf:

# sysrc kern_securelevel_enable=YES
# sysrc kern_securelevel=2

Pásate al nivel 3 solo cuando tu cortafuegos y los archivos del sistema estén estables.

6. Minimiza la superficie de ataque

Comprueba qué servicios están a la escucha

No puedes proteger lo que no conoces. Enumera los sockets que están a la escucha:

# sockstat -4l
USER     COMMAND    PID   FD PROTO  LOCAL ADDRESS         FOREIGN ADDRESS
root     sshd       803   4  tcp4   *:22                  *:*
unbound  unbound    7620  6  tcp4   127.0.0.1:53          *:*

Usa -6l para IPv6 o -l para ambos. No se puede acceder desde la red a nada que esté en 127.0.0.1; sí se puede acceder a todo lo que esté en * (dependiendo de tu cortafuegos). Cada servicio en escucha es una superficie de ataque: cierra los que no necesites.

Desactiva lo que no necesites

Una instalación por defecto ya es bastante ligera. Desactiva los elementos habituales que no estés usando:

# sysrc sendmail_enable=NONE
# sysrc inetd_enable=NO

(FreeBSD ha ido eliminando sendmail del sistema base, así que es posible que una máquina 15.1 limpia ni siquiera lo incluya).

Aísla los servicios en «jails»

La característica de seguridad más destacada de FreeBSD es la jail, un contenedor ligero a nivel del sistema operativo. Ejecuta cada servicio conectado a la red (web, correo, DNS) en su propia jail, para que, si se produce una brecha de seguridad, esta quede confinada a esa jail en lugar de afectar a todo el servidor. Herramientas como bastille (pkg install bastille) te lo ponen fácil. Desde el punto de vista arquitectónico, esta es la medida más importante de la lista.

7. Fortalecimiento del sistema de archivos

Opciones de montaje

Otorga a cada sistema de archivos solo los privilegios que necesite. Un /tmp y un /var independientes pueden llevar las opciones nosuid/noexec, para que un atacante no pueda colocar y ejecutar un binario allí. En /etc/fstab:

/dev/...   /tmp  ufs  rw,nosuid,noexec,nodev  2  2

En ZFS, configura los equivalentes con zfs set exec=off setuid=off <dataset>. Pruébalo primero: algunos pasos de la compilación de paquetes se ejecutan legítimamente desde /tmp.

Comprobaciones de seguridad periódicas

La ejecución diaria de «seguridad periódica» informa de cambios en setuid, intentos fallidos de inicio de sesión y mucho más. Activa las opciones que quieras en /etc/periodic.conf:

daily_clean_tmps_enable="YES"
security_status_pkgaudit_enable="YES"

8. Registro, auditoría y supervisión

La ejecución periódica de seguridad

Por defecto, FreeBSD envía por correo a root un resumen diario de seguridad; léelo. En él se señalan los nuevos binarios con setuid, las anomalías en los mensajes del kernel, los fallos de inicio de sesión y mucho más: una supervisión sencilla y muy útil.

Auditoría con auditd (BSM)

Para un registro forense de verdad, FreeBSD incluye el marco de auditoría OpenBSM. Actívalo para registrar eventos relevantes para la seguridad (inicios de sesión, uso de privilegios, acceso a archivos) en un registro estructurado:

# sysrc auditd_enable=YES
# service auditd start

Ajusta lo que se registra en /etc/security/audit_control y revísalo con praudit y auditreduce.

Escanea con Lynis

Para obtener una segunda opinión automatizada, ejecuta Lynis, que comprueba docenas de elementos de refuerzo de seguridad y te ofrece una lista priorizada:

# pkg install lynis
# lynis audit system

9. Un paso más allá

Marco MAC y Capsicum

Cuando los permisos básicos de Unix se te quedan pequeños, FreeBSD te ofrece el marco MAC —políticas de control de acceso obligatorio (MAC) cargables, como mac_portacl y mac_bsdextended— y Capsicum, el entorno aislado en modo de capacidades integrado en muchas utilidades básicas. Ambos confinan los procesos mucho más allá de los usuarios y los grupos.

HardenedBSD

HardenedBSD es una derivación de FreeBSD centrada en la mitigación de exploits. Ahora que el FreeBSD base incluye ASLR, el valor de HardenedBSD reside en las medidas de mitigación adicionales que aporta: un ASLR más potente, protecciones al estilo PaX, SEGVGUARD y el trabajo en curso con CFI. Si tu modelo de amenazas justifica una mitigación agresiva, merece la pena evaluarlo, y el proyecto siempre da la bienvenida a probadores.

Comentarios

Te animamos a que nos des tu opinión. Dime qué falta, qué añadirías y qué te ha resultado útil: esta guía mejora cada vez que alguien contribuye.