Rimasun Docs

Seguridad

Rimasun está pensado para que el navegador y la app nunca vean un secreto. Estas son las reglas y los controles que trae el SDK.

1. Los secretos se quedan en su servidor

DatoDónde puede estarDónde nunca
Secreto de llave rs_…Variables de entorno o gestor de secretos de su servidorNavegador, app, repositorio, registros, correos
Secreto de webhooks whs_…Su servidorIgual que arriba
Token de salaEl navegador o la app de esa persona, durante la llamadaURL de su sitio, registros, almacenamiento persistente
  • Restrinja cada llave a las IP de sus servidores y póngale vencimiento. Use una llave por entorno (producción, pruebas).
  • Rote las llaves periódicamente y ante cualquier sospecha (Mi cuenta → Llaves → Rotar). Todo queda en la auditoría.
  • Su servidor debe autorizar antes de pedir el token: que la persona haya iniciado sesión en su sistema y que le corresponda esa sala (p. ej. solo el médico y el paciente de la cita 250).
  • Use nombres de sala que no revelen datos personales (cita-250, no juan-perez-vih) e identidades opacas.
  • ttl_min corto: lo justo para entrar a la llamada (el token solo se usa al conectar).

2. Todo cifrado en tránsito

El SDK solo se conecta al servidor de medios por wss://. Acepta ws:// únicamente hacia localhost, *.local, IP de red privada o con permitirInseguro: true (solo pruebas). La API se usa por https con verificación de certificado (no desactive CURLOPT_SSL_VERIFYPEER ni equivalentes). Audio y video viajan además cifrados con DTLS-SRTP entre cada equipo y el servidor.

3. Lo que hace el SDK por usted

  • Valida la credencial: formato del token, vencimiento (expira) y que la sala del token sea la esperada.
  • No escribe el token en la consola ni en los registros; el motor queda en nivel warning.
  • Pide cámara y micrófono solo al conectar y los apaga al colgar o al salir de la página.
  • Carga el motor con versión fijada e integridad SRI.
  • Funciona con una CSP estricta (sin unsafe-inline).

El informe completo de la revisión (OWASP ASVS nivel 2 y MASVS) está en docs/SEGURIDAD-SDK.md del repositorio.

4. CSP recomendada

Para la página que muestra la llamada (ajuste los dominios):

Content-Security-Policy:
  default-src 'self';
  script-src 'self';
  style-src 'self';
  connect-src 'self' wss://medios.su-rimasun.com https://medios.su-rimasun.com;
  media-src 'self' blob:;
  img-src 'self' data: blob:;
  worker-src 'self' blob:;
  frame-ancestors 'self';
Permissions-Policy: camera=(self), microphone=(self), display-capture=(self)

El SDK usa hojas de estilo construidas, que la CSP no bloquea. En navegadores antiguos recurre a un <style> con el nonce del <script> del SDK: si usa nonces, póngaselo (<script src="rimasun.js" nonce="…">).

5. Integridad del script (SRI)

<script src="/rimasun/rimasun.js"
        integrity="sha384-v7YIM4AQxHFw+TZD/h0Oulo/IQgI03vqyEGAwk6pdZus60mFJiZVZr1UrWySirke"
        crossorigin="anonymous"></script>

Ese hash es el de rimasun.js 1.1.0. El motor (livekit-client.umd.js 2.22.3) lo verifica el propio SDK con sha384-G/xxtkVytOx/ia9Q8MXxM+V0ohsaY1fZAgVP3iSGTPz4wJ0s3+ulJNKXh/gnzEDZ. Para calcular el de otro archivo:

echo "sha384-$(openssl dgst -sha384 -binary rimasun.js | openssl base64 -A)"

Si sirve los archivos desde otro dominio, ese dominio debe responder con Access-Control-Allow-Origin.

6. Cifrado de extremo a extremo (opcional)

Con E2EE, el audio y el video se cifran en el equipo de cada persona con una clave que Rimasun no conoce: ni el servidor de medios puede verlos.

  1. Su servidor genera una clave aleatoria por llamada (32 bytes en base64, mínimo 16 caracteres):
    crypto.randomBytes(32).toString("base64")           // Node
    base64_encode(random_bytes(32))                     // PHP
    secrets.token_urlsafe(32)                           # Python
  2. La entrega a los participantes de esa sala, junto con su token, por su propio canal autenticado (nunca a Rimasun).
  3. Todos la pasan al SDK:
    Rimasun.pantalla({ credencial: c, cifrado: { clave: claveDeLaCita } });          // web
    RimasunPantallaLlamada(credencial: c, claveCifrado: claveDeLaCita);              // Flutter

La pantalla muestra «Cifrada» y avisa si alguien entra con otra clave: sin la clave correcta el audio y el video no se pueden ver. En web, el paquete trae livekit-client.e2ee.worker.js (déjelo junto al SDK). Como los workers no admiten SRI, el SDK lo descarga, compara su SHA-384 con el fijado en el SDK y lo arranca desde un blob: (por eso la CSP lleva worker-src 'self' blob:). Si lo sirve desde otra ruta, pase cifrado.worker y cifrado.workerIntegridad.

Con E2EE no funcionan las funciones que requieren que el servidor vea los medios (p. ej. una futura grabación en el servidor).

7. Verificar los paquetes descargados

Cada paquete de Descargas trae su SHA-256 y una firma Ed25519; manifiesto.json va firmado también. Verifíquelos con esta llave pública, publicada aquí y no dentro de los paquetes:

(cargando firma_paquetes.pub.pem…)

Huella SHA-256 de la llave: — · descargar la llave

node verificar_paquete.js rimasun-sdk-js-1.1.0.zip manifiesto.json firma_paquetes.pub.pem
# OK: rimasun-sdk-js-1.1.0.zip es auténtico y está íntegro.

verificar_paquete.js viene en Descargas y en el paquete de ejemplos de servidor. Revisa tamaño, SHA-256, firma del zip y firma del manifiesto.

openssl pkeyutl -verify -pubin -inkey firma_paquetes.pub.pem -rawin \
  -in rimasun-sdk-js-1.1.0.zip -sigfile rimasun-sdk-js-1.1.0.zip.sig
# Signature Verified Successfully
sha256sum -c rimasun-sdk-js-1.1.0.zip.sha256                          # Linux
shasum -a 256 -c rimasun-sdk-js-1.1.0.zip.sha256                      # macOS
Get-FileHash rimasun-sdk-js-1.1.0.zip -Algorithm SHA256               # Windows PowerShell

El SHA-256 solo prueba que el archivo llegó completo; la firma prueba que lo publicó Rimasun.

Si la verificación falla, no use el paquete y avísenos.

8. Reportar una vulnerabilidad

Escríbanos desde Mi cuenta → Soporte con los pasos para reproducirla. No la publique hasta que esté corregida.

Rimasun · documentación en español · cambios por versión