El script de hardening para Ubuntu que ya usan los “sheriffs” del data center: así blinda konstruktoid/hardening tus sistemas systemd de arriba a abajo

En tiempos de “boot & breach” —levantar una instancia en minutos y verla escaneada a los 10 segundos— el baseline de seguridad ya no puede ser una lista de deseos en un wiki. Necesita orden, repetibilidad y un criterio de mínimos que no negocie con la realidad operativa. Ahí encaja konstruktoid/hardening, un repositorio público que automatiza el endurecimiento de Ubuntu (edición systemd) en orden estricto, con funciones que tocan kernel, red, systemd/resolved/logind/journal, fstab, SSH, logging, contraseñas, USB, AppArmor, paquetes, AIDE/Rkhunter y más. Su objetivo: dejar un servidor coherente y seguro sin obligar al administrador a encajar piezas sueltas de decenas de guías.

La filosofía es “conservador pero consciente”: cada control está documentado, las funciones se ejecutan en un orden determinado, y se avisa cuando una medida tiene impacto operativo (por ejemplo, deshabilitar usb-storage rompe el uso general de pendrives y obliga a gestionar excepciones con USBGuard). No es un reemplazo de CIS, ISO o auditoría formal; sí es un acelerador fiable para que equipos de Linux/Ubuntu apliquen un baseline consistente en minutos, y lo repitan con la misma receta.


Qué hace realmente (y por qué importa el orden)

El script encadena funciones con prefijo f_ en secuencia de ejecución. El orden no es casual: evita que una medida rompa otra y reduce “sorpresas” a mitad de despliegue. Un resumen orientado a administradores:

1) Preflight y APT endurecido

  • pre: ajusta flags de APT y comprueba permisos básicos.
  • aptget_configure: prohíbe repos inseguros, desactiva Recommends/Suggests, activa seccomp en APT, autoclean cada 7 días y autoremove automático.
  • aptget: actualiza paquetes tras endurecer APT.

Racional: si APT cae por noexec o por listar repos inseguros, el resto del hardening se tambalea.

2) Firewall y kernel: menos superficie, más control

  • firewall: si UFW está instalado, configura políticas, logging y permite SSH desde $FW_ADMIN hacia $SSH_PORT.
  • disablenet: deshabilita módulos de red poco comunes (dccp, sctp, rds, tipc).
  • disablefs: apaga sistemas de archivos raros en servidor (cramfs, jffs2, ksmbd, hfs/hfsplus, udf).
  • disablemod: desactiva módulos que suelen sobrar o entrañan riesgo (bluetooth, firewire, pcspkr, uvcvideo, usb-storage, etc.). Nota: si necesitas USB, planifica USBGuard (incluido más adelante) y quita usb-storage de la blacklist.

3) systemd/resolved/logind/journal: límites y telemetría saneada

  • systemdconf: sin core dumps por defecto (DumpCore=no), CrashShell=no, y límites prudentes de ficheros y procesos a nivel de sistema y de usuario.
  • resolvedconf: configura DNS desde /etc/resolv.conf, DoT en opportunistic, DNSSEC en allow-downgrade y Fallback a 1.0.0.1.
  • logindconf: bloquea sesión a los 15 min (IdleAction=lock), mata procesos de usuario al salir (KillUserProcesses=1) y limpia IPC.
  • journalctl: journal persistente y comprimido, reenvío a rsyslog y umask 0600 para ficheros de syslog.

Racional: menos ruido y menos fugas; si llega una incidencia, los logs persisten y con permisos correctos.

4) Tiempo y fstab seguro (sin “matar” APT)

  • timesyncd: NTP con hasta 4 servidores (< 50 ms) y RootDistanceMaxSec=1.
  • fstab: fija nosuid,nodev,noexec donde corresponde:
    • /boot y /home con nosuid,nodev.
    • /var/log, /var/log/audit, /var/tmp con noexec también.
    • /run/shm, /dev/shm, /proc (con hidepid=2 para ocultar procesos entre usuarios).
    • Sustituye /tmp en fstab por tmpfs de systemd (montaje tmp.mount).
  • aptget_noexec: añade hooks Pre/Post-Invoke para que APT no falle en /tmp noexec.

Racional: fstab agresivo sin dejar KO dpkg. Es un clásico que aquí está resuelto.

