El “hardener” de Ubuntu que está ganando adeptos: así funciona el script de konstruktoid para blindar sistemas systemd de arriba abajo

En un momento en que un VPS o una instancia cloud se levanta en minutos y se expone a Internet desde el primer boot, ha crecido el interés por herramientas de endurecimiento automatizado que apliquen buenas prácticas sin dejar cabos sueltos. Una de las más citadas en los últimos meses dentro de la comunidad es el repositorio konstruktoid/hardening: un script de hardening para Ubuntu (systemd edition) que ejecuta, en un orden estricto, decenas de controles sobre kernel, red, systemd, fstab, SSH, logging, packages y más, dejando el sistema con un perfil de seguridad alto y consistente.

La propuesta no es “un bash que hace de todo sin explicar nada”. Al contrario: el proyecto lista todas las funciones (prefijo f_) en orden de ejecución, detalla qué cambia cada una, y advierte consecuencias operativas (por ejemplo, inhabilitar usb-storage bloquea el uso de memorias USB a menos que se configure USBGuard). El objetivo: acercar controles de referencia (muchos alineados con las guías de CIS, Ubuntu y Mozilla) a equipos y admins que quieren automatizar el baseline sin entrar aún en marcos de cumplimiento complejos.


Una orquesta en varios movimientos: del kernel a systemd, de la red al usuario

El script recorre un orden lógico que minimiza riesgos y resuelve dependencias entre bloques. La secuencia, a grandes rasgos, es:

1) Preflight: permisos y apt

La función pre fija flags de APT y comprueba permisos básicos. Sin estos cimientos, algunas etapas posteriores (instalación, limpieza, noexec en /tmp) podrían fallar.

2) Kernel y red: firewall y módulos que sobran

  • firewall: si UFW está instalado, lo configura. Permite SSH desde las direcciones de $FW_ADMIN hacia $SSH_PORT (variable del script), activa logging y fija IPT_SYSCTL=/etc/sysctl.conf.
  • disablenet: deshabilita módulos de red menos comunes (dccp, sctp, rds, tipc).
  • disablefs: apaga sistemas de archivos que rara vez se usan en servidores actuales (cramfs, freevxfs, jffs2, ksmbd, hfs, hfsplus, udf).
  • disablemod: desactiva módulos de riesgo o no necesarios (bluetooth, firewire, pcspkr, uvcvideo, usb-storage, etc.). Aviso importante: desactivar usb-storage impide el uso de discos USB; si se requieren medios externos, el propio script contempla USBGuard más adelante.

3) systemd: coherencia y límites por defecto

  • systemdconf: fija CrashShell=no, DumpCore=no y límites conservadores de ficheros y procesos (por defecto, DefaultLimitNOFILE=1024, DefaultLimitNPROC=1024, DefaultLimitCORE=0) tanto en el system.conf global como en user.conf.
  • resolvedconf: configura systemd-resolved con DNS tomados de /etc/resolv.conf, DNS over TLS en modo opportunistic, DNSSEC en allow-downgrade y un FallbackDNS a 1.0.0.1.
  • logindconf: endurece la sesión: IdleAction=lock a los 15 minutos, KillUserProcesses=1, RemoveIPC=yes, excluyendo a root.
  • journalctl: hace persistente el journal (Storage=persistent), comprime y reenvía a syslog. Si el fichero de rsyslog es escribible, fija $FileCreateMode 0600 para proteger permisos.

4) Tiempo y ficheros: timesyncd y fstab con opciones seguras

  • timesyncd: define servidores NTP (hasta cuatro con < 50 ms de latencia) y RootDistanceMaxSec=1.
  • fstab: añade o ajusta montajes con nosuid,nodev,noexec donde aplica:
    • /boot y /home con nosuid,nodev si existen.
    • /var/log, /var/log/audit y /var/tmp con nosuid,nodev,noexec si existen.
    • Monta /run/shm y /dev/shm como tmpfs rw,noexec,nosuid,nodev.
    • Monta /proc con nosuid,nodev,noexec,relatime,hidepid=2 (los usuarios solo ven sus propios procesos), una medida clásica de hardening.
    • Sustituye /tmp en fstab y activa tmp.mount de systemd para usar tmpfs.

