02 dic 2025·8 min de lectura

Escaneo de virus para subidas de archivos: opciones de arquitectura para apps

Explicación del escaneo de virus para subidas de archivos en apps con muchos documentos: almacenamiento en cuarentena, colas de escaneo, control de acceso, reintentos y flujos seguros de liberación.

Escaneo de virus para subidas de archivos: opciones de arquitectura para apps

El problema en términos sencillos: archivos no seguros entrando en tu app

Si tu app permite que personas suban documentos, estás aceptando archivos que no creaste. En productos con muchos documentos (portales de clientes, sistemas de RR. HH., apps de reclamaciones, onboarding de proveedores), las subidas son frecuentes y los usuarios a menudo comparten archivos extraídos de hilos de email, unidades compartidas o terceros. Eso convierte a estas apps en un objetivo práctico: una subida exitosa puede propagarse a muchas descargas.

Los riesgos no son solo “un virus”. Un archivo Word o Excel puede contener macros maliciosas, un PDF puede estar diseñado para explotar fallos del lector, y una “factura” puede ser un documento de phishing que engaña a alguien para que llame a un número falso o introduzca credenciales. Algunos archivos están envenenados de formas más silenciosas, como ocultar una carga en un ZIP, usar extensiones dobles (report.pdf.exe) o incrustar contenido remoto que “hace ping” al abrirse.

Confiar en un antivirus simple instalado en un solo servidor no es suficiente. Las subidas pueden llegar a múltiples instancias de la app, moverse entre sistemas de almacenamiento o servirse desde object storage o un CDN. Si cualquier ruta de código expone accidentalmente la subida en bruto, los usuarios pueden descargarla antes de que termine el escaneo. Actualizaciones, malas configuraciones y accesos administrativos “temporales” también pueden saltarse el escaneo con el tiempo.

El objetivo claro para el escaneo de virus para subidas de archivos es simple: ningún archivo no escaneado debería ser descargable o visible por nadie que no esté explícitamente autorizado a revisar contenido en cuarentena.

Define qué significa “seguro” como una regla de negocio, no como una sensación. Por ejemplo:

  • Debe pasar el escaneo de malware con una firma actualizada
  • Debe coincidir con tipos de archivo y límites de tamaño permitidos
  • Debe almacenarse y servirse solo desde ubicaciones aprobadas
  • Debe tener una pista de auditoría: quién subió, cuándo y estado final
  • Debe estar bloqueado hasta una decisión final: liberar o rechazar

Si construyes con una plataforma como AppMaster, trata el “estado de escaneo” como un campo de primera clase en tu modelo de datos y haz que cada acción de descarga lo verifique. Esa compuerta previene muchos errores costosos.

Qué significa realmente cuarentena para documentos subidos

Una “cuarentena” es mejor entenderla como un estado en tu sistema, no solo una carpeta en el almacenamiento. La idea clave es simple: el archivo existe, pero nadie puede abrirlo o descargarlo hasta que tu app tenga un resultado de escaneo claro y registrado. Esto es el corazón del escaneo de virus para subidas de archivos.

La cuarentena suele funcionar como un pequeño ciclo de vida con estados claros. Mantener el estado explícito hace más difícil filtrar contenido inseguro por una vista previa, una URL directa o un trabajo de exportación.

Un conjunto práctico de estados de archivo podría verse así:

  • received (subida completada, aún no escaneada)
  • scanning (tomada por un worker)
  • clean (segura para liberar)
  • rejected (malware encontrado o violación de política)
  • failed (error del escáner, timeout o archivo corrupto)

La cuarentena también necesita los metadatos adecuados para que puedas aplicar controles de acceso y auditar lo que pasó después. Como mínimo, almacena: el propietario (usuario u organización), estado, nombre y tipo de archivo original, checksum (para deduplicación y verificación de manipulación), ubicación de almacenamiento y marcas de tiempo (subida, inicio de escaneo, fin de escaneo). Muchos equipos también guardan la versión del escáner y los detalles del veredicto.

La retención es una decisión de política, pero debe ser intencional. Conserva los archivos en cuarentena solo el tiempo necesario para escanearlos y depurar fallos. Una retención corta reduce riesgo y coste, pero aún quieres tiempo suficiente para investigar incidentes y responder a usuarios que preguntan “¿dónde fue mi subida?”.