5) Legal banner, tcp_wrappers y permisos “de entrada”

  • hosts: hosts.allow y hosts.deny con sshd : ALL : ALLOW, ALL: LOCAL, 127.0.0.1, ALL: ALL.
  • issue: banner de uso autorizado en /etc/issue, /etc/issue.net y /etc/motd; desactiva motd dinámicos ejecutables.

6) Usuarios, PAM y contraseñas

  • sudo: limita su a grupo sudo (vía pam_wheel), obliga PTY, registra en /var/log/sudo.log, tiempos de prompt y timestamp cortos.
  • logindefs: UMASK 077, PASS_MIN_DAYS 1, PASS_MAX_DAYS 60, SHA512 y rondas entre 10.000–65.536.
  • limitsconf: topes de sesiones, core y nproc sensatos.
  • adduser/useradd: DIR_MODE=0750, DSHELL=/bin/false, INACTIVE=30.
  • password: instala y copia pwquality.conf para requisitos de contraseñas (longitud, clases, repetición), elimina nullok de PAM.
  • users: retira cuentas del sistema obsoletas (games, gnats, irc, etc.).
  • lockroot: bloquea root.

7) SSH “duro” con Include

  • sshconfig / sshdconfig: escribe por defecto en /etc/ssh/sshd_config.d/hardening.conf (si hay Include), con:
    • PasswordAuthentication no, PermitRootLogin no, AllowGroups sudo, Port 22 (ajustable).
    • AllowTcpForwarding no, AllowAgentForwarding no, X11Forwarding no, Compression no.
    • Cifrado/KEX/MACs modernos (Curve25519, chacha20, GCM, SHA2).
    • LoginGraceTime 20, MaxAuthTries 3, MaxSessions 3, ClientAliveInterval 200/CountMax 3.
    • LogLevel VERBOSE y banner.

Racional: usa la carpeta sshd_config.d/ si existe para no pisar overrides previos y facilitar mantenimiento.

8) Integridad, rootkits y mail

  • aide + aide_post + aide_timer: excluye Docker/LXCFS, genera base y programa chequeos periódicos via systemd timer.
  • rkhunter: habilita cron diario y autogeneración.
  • postfix: instala y configura local-only (inet_interfaces=loopback-only), disable_vrfy_command, banner sobrio, restricciones de cliente; listo para alertas del sistema.

9) coredumps, USB y AppArmor

  • coredump: desactiva almacenamiento y tamaño de coredumps.
  • usbguard: instala y aplica lista de dispositivos USB permitidos.
  • aa_enforce: fuerza todos los perfiles AppArmor disponibles a enforce.

10) PATH, umask y limpieza de paquetes

  • path/umask: umask 077 y PATHs seguros (diferenciados para root y usuarios).
  • package_install: tooling de seguridad: acct, aide, cracklib, debsums, haveged, pwquality, pam-tmpdir, needrestart, openssh, postfix, psad, rkhunter, sysstat, tcpd, vlock
  • package_remove: elimina apport, autofs, avahi y otras superficies innecesarias en servidor, telnet/tftp/rsh, whoopsie, xinetd, yp*, incluso rsync si no lo usas.
  • restrictcompilers: fija 0750 en compiladores instalados.

11) Cron/at, rhosts y consola

  • cron: deshabilita atd y limita cron/at a root.
  • rhosts: borra hosts.equiv y cualquier .rhosts.
  • rootaccess: refuerza /etc/security/access.conf y /etc/securetty.

12) Remates: limpieza APT, diferencias systemd y reinicio pendiente

  • aptget_clean: clean/autoremove.
  • systemddelta, post, checkreboot.

Por qué interesa a sysadmins y equipos Ubuntu

  • Consistencia: los bloques no se pisan entre sí y el orden evita “foot-guns” (p. ej., noexec en /tmp sin romper dpkg).
  • Tiempos de adopción muy bajos: en 20–30 minutos se aplica un baseline notable y se puede complementar después.
  • Visibilidad: deja banner, journal persistente, rsyslog con permisos estrictos, alertas locales por postfix.
  • Seguridad realista: sin coredumps, sin contraseñas débiles, SSH reducido a lo imprescindible, módulos legacy fuera, AppArmor en enforce, USB controlado.

Para equipos que mantienen flotas de Ubuntu, el repositorio es una plantilla que se puede envolver en Ansible/Terraform y ejecutar de forma idempotente, con variables para $FW_ADMIN, $SSH_PORT, whitelists y servicios.