5) Cadena de paquetes y limpieza de binarios

  • prelink: revierte binarios preenlazados y desinstala prelink (evita firmas alteradas y facilita integridad).
  • aptget_configure: ajusta opciones de APT para endurecer: prohíbe repos inseguros, no instala recomendaciones/sugerencias por defecto, activa seccomp sandbox, autoclean cada 7 días, autoremove automático, etc.
  • aptget: sube el sistema con actualizaciones disponibles.

6) Banners, permisos y host access

  • hosts: configura /etc/hosts.allow y /etc/hosts.deny (TCP Wrappers): permite sshd : ALL : ALLOW, ALL: LOCAL, 127.0.0.1 y deniega el resto (ALL: ALL).
  • issue: escribe avisos de uso autorizado en /etc/issue, /etc/issue.net y /etc/motd, y quita el ejecutable en /etc/update-motd.d/ para evitar mensajes dinámicos que puedan filtrar info.

7) Usuarios, PAM y contraseñas

  • sudo: restringe su a miembros del grupo sudo con pam_wheel y fija opciones como use_pty, logfile=/var/log/sudo.log, !pwfeedback, !visiblepw, passwd_timeout=1, timestamp_timeout=5.
  • logindefs: endurece /etc/login.defs: UMASK 077, PASS_MIN_DAYS 1, PASS_MAX_DAYS 60, DEFAULT_HOME no, ENCRYPT_METHOD SHA512, y límites de SHA_CRYPT entre 10.000 y 65.536 rondas.
  • limitsconf: añade límites en /etc/security/limits.conf: máximo de 10 sesiones, core a 0, nproc 512/1024.
  • adduser y useradd: refuerzan modos y shell por defecto: DIR_MODE=0750, DSHELL=/bin/false, INACTIVE=30.
  • password: instala y copia /etc/security/pwquality.conf para política de contraseñas, y elimina nullok de PAM para impedir contraseñas vacías.
  • users: elimina cuentas del sistema no esenciales (games, gnats, irc, list, news, sync, uucp).
  • lockroot: bloquea la cuenta root.

8) SSH del servidor: una config moderna y agresiva

  • sshconfig / sshdconfig: la configuración se vuelca por defecto en /etc/ssh/sshd_config.d/hardening.conf (si hay Include; si no, en el sshd_config principal). Entre los ajustes:
    • Cifrado/KEX/MACs: Ciphers [email protected],[email protected],aes256-ctr; KexAlgorithms [email protected],ecdh-sha2-...; Macs hmac-sha2-512(-etm), hmac-sha2-256(-etm).
    • Acceso: PasswordAuthentication no, PermitRootLogin no, AllowGroups sudo, Port 22 (se puede combinar con el firewall para un puerto alternativo).
    • Canales: AllowTcpForwarding no, AllowAgentForwarding no, X11Forwarding no, Compression no.
    • Control: LoginGraceTime 20, MaxAuthTries 3, MaxSessions 3, ClientAliveInterval 200, ClientAliveCountMax 3.
    • Auditoría: LogLevel VERBOSE y Banner /etc/issue.net.
    • Higiene: StrictModes yes, UseDNS no, UsePAM yes, IgnoreUserKnownHosts yes, PermitUserEnvironment no.

9) Logging y auditoría: journal, rsyslog, AIDE, rkhunter

  • Ya citado journal, el script también ajusta /etc/rsyslog.conf si es escribible.
  • aide: excluye Docker y LXCFS, genera una base y crea un timer de systemd para chequeos periódicos.
  • rkhunter: habilita cron diario, autogeneración y alertas.
  • aide_post, aide_timer: completan la programación de integridad.

10) Mail y coredumps

  • postfix: instala y configura con inet_interfaces=loopback-only, disable_vrfy_command=yes, banner sobrio y restricciones de cliente por defecto; preparado para alertas locales.
  • coredump: deshabilita coredumps (Storage=none, ProcessSizeMax=0) para evitar fuga de información sensible en disco.

11) USBGuard, AppArmor, PATH, umask

  • usbguard: instala y activa reglas para controlar dispositivos USB permitidos.
  • aa_enforce: pone en modo enforce los perfiles AppArmor disponibles.
  • path y umask: fija umask 077 y PATHs seguros: para root (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin) y resto (/usr/local/bin:/usr/sbin:/usr/bin:/bin:/snap/bin).

