En un servicio multiusuario hay dos formas de sostener muchas cuentas: un proceso compartido, donde todas las sesiones conviven en la misma memoria y los mismos permisos, o un sistema por cuenta. En Echidna elegimos la segunda. Esta nota explica qué significa, por qué lo hicimos y qué límites tiene.
El problema de compartir proceso
Cuando veinte personas usan el mismo proceso, comparten memoria, permisos y superficie de ataque. Un error de deserialización, una ruta mal validada o un archivo mal borrado puede alcanzar datos de otra cuenta. No es un riesgo teórico: es la familia de fallos más común en servicios multiusuario, y la que más caro se paga.
La decisión
Cada cuenta corre en su propia celda: un contenedor con su sistema de archivos, sus procesos y su puerto interno. Ese puerto no se publica al mundo; solo existe en la dirección local del servidor, uno por celda. El servidor de acceso autentica a la persona, inyecta su identidad en la petición y habla con la celda por ese puerto local. Ninguna otra cuenta puede llegar ahí: no hay ruta de red que lo permita.
El aislamiento se sostiene con tres capas independientes:
- Puerto local. La celda solo escucha en la dirección local del anfitrión, con un puerto exclusivo por cuenta.
- Confianza restringida. El servicio interno de la celda solo acepta peticiones que vienen del proxy local y de su propia puerta de red. Cualquier otra petición se rechaza.
- Cortafuegos. Una regla descarta el tráfico que sale de los contenedores hacia los puertos de gestión del servidor (administración, web y acceso). Aunque una celda quedara comprometida, no alcanza la administración de la máquina.
La búsqueda web sale por otro camino: un túnel privado hacia un servidor separado que ejecuta el motor de búsqueda. Las celdas no hablan con internet para buscar; hablan con el túnel.
Ciclo de vida de una celda
- Aprovisionamiento: 60 a 90 segundos la primera vez que se prepara.
- Suspensión: tras unos 30 minutos de inactividad la celda se suspende, no se destruye; despierta cuando la persona vuelve.
- Límite: 1 GB de memoria por celda, con cuota de uso por cuenta.
- Densidad: una máquina de 32 GB sostiene entre 20 y 25 celdas activas con margen.
Por qué no compartimos proceso
Sería más barato. Veinte celdas ocupan la memoria de veinte procesos aislados; con un proceso compartido cabrían cientos de usuarios por máquina. Pagamos ese costo a cambio de radio de daño: un fallo en una celda es un fallo de una cuenta, y el reinicio de una celda no toca a las demás. Para un producto que promete privacidad, esa es la dirección correcta.
Qué no prometemos
El aislamiento es a nivel de contenedor, no de máquina virtual dedicada por persona. Es más fuerte que un proceso compartido y más débil que un servidor exclusivo; lo decimos tal cual. La defensa es en capas porque ninguna capa por sí sola basta.
Verificación
Cada aprovisionamiento termina con una comprobación de salud de la celda; si la comprobación falla, el espacio no se entrega. Las pruebas de la plataforma cubren provisión, suspensión, despertar y purga, y la operación diaria vigila el estado de cada celda desde afuera. La página de Estado del sitio muestra la comprobación en vivo de las piezas públicas.