Precauciones y “límites de lo sensato”

  • usb-storage deshabilitado rompe cualquier USB no permitido por USBGuard. Si usas discos externos en tareas de copia, ajusta la política.
  • /tmp noexec + builds o contenedores pueden chocar si tus pipelines escriben binarios temporales. El script mitiga APT, pero valida tus workflows.
  • Paquetes removidos: si necesitas rsync o servicios inetd, revísalo antes.
  • SSH: configuración muy estricta; acompáñala con grupos/llaves correctamente distribuidos.
  • AppArmor: poner todo en enforce puede requerir perfiles para apps menos habituales.

Buenas prácticas: snapshot, staging previo, aplicar por bloques y revisar logs (journal, /var/log/auth.log, AIDE/Rkhunter) tras el primer arranque.


Sugerencia de adopción por fases (Ubuntu 22.04/24.04)

  1. Fase 0 – copia de seguridad: snapshot del VPS/VM y acceso a consola del proveedor.
  2. Fase 1 – acceso y red: firewall, ssh[d]config, journalctl, postfix. Verifica conectividad y logs.
  3. Fase 2 – kernel/fstab/PAM: disablenet, disablefs, disablemod (con whitelist USB si procede), fstab, password/logindefs, limitsconf, sudo/cron.
  4. Fase 3 – auditoría: aide (base + timer), rkhunter.
  5. Fase 4 – limpieza: package_remove, restrictcompilers, aptget_clean.
  6. Fase 5 – validación: lynis audit system (opcional, no incluido en el repo), rendimiento y pruebas funcionales.

Tiempo típico: 30–90 minutos según personalización.


En resumen

konstruktoid/hardening ha encontrado un hueco real: automatizar el baseline de seguridad en Ubuntu systemd con orden, advertencias y medidas probadas. Para sysadmins y equipos que no pueden permitirse “día y medio” de hardening manual por servidor, este script convierte el “deberíamos endurecer” en hecho: menos superficie, mejores logs, SSH coherente, contraseñas en condiciones, integridad programada y sustento para construir encima (CIS, SIEM, compliance).

No es la última palabra en seguridad —no pretende serlo—, pero deja a cualquier Ubuntu a años luz de una imagen vanilla expuesta a Internet. Y eso, hoy, marca la diferencia.


Preguntas frecuentes (FAQ)

¿Puede romper mi servidor si lo ejecuto “del tirón” en producción?
Es seguro en términos generales, pero hay cambios sensibles: noexec en /tmp, deshabilitar usb-storage, limpiar paquetes (telnet/tftp/rsh, incluso rsync), AppArmor enforce. Haz snapshot, prueba en staging y adapta variables (grupo/puerto SSH, whitelists y servicios). Ejecuta por fases y valida tras cada bloque.

¿Qué diferencia aporta frente a seguir una guía CIS?
CIS es un estándar de cumplimiento. Este script es un implante operativo: ejecuta en orden y cubre un baseline práctico. En organizaciones reguladas, úsalo como punto de partida y mapea luego a CIS Benchmarks (CIS-CAT) para cerrar la brecha de cumplimiento.

¿Puedo seleccionar funciones y saltarme otras?
Sí. Cada función f_* está documentada y el repositorio expone el orden recomendado. Puedes comentar o invocar selectivamente, manteniendo el orden relativo (p. ej., aptget_noexec antes de fijar fstab). Aun así, lo ideal es aplicar completo y ajustar whitelists.

¿Cómo lo integro con Ansible o Terraform?
Envuélvelo en un rol Ansible o un paso de cloud-init. Expón variables ($FW_ADMIN, $SSH_PORT, whitelists, DNS/NTP) y marca etiquetas por fase (firewall/ssh, fstab/PAM, auditoría, limpieza). Añade handlers para reinicios de sshd/rsyslog/systemd y tests (molecule o inspec) para validar estados.


Fuentes

Esta pieza se apoya exclusivamente en la documentación del repositorio enlazado (descripción de funciones y efectos). Se recomienda revisar README y config/, y probar en staging/snapshot antes de producción.

Suscríbete al boletín SysAdmin

Este es tu recurso para las últimas noticias y consejos sobre administración de sistemas, Linux, Windows, cloud computing, seguridad de la nube, etc. Lo enviamos 2 días a la semana.

¡Apúntate a nuestro newsletter!


– patrocinadores –

Noticias destacadas

– patrocinadores –

¡SUSCRÍBETE AL BOLETÍN
DE LOS SYSADMINS!

Scroll al inicio
×