Finalmente, decide qué hacer con los archivos que nunca terminan de escanear. Establece un tiempo máximo de escaneo y una marca de “expiración”. Cuando venza el plazo, mueve el archivo a failed, bloquea el acceso y reintenta automáticamente un número limitado de veces o elimínalo y pide al usuario que vuelva a subir.

Patrones de almacenamiento temporal que reducen el riesgo

El almacenamiento temporal es donde ocurren la mayoría de los problemas de subida. El archivo está en tu sistema, pero aún no sabes si es seguro, así que necesitas un lugar fácil de bloquear y difícil de exponer por accidente.

El disco local puede servir para un solo servidor, pero es frágil. Si escalas a múltiples servidores de la app, tendrás que compartir almacenamiento, copiar archivos y mantener permisos consistentes. El object storage (como un bucket estilo S3 o un contenedor en la nube) suele ser más seguro para apps con muchos documentos porque las reglas de acceso están centralizadas y los logs son más claros.

Un patrón simple para el escaneo de virus para subidas de archivos es separar el almacenamiento de “cuarentena” del de “limpio”. Puedes hacer esto con dos buckets/contenedores, lo que reduce errores, o con un prefijo estricto dentro de un solo bucket, que puede ser más barato y fácil de gestionar.

Si usas prefijos, hazlos imposibles de confundir. Prefiere un esquema como quarantine/<tenant_id>/<upload_id> y clean/<tenant_id>/<document_id>, no nombres provistos por el usuario. Nunca reutilices la misma ruta para diferentes estados.

Ten en cuenta estas reglas:

  • No permitas lecturas públicas sobre la cuarentena, ni siquiera “temporalmente”.
  • Genera nombres de objetos del lado servidor, no nombres del cliente.
  • Particiona por tenant o cuenta para reducir el radio de impacto.
  • Almacena metadatos (propietario, estado, checksum) en tu base de datos, no en el nombre del archivo.

Encripta en reposo y sé estricto sobre quién puede desencriptar. La API de subida debe poder escribir en cuarentena, el escáner debe poder leer de cuarentena y escribir en limpio, y la app pública solo debe leer desde limpio. Si tu nube soporta políticas de claves, ata los derechos de desencriptado al conjunto más pequeño posible de roles.

Los archivos grandes necesitan cuidado extra. Para subidas multipart, no marques el objeto como “listo” hasta que la parte final se haya comprometido y hayas registrado el tamaño esperado y el checksum. Un enfoque seguro común es subir las partes a cuarentena y luego copiar o promocionar el objeto a limpio solo después de que el escaneo pase.

Ejemplo: en un portal de clientes construido con AppMaster, puedes tratar cada subida como “pending”, almacenarla en un bucket de cuarentena y solo mostrar el botón de descarga después de que el estado de escaneo cambie a “clean”.

Opciones de arquitectura: escaneo inline vs escaneo en background

Cuando añades escaneo de virus para subidas de archivos, normalmente eliges entre dos flujos: escanear inline (el usuario espera) o escanear en background (la app acepta la subida pero bloquea el acceso hasta que se limpie). La elección correcta depende menos del “nivel de seguridad” (ambas pueden ser seguras) y más de la velocidad, la fiabilidad y la frecuencia de subidas.

Opción 1: Escaneo inline (el usuario espera)

El escaneo inline significa que la petición de subida no finaliza hasta que el escáner devuelve un resultado. Se percibe simple porque solo hay un paso: subir, escanear, aceptar o rechazar.

El escaneo inline suele ser aceptable cuando los archivos son pequeños, las subidas son poco frecuentes y puedes mantener el tiempo de espera predecible. Por ejemplo, una herramienta de equipo donde los usuarios suben unos pocos PDFs al día podría tolerar una pausa de 3 a 10 segundos. El inconveniente es que un escaneo lento convierte la app en lenta. Timeouts, reintentos y redes móviles pueden empeorar la experiencia incluso para archivos limpios.

Opción 2: Escaneo en background (asíncrono)

El escaneo asíncrono almacena primero el archivo, lo marca como “en cuarentena” y coloca un trabajo en una cola de escaneo. El usuario recibe una respuesta rápida de “subida recibida”, pero no puede descargar o previsualizar el archivo hasta que esté limpio.

