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_ADMINhacia$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 quitausb-storagede 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) yRootDistanceMaxSec=1.fstab: fijanosuid,nodev,noexecdonde corresponde:/booty/homeconnosuid,nodev./var/log,/var/log/audit,/var/tmpconnoexectambién./run/shm,/dev/shm,/proc(conhidepid=2para ocultar procesos entre usuarios).- Sustituye
/tmpen fstab portmpfsde systemd (montajetmp.mount).
aptget_noexec: añade hooks Pre/Post-Invoke para que APT no falle en/tmpnoexec.
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.allowyhosts.denyconsshd : ALL : ALLOW,ALL: LOCAL, 127.0.0.1,ALL: ALL.issue: banner de uso autorizado en/etc/issue,/etc/issue.nety/etc/motd; desactiva motd dinámicos ejecutables.
6) Usuarios, PAM y contraseñas
sudo: limitasua grupo sudo (víapam_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 copiapwquality.confpara requisitos de contraseñas (longitud, clases, repetición), eliminanullokde PAM.users: retira cuentas del sistema obsoletas (games, gnats, irc, etc.).lockroot: bloquearoot.
7) SSH “duro” con Include
sshconfig/sshdconfig: escribe por defecto en/etc/ssh/sshd_config.d/hardening.conf(si hayInclude), 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 VERBOSEy 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 077y 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: deshabilitaatdy limita cron/at a root.rhosts: borrahosts.equivy cualquier.rhosts.rootaccess: refuerza/etc/security/access.confy/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.,
noexecen/tmpsin romperdpkg). - 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-storagedeshabilitado rompe cualquier USB no permitido por USBGuard. Si usas discos externos en tareas de copia, ajusta la política./tmpnoexec+ 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)
- Fase 0 – copia de seguridad: snapshot del VPS/VM y acceso a consola del proveedor.
- Fase 1 – acceso y red:
firewall,ssh[d]config,journalctl,postfix. Verifica conectividad y logs. - Fase 2 – kernel/fstab/PAM:
disablenet,disablefs,disablemod(con whitelist USB si procede),fstab,password/logindefs,limitsconf,sudo/cron. - Fase 3 – auditoría:
aide(base + timer),rkhunter. - Fase 4 – limpieza:
package_remove,restrictcompilers,aptget_clean. - 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
- konstruktoid/hardening – Hardening Ubuntu. Systemd edition (lista de funciones, orden y parámetros).
https://github.com/konstruktoid/hardening
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.