← Blog

Qué entiende PrintStash por una red de confianza

Un repaso a la autenticación de PrintStash, los roles de colección, los enlaces compartidos, la importación y los límites de su modelo de seguridad.

seguridadautoalojadodesarrollo

PrintStash está pensado para una casa, un taller o un equipo pequeño en una red que controlas tú. No está diseñado como un servicio multiinquilino hostil donde clientes sin relación entre sí comparten una instalación.

Esa frontera importa. La autenticación y los controles de acceso siguen protegiendo la biblioteca, pero no convierten un servidor de aficionado en una plataforma pública endurecida. Si el servicio es accesible desde internet, ponlo detrás de TLS, usa secretos fuertes y mantén al día el host y el proxy.

Cuentas, tokens y claves de API

El asistente de primer arranque crea la cuenta de administración inicial, y está protegido por un token de configuración para que el endpoint de creación de cuentas no quede abierto a quien llegue antes al puerto. Con VAULT_SETUP_TOKEN sin definir, la API genera uno por proceso y lo escribe en el log mientras la bóveda está sin configurar.

Las sesiones normales usan tokens JWT de acceso y de refresco firmados. VAULT_JWT_SECRET firma esos tokens, y el valor de relleno que viene en .env.example y en los archivos de Compose es público, así que la API nunca firma con él: en el primer arranque genera un secreto real y lo guarda en su propia base de datos. Definir la variable tú mismo es para cuando quieres ser dueño de ese valor. El archivo de Compose de producción va más allá y se niega a arrancar si no lo defines, con el argumento de que un host que estás exponiendo a propósito no debería estar funcionando con un secreto que nunca elegiste.

La automatización usa claves de API con nombre. Un script envía su nombre de usuario y su clave de API al endpoint de inicio de sesión y recibe un JWT para las peticiones siguientes. La clave en bruto no se usa directamente como token Bearer. Crea las claves en una cuenta sin privilegios de administración cuando el trabajo no los necesite, y revoca las claves que ya no se usen.

Los permisos de colección tienen niveles de vista, edición y administración. Se comprueban en la API, no solo escondiendo controles en el frontend. Las acciones y los cambios administrativos quedan registrados en el log de auditoría.

Enlaces compartidos públicos

Un token de compartición concede acceso de lectura a un modelo. Los enlaces caducan, se pueden revocar y son de solo lectura salvo que se habiliten las descargas de archivos al crear el enlace. También puedes limitar qué revisiones de G-code aparecen.

En la base de datos solo se guarda el hash del token. Los endpoints públicos vuelven a comprobar que cada archivo solicitado pertenece al modelo compartido, devuelven la misma respuesta de no encontrado para tokens inválidos, caducados y revocados, y aplican límites de peticiones por IP.

El token sigue siendo una credencial al portador. Cualquiera que reciba la URL puede usarla hasta que caduque o se revoque, así que fija una duración acorde al trabajo y evita publicar el enlace en un canal público.

Los archivos y las URL importadas no son de confiar

Una LAN de confianza no vuelve seguros los archivos descargados. PrintStash aplica límites y comprobaciones de rutas mientras importa:

  • Las descargas por URL bloquean direcciones de loopback, privadas, link-local y de metadatos para reducir el riesgo de SSRF.
  • Los dominios de tiendas admitidos se comparan de forma exacta y no por un sufijo laxo.
  • La extracción de ZIP rechaza el recorrido a directorios superiores y limita la expansión del archivo.
  • Los lectores de G-code y BGCODE limitan longitudes y lecturas para que unos metadatos malformados no puedan pedir memoria sin límite.
  • El trabajo de vista previa de mallas está limitado por el tamaño del archivo, el número de triángulos, la RAM disponible y la concurrencia de renderizado.

Estas comprobaciones reducen los modos de fallo habituales. No son una promesa de que cada dependencia de lectura esté libre de vulnerabilidades. Mantén las copias de seguridad y actualiza los contenedores cuando se publiquen correcciones.

Los secretos no están cifrados en reposo

Las credenciales de impresora, los tokens de notificación, las URL de webhook y configuraciones similares se guardan en la base de datos. No están protegidos frente a una persona con administración que pueda leer la base de datos o restaurar una copia de seguridad. La documentación de notificaciones lo dice de forma explícita.

Trata las copias de seguridad como datos sensibles. Limita el acceso al host de Docker y al bucket de copias, y no añadas como administradores de la instalación a usuarios en los que no confíes.

Qué no cubre el modelo

PrintStash no ofrece cifrado de extremo a extremo para los archivos de modelo almacenados. No protege los datos frente a una administración hostil del host. Sus roles de colección no sustituyen al aislamiento entre inquilinos que no se conocen, y no gestiona certificados TLS por su cuenta.

Para una instalación autoalojada normal, usa el archivo de Compose de producción, mantén el contenedor de la API en privado y expón solo el frontend a través de un proxy inverso mantenido. La guía de proxy inverso tiene ejemplos funcionando con Caddy, Traefik y nginx.