La mayoría de las brechas de seguridad web contemporáneas no se originan en vulnerabilidades criptográficas complejas, sino en la fragilidad de las capas de ejecución dinámica: plugins de CMS desactualizados, deserialización insegura en backends dinámicos, inyecciones SQL y permisos de proceso sobredimensionados.
En esta nota presentamos el modelo arquitectónico determinista detrás de valmis.net, diseñado para reducir la superficie de ataque a cero mediante la inmutabilidad del contenido estático servido por demonios UNIX nativos.
1. Diagrama de Flujo Arquitectónico
El pipeline separa estrictamente la fase de autoría/compilación en el entorno local de desarrollo de la fase de servido estático en el host de borde OpenBSD:
+-------------------------------------------------------------------------------+
| FASE 1: AUTORÍA & COMPILACIÓN (LOCAL) |
+-------------------------------------------------------------------------------+
| +---------------------+ +--------------------+ +-------------+ |
| | Markdown en VIM | ---> | Go SSG Builder | ---> | Salida | |
| | (content/posts/*.md)| | (goldmark parser) | | public/*.html|
| +---------------------+ +--------------------+ +-------------+ |
+-------------------------------------------------------------------------------+
|
| Sincronización Segura (rsync / SSH)
v
+-------------------------------------------------------------------------------+
| FASE 2: BORDE DE SERVIDO ESTÁTICO (OpenBSD) |
+-------------------------------------------------------------------------------+
| |
| [ WAN / Tráfico Público HTTPS:443 ] |
| | |
| v |
| +---------------------------+ |
| | PF (Packet Filter) | |
| | - Stateful inspection | |
| | - Rate-limit synproxy | |
| +---------------------------+ |
| | |
| v |
| +---------------------------+ |
| | OpenBSD httpd(8) | <--- Chroot en /var/www |
| | (Native Web Server) | <--- pledge("stdio rpath inet") |
| +---------------------------+ <--- unveil("/htdocs/valmis.net", "r") |
| | |
| v |
| +---------------------------+ |
| | /htdocs/valmis.net/ | (Archivos HTML5, CSS puro e imágenes) |
| +---------------------------+ |
| |
+-------------------------------------------------------------------------------+
2. Matriz de Mitigación de Vectores de Ataque
Al reemplazar los stacks dinámicos (PHP, Node.js, Python WSGI) por páginas pre-renderizadas servidas directamente por httpd(8), se eliminan clases enteras de vulnerabilidades:
| Vector de Ataque | Stack Dinámico Tradicional | Arquitectura Estática valmis.net |
|---|---|---|
| SQL Injection (SQLi) | Riesgo alto (dependencia de RDBMS) | Inexistente (Cero bases de datos) |
| Remote Code Execution (RCE) | Posible mediante deserialización o plugins | Inexistente (Cero intérpretes en runtime) |
| Cross-Site Scripting (XSS) | Requiere sanitización continua de inputs | Neutralizado (CSP: script-src 'none') |
| Privilege Escalation | Procesos web con acceso a shell/archivos | Mitigado por chroot + pledge(2) + unveil(2) |
| Ataques de Denegación (DoS) | Consultas dinámicas pesadas saturan CPU | Resistente (PF synproxy + archivos estáticos en RAM) |
3. Mecanismos de Aislamiento del Kernel OpenBSD
El demonio httpd(8) opera bajo un sandbox multicapa garantizado directamente por el kernel del sistema operativo:
chroot(2) en /var/www
El proceso no tiene visibilidad de /etc, /root, /usr ni de ningún binario del sistema base. Su raíz se encuentra confinada estrictamente a /var/www.
pledge(2): “stdio rpath inet”
Una vez que el servidor web se inicializa y abre sus sockets de escucha, renuncia a todas las llamadas al sistema excepto a las mínimas indispensables para leer archivos y responder peticiones de red.
unveil(2): Restricción del Sistema de Archivos
Incluso dentro del chroot, httpd solo puede acceder en modo lectura ("r") al directorio /htdocs/valmis.net. Cualquier intento de lectura fuera de esa ruta retorna instantáneamente ENOENT o EACCES.
4. Métricas de Rendimiento y Latencia
Al no haber consultas a bases de datos ni procesamiento de plantillas en tiempo de petición, la latencia queda limitada únicamente por el tiempo de propagación física de la red:
Benchmark: 10,000 peticiones concurrentes a valmis.net
--------------------------------------------------------------
Time taken for tests: 0.312 seconds
Complete requests: 10,000
Failed requests: 0
Requests per second: 32,051.28 [#/sec] (mean)
Time per request: 0.031 [ms] (mean, across all concurrent requests)
HTML Transfer size: ~5.4 KB (HTML5 optimizado)
Conclusión
La verdadera resiliencia no proviene de agregar sistemas de detección de intrusos sobre código defectuoso, sino de diseñar arquitecturas con superficie de ataque intrínsecamente nula.