Este enfoque es mejor para volúmenes altos, archivos grandes y horas pico porque distribuye el trabajo y mantiene tu app responsiva. También permite escalar los workers de escaneo por separado de tus servidores web o API.

Un híbrido práctico es: ejecutar comprobaciones rápidas inline (lista blanca de tipos, límites de tamaño, validación básica de formato) y luego hacer el escaneo antivirus completo en background. Esto atrapa problemas obvios temprano sin hacer esperar a todos los usuarios.

Aquí tienes una guía simple para elegir:

  • Archivos pequeños, bajo volumen, flujos que requieren “saber ya”: escaneo inline
  • Archivos grandes, muchas subidas o tiempo de escaneo impredecible: escaneo en background
  • SLAs estrictos para la capacidad de respuesta en subidas: escaneo en background + UI de estado clara
  • Cargas mixtas: híbrido (chequeos rápidos primero, escaneo completo asíncrono)

Si construyes con AppMaster, esta elección suele mapearse bien a un endpoint API síncrono (inline) o a un Business Process que encola trabajo de escaneo y actualiza el estado del archivo cuando llegan los resultados.

Paso a paso: construir una cola de escaneo asíncrona

Configura un flujo de escaneo asíncrono
Usa un proceso en segundo plano para escanear, registrar resultados y liberar archivos solo cuando estén limpios.
Construir ahora

El escaneo asíncrono significa aceptar una subida, bloquearla en cuarentena y escanearla en background. Los usuarios no obtienen acceso hasta que el escáner diga que es seguro. Esto suele ser la arquitectura de escaneo de malware más práctica para apps con muchos documentos.

1) Define el mensaje de la cola (mantenlo pequeño)

Trata la cola como una lista de tareas. Cada subida crea un mensaje que apunta al archivo, no el archivo en sí.

Un mensaje simple suele incluir:

  • File ID (o object key) y tenant o project ID
  • ID del usuario que subió
  • Marca de tiempo de subida y un checksum (opcional pero útil)
  • Número de intento (o un contador de reintentos separado)

Evita poner bytes en crudo en la cola. Los payloads grandes pueden romper límites, costar más y aumentar la exposición.

2) Construye el flujo del worker (fetch, scan, record)

Un worker toma un mensaje, descarga el archivo desde el almacenamiento de cuarentena, lo escanea y luego escribe una decisión.

Un flujo claro es:

  • Recuperar el archivo por ID desde el almacenamiento de cuarentena (bucket privado o volumen privado)
  • Ejecutar el escáner (motor AV o servicio de escaneo)
  • Escribir el resultado en tu base de datos: estado (clean, infected, error), nombre/versión del escáner y timestamps
  • Si está clean: mover el archivo al almacenamiento aprobado o cambiar una bandera de acceso para que sea descargable
  • Si está infectado: mantenerlo en cuarentena (o eliminarlo) y notificar a las personas adecuadas

3) Hazlo idempotente (seguro para reprocesar)

Los workers se caerán, los mensajes se entregarán dos veces y habrá reintentos. Diseña para que escanear el mismo archivo dos veces no cause daños. Usa una única fuente de verdad como files.status y permite solo transiciones válidas, por ejemplo: uploaded -> scanning -> clean/infected/error. Si un worker ve clean, debe parar y reconocer el mensaje.

4) Controla la concurrencia (evita tormentas de escaneo)

Fija límites por worker y por tenant. Limita cuántos escaneos pueden ejecutarse a la vez y considera colas separadas para archivos grandes. Esto evita que un cliente muy activo consuma toda la capacidad del escáner.

5) Maneja fallos con reintentos y una pista de auditoría

Usa reintentos para errores temporales (timeout del escáner, problema de red) con un número máximo pequeño de intentos. Después, envía el mensaje a una dead-letter queue para revisión manual.

Mantén una pista de auditoría: quién subió el documento, cuándo entró en cuarentena, qué escáner corrió, qué decidió y quién aprobó o borró el archivo. Ese registro es tan importante como el propio escaneo de virus para subidas, especialmente en portales de clientes y para cumplimiento.

Control de acceso: mantener los archivos en cuarentena realmente privados

La cuarentena no es solo un estado en tu base de datos. Es una promesa de que nadie puede abrir el archivo hasta que esté probado como seguro. La regla más segura es sencilla: nunca sirvas archivos en cuarentena mediante URLs públicas, ni siquiera las “temporales”.

