Endurecimiento
El endurecimiento se aplica en ficheros de texto del overlay del build. Para auditarlo basta con
leerlos o compararlos con un diff. Esta página resume cada uno.
Línea de arranque del kernel
Todas las entradas de GRUB llevan estos parámetros (los añade build.sh a config/grub.cfg):
| Parámetro | Efecto |
|---|---|
lockdown=confidentiality | Ni siquiera root puede leer la memoria del kernel ni cargar código sin firmar en él. |
init_on_alloc=1 | La memoria se pone a cero al reservarla. |
init_on_free=1 | La memoria se pone a cero al liberarla: menos datos que recuperar en un ataque cold boot. |
slab_nomerge | No mezcla cachés del asignador del kernel, lo que dificulta explotar desbordamientos. |
page_alloc.shuffle=1 | Reparte de forma aleatoria las páginas libres. |
randomize_kstack_offset=on | Desplazamiento aleatorio de la pila del kernel en cada llamada al sistema. |
pti=on | Aislamiento de las tablas de páginas del kernel (Meltdown). |
mitigations=auto,nosmt | Mitigaciones de CPU activas y SMT (hyper-threading) desactivado si es necesario. |
vsyscall=none | Quita la antigua página vsyscall, de dirección fija. |
debugfs=off | Sin debugfs. |
apparmor=1 security=apparmor | Activa AppArmor como módulo de seguridad. |
ipv6.disable=1 | IPv6 desactivado por completo. |
sysctl
Fichero: /etc/sysctl.d/99-redderos-hardening.conf.
Kernel
| Clave | Valor | Efecto |
|---|---|---|
kernel.kptr_restrict | 2 | Oculta las direcciones del kernel, también a root. |
kernel.dmesg_restrict | 1 | Solo root lee el log del kernel. |
kernel.printk | 3 3 3 3 | Solo errores graves en la consola. |
kernel.unprivileged_bpf_disabled | 1 | BPF solo para root. |
net.core.bpf_jit_harden | 2 | Endurece el compilador JIT de BPF. |
kernel.kexec_load_disabled | 1 | No se puede cargar otro kernel en caliente. |
kernel.yama.ptrace_scope | 2 | Solo root puede depurar otros procesos. |
kernel.perf_event_paranoid | 3 | Sin perf para usuarios normales. |
kernel.sysrq | 0 | Teclas mágicas SysRq desactivadas. |
kernel.core_pattern | |/bin/false | Ningún volcado de memoria llega a escribirse. |
kernel.unprivileged_userns_clone | 0 | Sin espacios de nombres de usuario para usuarios normales. |
dev.tty.ldisc_autoload | 0 | No carga disciplinas de línea bajo demanda. |
vm.unprivileged_userfaultfd | 0 | userfaultfd solo para root. |
vm.swappiness | 0 | No usar swap (además, no hay ninguna). |
Sistema de ficheros
| Clave | Valor | Efecto |
|---|---|---|
fs.protected_symlinks | 1 | Protege contra trampas con enlaces simbólicos en /tmp. |
fs.protected_hardlinks | 1 | Ídem con enlaces duros. |
fs.protected_fifos | 2 | Ídem con FIFOs. |
fs.protected_regular | 2 | Ídem con ficheros normales. |
fs.suid_dumpable | 0 | Los programas setuid no generan volcados. |
Red
| Clave | Valor | Efecto |
|---|---|---|
net.ipv4.tcp_syncookies | 1 | Resiste inundaciones SYN. |
net.ipv4.tcp_rfc1337 | 1 | Protección TIME-WAIT (RFC 1337). |
net.ipv4.tcp_timestamps | 0 | Sin marcas de tiempo TCP, que delatan el reloj. |
net.ipv4.conf.*.rp_filter | 1 | Descarta paquetes con origen falsificado. |
net.ipv4.conf.*.accept_redirects | 0 | Ignora redirecciones ICMP. |
net.ipv4.conf.all.secure_redirects | 0 | Ídem, también las «seguras». |
net.ipv4.conf.all.send_redirects | 0 | No envía redirecciones. |
net.ipv4.conf.all.accept_source_route | 0 | Ignora el enrutamiento de origen. |
net.ipv4.icmp_echo_ignore_all | 1 | No responde a ping. |
net.ipv4.ip_forward | 0 | No reenvía tráfico. |
El autotest comprueba que cada clave tiene el valor esperado (las que no existen en el kernel en uso se omiten y se indica).
Módulos bloqueados
Fichero: /etc/modprobe.d/redderos-blacklist.conf. Cada módulo se sustituye por /bin/false, así
que no se puede cargar ni a mano.
| Grupo | Módulos |
|---|---|
| Protocolos de red poco usados | dccp, sctp, rds, tipc, n-hdlc, ax25, netrom, x25, rose, decnet, econet, af_802154, ipx, appletalk, psnap, p8022 |
| Sistemas de ficheros poco usados | cramfs, freevxfs, jffs2, hfs, hfsplus, udf |
| DMA externo y periféricos inalámbricos | firewire-core, thunderbolt, bluetooth, btusb |
La cámara (uvcvideo) tiene una línea preparada pero comentada: descoméntala en el build para
desactivarla por completo.
AppArmor
Debian y Ubuntu no cargan perfiles de AppArmor en sistemas live. RedderOS anula esa condición
(/etc/systemd/system/apparmor.service.d/redderos-live.conf) y carga los perfiles de
apparmor-profiles.
Amnesia: systemd y límites
| Fichero | Efecto |
|---|---|
systemd/journald.conf.d/redderos.conf | Logs solo en la RAM (máximo 32 MB), sin reenviar a syslog. |
systemd/coredump.conf.d/redderos.conf | Sin volcados de memoria. |
systemd/system.conf.d/redderos.conf | DefaultLimitCORE=0 para todo lo que arranca systemd. |
security/limits.d/redderos.conf | Límite de volcados a 0 para todos los usuarios. |
systemd/logind.conf.d/redderos.conf | Al cerrar sesión no queda vivo ningún proceso del usuario. |
Además, el build enmascara los temporizadores de apt, motd-news, e2scrub y fstrim, y
desactiva los scripts del sistema live que activan la swap del disco del equipo, los informes de
fallos (apport) y pollinate.
Usuarios y privilegios
rootestá bloqueado: no se puede iniciar sesión con él.anon, el usuario de la sesión amnésica, no tiene contraseña nisudo. Solo la entrada Administrador temporal le dasudo, y únicamente durante esa sesión.- La única excepción es
redder-wipe: cualquier usuario puede ejecutarlo como root sin contraseña y sin argumentos (/etc/sudoers.d/redderos-wipe). Solo borra la RAM y apaga. - Los usuarios de perfil se crean en la RAM al abrir el perfil y se borran al cerrarlo.
umask 077: los ficheros nuevos solo los puede leer su dueño.
Sin administrador, un programa comprometido que se ejecute como anon no puede llegar a root ni
modificar el cortafuegos.
Integridad de la ISO
El build genera md5sum.txt y sha256sum.txt con la suma de cada fichero de la imagen, y un
.sha256 de la ISO completa. La firma GPG de la ISO está pendiente.