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_ADMINhacia$SSH_PORT(variable del script), activa logging y fijaIPT_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: desactivarusb-storageimpide 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: fijaCrashShell=no,DumpCore=noy límites conservadores de ficheros y procesos (por defecto,DefaultLimitNOFILE=1024,DefaultLimitNPROC=1024,DefaultLimitCORE=0) tanto en elsystem.confglobal como enuser.conf.resolvedconf: configurasystemd-resolvedcon 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=locka los 15 minutos,KillUserProcesses=1,RemoveIPC=yes, excluyendo aroot.journalctl: hace persistente el journal (Storage=persistent), comprime y reenvía a syslog. Si el fichero de rsyslog es escribible, fija$FileCreateMode 0600para proteger permisos.
4) Tiempo y ficheros: timesyncd y fstab con opciones seguras
timesyncd: define servidores NTP (hasta cuatro con < 50 ms de latencia) yRootDistanceMaxSec=1.fstab: añade o ajusta montajes connosuid,nodev,noexecdonde aplica:/booty/homeconnosuid,nodevsi existen./var/log,/var/log/audity/var/tmpconnosuid,nodev,noexecsi existen.- Monta
/run/shmy/dev/shmcomotmpfsrw,noexec,nosuid,nodev. - Monta
/procconnosuid,nodev,noexec,relatime,hidepid=2(los usuarios solo ven sus propios procesos), una medida clásica de hardening. - Sustituye
/tmpen fstab y activatmp.mountde systemd para usartmpfs.
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.allowy/etc/hosts.deny(TCP Wrappers): permitesshd : ALL : ALLOW,ALL: LOCAL, 127.0.0.1y deniega el resto (ALL: ALL).issue: escribe avisos de uso autorizado en/etc/issue,/etc/issue.nety/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: restringesua miembros del gruposudoconpam_wheely fija opciones comouse_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.adduseryuseradd: refuerzan modos y shell por defecto:DIR_MODE=0750,DSHELL=/bin/false,INACTIVE=30.password: instala y copia/etc/security/pwquality.confpara política de contraseñas, y eliminanullokde 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 hayInclude; si no, en elsshd_configprincipal). 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 VERBOSEyBanner /etc/issue.net. - Higiene:
StrictModes yes,UseDNS no,UsePAM yes,IgnoreUserKnownHosts yes,PermitUserEnvironment no.
- Cifrado/KEX/MACs:
9) Logging y auditoría: journal, rsyslog, AIDE, rkhunter
- Ya citado journal, el script también ajusta
/etc/rsyslog.confsi 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 coninet_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.pathyumask: fijaumask 077y 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: deshabilitaatdy solo permitecron/ata root.rhosts: borrahosts.equivy cualquier.rhosts.rootaccess: restringe acceso con/etc/security/access.confy/etc/securetty.
14) Limpieza y comprobación final
aptget_noexec: añade hooksPre-Invoke/Post-Invokea APT para que no fallen actualizaciones en sistemas con/tmpmontado comonoexec.aptget_clean: clean/autoremove.systemddeltaypost: 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 atmpfsgestionado por systemd y añade los hooks de APT para que no mueradpkgpornoexec. - USB: bloquea
usb-storagepero instala USBGuard para permitir dispositivos autorizados si hace falta. - SSH: mueve hardening a
/etc/ssh/sshd_config.d/si hayInclude, 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
- konstruktoid/hardening – Hardening Ubuntu. Systemd edition. (lista de funciones, orden y ajustes específicos).
https://github.com/konstruktoid/hardening
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.