Un buen flujo de descarga es aburrido y estricto. La app debe tratar cada descarga como una acción protegida, no como la obtención de una imagen.

  1. Solicitar una descarga
  2. Verificar el permiso del usuario sobre ese archivo específico
  3. Verificar el estado del archivo (quarantine, clean, rejected)
  4. Entregar el archivo solo si el estado es clean

Si usas URLs firmadas, mantiene la misma idea: généralas solo después de comprobar permisos y estado, y hazlas de corta duración. Una expiración corta reduce el daño si el enlace se filtra por logs, capturas de pantalla o un email reenviado.

El acceso basado en roles te ayuda a evitar lógicas de “caso especial” que se convierten en agujeros. Roles típicos para apps con muchos documentos son:

  • Uploader: puede ver sus propias subidas y su estado de escaneo
  • Reviewer: puede ver archivos limpios y, a veces, ver archivos en cuarentena solo en una herramienta de revisión segura
  • Admin: puede investigar, re-escanear y anular accesos cuando sea necesario
  • Usuario externo: solo puede acceder a documentos compartidos explícitamente con él

También protege contra adivinación de IDs. No expongas IDs incrementales como 12345. Usa IDs opacos y siempre autoriza por usuario y por archivo (no solo “cualquier usuario autenticado”). Incluso si tu bucket de almacenamiento es privado, un endpoint de API descuidado puede filtrar contenido en cuarentena.

Cuando construyas escaneo de virus para subidas de archivos, la capa de acceso es donde ocurren la mayoría de las fallas en el mundo real. En una plataforma como AppMaster, aplicarías estas comprobaciones en tus endpoints API y en la lógica de negocio antes de generar cualquier respuesta de descarga, para que la cuarentena sea privada por defecto.

Liberar, rechazar y reintentar: manejar los resultados del escaneo

Planifica fallos del escáner
Gestiona reintentos, timeouts y escaneos atascados con estados claros y alertas.
Construir flujo

Una vez que un archivo termina de escanearse, lo más importante es moverlo a un estado claro y hacer el siguiente paso predecible. Si estás construyendo escaneo de virus para subidas de archivos, trata el resultado del escaneo como una compuerta: nada será descargable hasta que la compuerta lo permita.

Un conjunto simple de resultados cubre la mayoría de los sistemas reales:

  • Clean: liberar el archivo de la cuarentena y permitir el acceso normal.
  • Infected: bloquear el acceso permanentemente y activar tu flujo para archivos infectados.
  • Unsupported: el escáner no puede evaluar este tipo (o está protegido por contraseña). Mantenerlo bloqueado.
  • Scan error: fallo temporal (timeout, servicio no disponible). Mantenerlo bloqueado.

La comunicación al usuario debe ser clara y serena. Evita mensajes alarmistas como “Tu cuenta está comprometida.” Una mejor aproximación es: “El archivo está siendo comprobado. Puedes seguir trabajando.” Si el archivo está bloqueado, indica qué puede hacer el usuario: “Sube otro tipo de archivo” o “Inténtalo más tarde.” Para archivos no soportados, sé específico (por ejemplo, “Los archivos comprimidos encriptados no pueden escanearse”).

Para archivos infectados, decide desde el principio si los borras o los conservas. Borrar es más sencillo y reduce el riesgo. Conservar puede ayudar en auditorías, pero solo si lo guardas en un área aislada con acceso estricto y una retención corta, y registras quién puede verlo (idealmente, nadie excepto administradores de seguridad).

Los reintentos son útiles, pero solo para errores temporales. Establece una política de reintentos pequeña para no crear una cola infinita:

  • Reintentar en timeouts y caídas del servicio de escaneo.
  • No reintentar en “infected” o “unsupported”.
  • Limitar reintentos (por ejemplo, 3) y luego marcar como failed.
  • Añadir backoff entre intentos para evitar sobrecarga.

Finalmente, trata los fallos repetidos como un problema de operaciones, no del usuario. Si muchos archivos llegan a “scan error” en poco tiempo, alerta al equipo y pausa nuevas liberaciones. En AppMaster, puedes modelar estos estados en la base de datos y enrutar notificaciones mediante módulos integrados para que las personas correctas reciban alertas rápidamente.

