← Volver al blog
Operaciones #security

El modelo de seguridad de StreamHub: tokens, JWT, RBAC

Cuatro planos de autenticación, control de acceso basado en roles con Casbin, y una capa de red de listas de IP permitidas/bloqueadas y auto-baneo. Cómo StreamHub controla cada petición.

2 min de lectura
Read in English

Cuatro planos de autenticación

StreamHub separa las credenciales por propósito, así una filtrada queda contenida:

  • Tokens de API sk_ — tokens bearer para la API REST, globales o acotados a una app. Es lo que usan tus servidores y scripts.
  • Login JWT del panel — los operadores humanos inician sesión y obtienen un JWT, con 2FA (TOTP) y gestión de sesiones. Existe un ADMIN_USER / ADMIN_PASS de emergencia para el primer arranque.
  • Play-token público — un token estrecho y anónimo que solo permite mirar una sala específica, usado por las páginas públicas /play y /embed.
  • Token de ingesta de plugin — un token por arranque de worker para que el worker de un plugin empuje datos de overlay en vivo sin tocar el plano Bearer.

RBAC con Casbin

Sobre la autenticación se apoya la autorización. Cada ruta declara el permiso Casbin que necesita — un par recurso:accion como ingress:create o recording:start. Los roles agrupan permisos; los tenants y apps los acotan. Un token de API global o un superadmin saltea el acotamiento por tenant; todos los demás quedan confinados a lo que su rol y tenant permiten.

La aplicación es por fases para adoptarla con seguridad, controlada por una variable de entorno:

STREAMHUB_AUTHZ_ENFORCE=off   # sin chequeos
STREAMHUB_AUTHZ_ENFORCE=log   # permite, pero loguea cada denegación
STREAMHUB_AUTHZ_ENFORCE=on    # aplica (las instalaciones frescas arrancan acá)

Corré log en staging para ver exactamente qué se denegaría antes de activar la aplicación en producción.

La capa de red va adelante

Antes incluso de correr la autenticación, un módulo de seguridad de red separado aplica listas de IP permitidas/bloqueadas y auto-baneo como middleware global. Podés:

  • permitir solo rangos conocidos de oficina/CDN,
  • bloquear direcciones abusivas específicas,
  • dejar que fallos de auth repetidos disparen un baneo automático y acotado en el tiempo.

Como corre primero, una dirección en la lista de bloqueo nunca llega a las capas de auth o RBAC — rechazo temprano y barato del ruido.

En capas por diseño

Los planos se componen: una petición desde una IP bloqueada muere en la capa de red; una petición con un token inválido muere en la autenticación; un token válido sin el rol correcto muere en RBAC. Cada capa es estrecha, y cada fallo se loguea y se cuenta en la métrica streamhub_errors_total.