← Volver a Publicaciones

Arquitectura de Borde Determinista: Diagramas de Aislamiento y Mínimo Privilegio

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.