Escenario de ejemplo: un portal de clientes con muchos documentos

Haz del estado de escaneo algo prioritario
Crea una tabla de estado de archivos y comprobaciones de permisos en un solo lugar.
Comenzar a construir

Un portal de clientes permite a clientes subir facturas y contratos por proyecto. Es un caso común donde el escaneo de virus para subidas importa, porque los usuarios arrastrarán lo que tengan en su escritorio, incluidos archivos reenviados por otros.

Cuando un cliente sube un PDF, el portal lo guarda en una ubicación temporal y privada y crea un registro en la base de datos con el estado Pending scan. El archivo no se muestra como descargable todavía. Un worker de escaneo toma el archivo de una cola, ejecuta el escaneo y luego actualiza el registro a Clean o Blocked.

En la interfaz, el cliente ve el documento aparecer de inmediato, pero con una insignia clara de Pending. El nombre y el tamaño del archivo son visibles para que sepan que la subida funcionó, pero el botón de Descargar está deshabilitado hasta que el escaneo quede limpio. Si el escaneo tarda más de lo esperado, el portal puede mostrar un mensaje simple como “Estamos comprobando este archivo por seguridad. Intenta de nuevo en un minuto.”

Si el escáner marca un documento, el cliente ve Blocked con una nota breve y no técnica: “Este archivo no pasó una comprobación de seguridad.” Soporte y administradores obtienen una vista separada que incluye la razón del escaneo y las siguientes acciones. Ellos pueden:

  • mantenerlo bloqueado y pedir una nueva subida
  • eliminarlo y registrar el motivo
  • marcarlo como falso positivo solo si la política lo permite

En disputas (“Lo subí ayer y lo perdiste”), los buenos logs importan. Guarda timestamps para subida recibida, escaneo iniciado, escaneo finalizado, cambio de estado y quién hizo qué. También almacena el hash del archivo, nombre original, cuenta del que subió, dirección IP y el código de resultado del escáner. Si construyes esto en AppMaster, el Data Designer más un Business Process simple pueden gestionar estos estados y campos de auditoría sin exponer archivos en cuarentena a usuarios regulares.

Errores comunes que causan fallos reales de seguridad

La mayoría de las fallas en seguridad de subidas no son hacks sofisticados. Son decisiones pequeñas de diseño que permiten que un archivo inseguro se comporte como un documento normal.

Un problema clásico es una carrera: la app acepta una subida, devuelve una URL de descarga y el usuario (o otro servicio) puede obtener el archivo antes de que termine el escaneo. Si haces escaneo de virus para subidas de archivos, trata “subido” y “disponible” como dos estados diferentes.

Estos son errores que aparecen una y otra vez:

  • Mezclar archivos limpios y en cuarentena en el mismo bucket/carpeta y luego confiar en reglas de nombres. Un permiso o path mal puesto y la cuarentena no sirve de nada.
  • Confiar en extensiones de archivo, tipo MIME o comprobaciones del lado cliente. Los atacantes pueden renombrar cualquier cosa a .pdf y la UI lo aceptará.
  • No planear la caída del escáner. Si el escáner es lento u offline, los archivos pueden quedar en “pending” para siempre y los equipos empiezan a aplicar overrides manuales inseguros.
  • Permitir que los workers en background se salten las mismas reglas de autorización que la API principal. Un worker que puede leer “cualquier archivo” es una escalada silenciosa de privilegios.
  • Publicar IDs fáciles de adivinar (como números incrementales) para elementos en cuarentena, incluso si piensas que el contenido está protegido.

Las pruebas son otra brecha. Los equipos prueban con algunos archivos pequeños y limpios y dan por concluido el trabajo. También debes probar subidas grandes, archivos corruptos y documentos protegidos por contraseña, porque son exactamente donde fallan o hacen timeout los escáneres y parsers.

Un ejemplo real sencillo: un usuario sube “contract.pdf” que en realidad es un ejecutable renombrado dentro de un archivo. Si tu portal lo sirve instantáneamente, o si tu equipo de soporte puede acceder a la cuarentena sin los controles adecuados, has creado una vía directa para entregar ese archivo a otros usuarios.

Lista de verificación rápida antes del lanzamiento

Separa cuarentena de limpio
Diseña almacenamiento privado de cuarentena y rutas de almacenamiento limpio por tenant.
Empezar

