---
title: "El “hardener” de Ubuntu que está ganando adeptos: así funciona el script de konstruktoid para blindar sistemas systemd de arriba abajo"
description: "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..."
url: https://revistacloud.com/hardener-ubuntu/
date: 2025-11-06
modified: 2025-11-06
author: "Antonio"
image: https://revistacloud.com/wp-content/uploads/2023/10/ciberseguridad-revistacloud.jpg
categories: ["Guías y recursos", "Seguridad"]
tags: ["hardener", "linux", "Ubuntu"]
type: post
lang: es
---

# 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 chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes256-ctr`; `KexAlgorithms curve25519-sha256@libssh.org,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

- **konstruktoid/hardening – Hardening Ubuntu. Systemd edition.** (lista de funciones, orden y ajustes específicos).[https://github.com/konstruktoid/hardening](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.