12) Paquetes: instalar lo que protege, quitar lo que estorba

  • package_install: acct, aide-common, cracklib-runtime, debsums, gnupg2, haveged, libpam-pwquality, libpam-tmpdir, needrestart, openssh-server, postfix, psad, rkhunter, sysstat, systemd-coredump, tcpd, update-notifier-common, vlock.
  • package_remove: elimina apport*, autofs, avahi*, beep, git (si no hace falta en servidor), pastebinit, popularity-contest, rsh*, rsync, talk*, telnet*, tftp*, whoopsie, xinetd, yp-tools/ypbind.
  • restrictcompilers: cambia modo a 0750 en compiladores instalados para evitar abuso.

13) Cron y at, hosts y acceso a consola

  • cron: deshabilita atd y solo permite cron/at a root.
  • rhosts: borra hosts.equiv y cualquier .rhosts.
  • rootaccess: restringe acceso con /etc/security/access.conf y /etc/securetty.

14) Limpieza y comprobación final

  • aptget_noexec: añade hooks Pre-Invoke/Post-Invoke a APT para que no fallen actualizaciones en sistemas con /tmp montado como noexec.
  • aptget_clean: clean/autoremove.
  • systemddelta y post: housekeeping.
  • checkreboot: avisa si el sistema requiere reinicio.

Ventajas: orden, coherencia y avisos de “lo que puede romperse”

La fortaleza del script está en hacer muchas cosas en el orden correcto y dejar rastro claro. Casos típicos:

  • fstab seguro sin romper /tmp: cambia a tmpfs gestionado por systemd y añade los hooks de APT para que no muera dpkg por noexec.
  • USB: bloquea usb-storage pero instala USBGuard para permitir dispositivos autorizados si hace falta.
  • SSH: mueve hardening a /etc/ssh/sshd_config.d/ si hay Include, evitando pisar configs locales; y aun así documenta dónde se escribe.
  • Logging: consolida journalctl con persistencia, compresión y reenvío a syslog, y protege permisos creados por rsyslog.

No es “magia”: en entornos complejos conviene repasar cada función, adaptar whitelists, grupos y puertos, y probar en máquinas de ensayo o snapshots antes de producción.


¿Para quién es? ¿Qué gana frente a hacerlo a mano?

Para administradores y equipos que quieren un baseline robusto en Ubuntu sin reescribir políticas desde cero. Frente a hacerlo a mano, aporta:

  • Idempotencia (si respetas orden y variables),
  • Coherencia (los bloques se piensan como conjunto), y
  • Ahorro de tiempo (instala, configura, limpia y comprueba en una pasada).

No sustituye a CIS Benchmarks ni a marcos de cumplimiento, pero deja el sistema mucho más cerca de esas recomendaciones.


Preguntas frecuentes

¿Puede romper mi servidor en producción?
Cualquier hardening agresivo puede causar regresiones si hay dependencias no previstas (por ejemplo, usb-storage si usas discos USB, o noexec en /tmp si una build lo requiere). La vía segura: snapshot, prueba en staging, revisa variables (IP de administración, $SSH_PORT, grupos y servicios) y aplica por etapas.

¿Puedo elegir qué funciones ejecutar y cuáles no?
Sí. El repositorio documenta la lista en orden; puedes comentar o invocar selectivamente funciones (todas tienen prefijo f_). Mantén el orden relativo (por ejemplo, no configures fstab “al final” si antes dependes de tmpfs en /tmp).

¿Sustituye a CIS Benchmarks o a herramientas como Ansible?
No. Es una herramienta práctica de hardening para Ubuntu systemd. Para cumplimiento (CIS, ISO 27001, etc.) tendrás que mapear controles y, si quieres desplegar a escala, convertir o envolver estas funciones en Ansible/Terraform con inventarios y pruebas.

¿Qué cambios son más “sensibles”?
Los montajes (noexec/nosuid/nodev en /tmp, /proc, /var/*), la desactivación de módulos (especialmente usb-storage), la política estricta de SSH (sin contraseña, banner, port forwards deshabilitados) y la limpieza de paquetes (quitar rsync si lo usabas, por ejemplo). Revísalos según tu caso.


Fuentes

Nota: Todos los detalles de esta pieza proceden de la documentación del repositorio enlazado (descripciones de funciones, parámetros y advertencias). Se recomienda revisar el README y los ficheros de configuración incluidos (config/*) antes de ejecutar en entornos críticos.

encuentra artículos

newsletter

Recibe toda la actualidad del sector tech y cloud en tu email de la mano de RevistaCloud.com.

Suscripción boletín

LO ÚLTIMO

×