Antes de lanzar el escaneo de virus para subidas de archivos, haz una pasada final por los lugares donde los equipos suelen asumir “está bien” y luego descubren que no lo estaba. El objetivo es simple: un archivo inseguro nunca debe volverse legible solo porque alguien adivinó una URL, reintentó una petición o usó un link cacheado viejo.

Comienza con el flujo de usuario. Cualquier acción de descarga, previsualización o “abrir archivo” debe volver a comprobar el estado de escaneo actual en el momento de la petición, no solo en el momento de la subida. Esto te protege de condiciones de carrera (alguien hace clic inmediatamente), resultados de escaneo retrasados y casos límite donde un archivo se reescanea.

Usa esta checklist previa al envío como mínimo:

  • El almacenamiento de cuarentena es privado por defecto: no hay acceso público al bucket, no “cualquiera con el enlace” y no servir directamente desde storage bruto.
  • Cada registro de archivo tiene un propietario (usuario, equipo o tenant) más un estado de ciclo de vida claro como pending, clean, infected o failed.
  • Tu cola de escaneo y workers tienen reintentos acotados, reglas claras de backoff y alertas cuando items se quedan atascados o fallan repetidamente.
  • Existen logs de auditoría para subidas, resultados de escaneo y intentos de descarga (incluidos intentos bloqueados), con quién, cuándo y por qué.
  • Existe un override manual para casos raros, pero es solo para administradores, queda registrado y es por tiempo limitado (no hay un botón silencioso de “marcar como limpio”).

Finalmente, asegúrate de poder observar el sistema de extremo a extremo. Debes poder responder: “¿Cuántos archivos están pendientes de escaneo ahora?” y “¿Qué tenants están viendo fallos?” Si construyes sobre AppMaster, modela el ciclo de vida del archivo en el Data Designer y aplica las comprobaciones de estado en el Business Process Editor para que las reglas se mantengan consistentes en web y móvil.

Próximos pasos: convertir el diseño en una app funcional

Empieza escribiendo los estados exactos que pueden tener tus archivos y qué permite cada estado. Mantenlo simple y explícito: “uploaded”, “queued”, “scanning”, “clean”, “infected”, “scan_failed”. Luego añade reglas de acceso junto a cada uno. ¿Quién puede ver el archivo, descargarlo o eliminarlo mientras sigue sin confiarse?

A continuación, elige el enfoque que coincida con tu volumen y objetivos de experiencia de usuario. El escaneo inline es más fácil de explicar, pero puede hacer que las subidas sean lentas. El escaneo asíncrono escala mejor para apps con muchos documentos, pero añade estado, colas y UI de “pending”.

Una forma práctica de pasar del diseño a la construcción es prototipar el flujo completo de extremo a extremo usando documentos realistas (PDFs, archivos Office, imágenes, archivos comprimidos) y comportamientos realistas de usuarios (múltiples subidas, cancelaciones, reintentos). No te quedes en “el escáner funciona”. Valida que la app nunca sirva un archivo en cuarentena, ni siquiera por accidente.

Aquí tienes un plan de construcción simple que puedes ejecutar en una semana:

  • Define estados de archivo, transiciones y reglas de acceso en una página
  • Elige escaneo inline, asíncrono o híbrido y documenta los trade-offs
  • Implementa subida -> almacenamiento en cuarentena -> job de escaneo -> callback de resultado, con logs de auditoría
  • Construye los estados de UI que verán los usuarios (pending, blocked, failed, approved)
  • Añade monitorización desde el día uno: tamaño de backlog, tasa de fallos y tiempo hasta clean

Si trabajas sin código, AppMaster puede ayudarte a modelar metadatos de archivos (estado, propietario, checksum, timestamps), crear pantallas de subida y revisión, y orquestar el flujo de escaneo con lógica de negocio y procesamiento tipo cola. Eso te permite probar el flujo real del producto pronto y luego endurecer las partes que importan: permisos, separación de almacenamiento y reintentos fiables.

Finalmente, decide qué significa “bueno” en números. Establece umbrales de alerta antes del lanzamiento para notar escaneos atascados y fallos crecientes antes que los usuarios.

Fácil de empezar
Crea algo sorprendente

Experimente con AppMaster con plan gratuito.
Cuando esté listo, puede elegir la suscripción adecuada.

Empieza