Saltar al contenido

Fundamentos de seguridad

¿Qué es Supabase? La base de datos que eligió tu builder

Qué es Supabase: la base de datos, el login y el almacenamiento de archivos de tu app. Supabase lleva los servidores; las reglas sobre tus filas son tuyas.

Vlad Tkachenko8 min de lectura
Un maletín rígido con la tapa al lado y cuatro huecos de formas distintas: tres cerrados con correa y uno abierto en ámbar.

En resumen

  • ¿Qué es Supabase? Es donde tu app guarda todo lo que tiene que recordar: tus usuarios y sus contraseñas, las filas detrás de cada lista y los archivos que sube la gente.
  • Tu builder casi con seguridad lo eligió por ti mientras creaba el proyecto, y por eso nadie te explicó nunca qué hay dentro.
  • Supabase lleva las máquinas. Las reglas sobre quién puede leer qué filas son tuyas, y en una tabla creada con SQL empiezan apagadas.

Tu app funciona. En algún punto de sus ajustes, en un correo sobre una factura o en mitad de un mensaje de Lovable, está la palabra Supabase. Antes o después tienes que averiguar qué es, y el motivo rara vez es la curiosidad: un escaneo mencionó tu proyecto de Supabase, un desarrollador preguntó en qué plan estás, o tu app dejó de guardar cosas y la respuesta está ahí dentro.

Entonces: qué es Supabase. Las demás explicaciones responden a eso como una elección entre herramientas, que es la pregunta que se hace un desarrollador antes de empezar un proyecto. Tú nunca hiciste esa elección. La hizo tu builder en los segundos que tardó en crear el proyecto, y por eso nadie te acompañó nunca por la cosa que ahora guarda todos los datos de tus usuarios.

Esta es la versión para alguien que ya tiene uno.

¿Qué es Supabase, en una frase?

Es donde tu app guarda todo lo que tiene que recordar.

Tus usuarios y sus contraseñas. Las filas detrás de cada lista que muestra tu app. Las imágenes y documentos que sube la gente. Cuando alguien se registra a las dos de la mañana, ese registro aterriza en tu proyecto de Supabase y sigue ahí después de que se cierre la pestaña del navegador.

Debajo está Postgres, una base de datos en uso en producción desde los años noventa que no te va a dar sorpresas. Lo que añade Supabase es todo lo de alrededor: un sistema de login, un sitio para archivos y una forma de que tu app pida datos directamente desde el navegador sin que tú escribas un servidor.

Ahí, en lo último, empiezan tus propias decisiones.

Las cuatro piezas que tienes de verdad

Cuatro, y tu app probablemente está usando al menos dos.

  • La base de datos. Tablas de filas: tus usuarios, tus pedidos, tus publicaciones. La parte que la gente quiere decir cuando dice "Supabase".
  • Auth. Registrarse, iniciar sesión, restablecer una contraseña. Si tu app tiene cuentas, viven aquí.
  • Storage. Archivos subidos, en buckets con nombre. Fotos de perfil, adjuntos, exportaciones.
  • Edge functions. Trozos pequeños de código que corren en los servidores de Supabase en vez de en el navegador de tu visitante. Puede que tu app no tenga ninguna, y aun así hay un buen motivo para fijarse en ellas, más abajo.

Tu panel lista más de esas cuatro. Deja el resto en paz hasta que lo que estés construyendo lo necesite.

Cuatro servicios bajo un mismo proyecto. Tu app llega a los cuatro con la misma dirección de proyecto, y por eso esa dirección está en la página.

¿De qué se ocupa Supabase y qué es cosa mía?

Supabase se ocupa de las máquinas. Tú te ocupas de las reglas.

La línea está más arriba de lo que supone casi todo el mundo. Piensa en el proyecto como un local que alquilas. El casero mantiene el edificio, la electricidad y la puerta de la calle. Lo que guardas dentro, y a quién dejas entrar, nunca fue cosa suya.

Lo que lleva SupabaseLo que es tuyo
Los servidores, la versión de Postgres y las actualizacionesQué filas puede leer cada visitante
Backups diarios de tu base de datos en los planes de pago, guardados una semanaSi existe una copia en algún sitio al que tu propio proyecto no llegue
Cifrar tus datos en sus discos y de camino a tu appQuién tiene tus claves y cuál de ellas está en tu app
Que el sistema de login siga funcionandoQué archivos de un bucket puede listar cualquiera

Nada de la columna izquierda falla en silencio: si Supabase tiene una caída, te enteras por tus usuarios en cuestión de minutos. La columna derecha es donde las cosas salen mal sin ruido alguno, porque no se rompe nada. Tu app sigue funcionando exactamente igual que ayer.

Todo lo que está por encima de la línea discontinua lo decides tú, y nada de eso rompe tu app cuando está mal.

¿Mis datos de Supabase son privados por defecto?

Depende de cómo se creó cada tabla, y la forma en que las crea un builder es la que las deja abiertas.

La documentación de Supabase es directa al respecto. Dice que el Table Editor activa Row Level Security por ti cuando creas una tabla en el Dashboard, y que cuando creas una tabla con SQL la activas tú. Row Level Security es el ajuste por tabla que decide qué filas puede leer un visitante. Tu builder escribe SQL, así que una tabla que creó tu builder llega con ese ajuste apagado.

La frase siguiente de la misma página dice qué deja eso: una tabla del esquema public es alcanzable a través de la Data API, y mientras no actives Row Level Security y escribas una política, cualquiera que tenga la clave publishable de tu proyecto puede leer y escribir todas sus filas. Esa clave está en tu app, donde le corresponde, y cualquiera puede leerla de la página.

Así que lo que hay que ir a mirar es la cerradura de cada tabla, y va por tabla en vez de por proyecto. Cómo activarla y qué es una política es el paso a paso. También contamos cuántas veces falta: 2.096 de las 3.680 apps cuya base de datos Supabase nos respondió tenían al menos una tabla entregando sus filas a un desconocido.

Si prefieres verlo desde fuera en vez de repasar una lista de tablas, nuestro escaneo gratuito le hace a tu proyecto la pregunta que le haría el navegador de un desconocido y te enseña qué contestó. Tarda unos 20 segundos y no necesita cuenta: escanea tu app gratis.

Dónde están tus claves y cuál es pública

Tu página de ajustes de API tiene valores de dos clases, y solo una de las dos pertenece a tu app.

Una clave que empieza por sb_publishable_, llamada anon en un proyecto más antiguo, está pensada para ser pública y por sí sola no hace más que decir a qué proyecto pertenece una petición. Una clave que empieza por sb_secret_, llamada service_role en un proyecto más antiguo, pasa de largo por delante de todas las reglas que pongas. Supabase lo dice sin rodeos: una clave secreta se salta Row Level Security, así que hay que mantenerla en el servidor. Ese es también el buen motivo para fijarse en las edge functions, porque una function es donde puede ocurrir el trabajo que necesita una clave secreta sin que la clave se acerque a un navegador.

Dónde está esa página y qué hace cada valor cubre las ubicaciones, y qué claves son seguras en el frontend cubre cómo distinguir dos claves casi idénticas.

Cómo seguir siendo tuyo después de publicar

Lo que encuentres hoy describe la app de hoy. La siguiente tabla que añada tu builder llega con el mismo ajuste por defecto que la anterior, y nadie te manda un mensaje al respecto.

Reeve Monitor vuelve a hacer las preguntas de este artículo, de forma programada:

  • las nueve comprobaciones cada hora, en hasta tres apps
  • si la app está en pie, cada 60 segundos
  • un mensaje cuando un resultado cambia, para que una tabla que se abrió anoche te llegue antes que a un desconocido
  • un informe mensual de lo que vio

Reeve Care además guarda una copia de tu base de datos Supabase. Esa es la segunda línea de la columna derecha de arriba, hecha por ti.

  • una copia cifrada de tu base de datos Supabase cada noche, guardada donde tu proyecto no llega
  • cada copia se verifica antes de contar, contando las filas de cada tabla
  • una restauración con un clic cuando la necesites
  • también tus archivos subidos, en cuanto conectes una credencial de Storage
  • todo lo que hace Monitor

Una tabla que un desconocido puede leer es algo que encuentra una comprobación. Una migración que corrió al revés, o un agente con acceso a tu base de datos, vacía la tabla en su lugar, y así se ve eso desde dentro.

Qué revisar una vez, hoy

Qué hacer

  • Entra en Supabase y abre tu propio proyecto. La cuenta es tuya aunque la creara tu builder, y en el panel está cada una de las respuestas de abajo.
  • Lee la cerradura de cada tabla en Authentication → Policies. Una tabla con Row Level Security desactivada entrega sus filas a cualquiera que tenga la clave que ya está en tu app, y una política que se lo permite todo a todos cuenta como desactivada.
  • Abre Settings → API Keys y averigua cuáles de tus valores son publishable y cuáles secret. Si alguna secreta ha estado alguna vez en tu app, cámbiala en Supabase antes de quitarla del código.
  • Mira tus buckets de storage. Un bucket marcado como público le lista todos sus archivos a cualquiera que pregunte, incluidos los que tu app no enseña nunca.
  • Guarda una copia de la base de datos en un sitio al que tu proyecto no llegue, porque nada de la lista de arriba devuelve una tabla borrada.

Empieza por las cerraduras de las tablas, porque es lo único de esta lista que un desconocido puede estar usando ya. Si prefieres trabajarlo todo como una lista, la checklist de seguridad en 10 minutos cubre eso y los demás ajustes que conviene leer en una app recién publicada. ¿Es seguro Supabase? se ocupa de la otra pregunta con la que llega la gente, que es si todo esto fue buena idea.

Preguntas frecuentes

¿Qué es Supabase en palabras sencillas?

Es donde tu app guarda todo lo que tiene que recordar, en servidores que mantiene otra persona. Tus usuarios y sus contraseñas, las filas detrás de cada lista que muestra tu app y los archivos que sube la gente viven todos en tu proyecto de Supabase. Está construido sobre Postgres, una base de datos en uso en producción desde los años noventa, con un sistema de login, almacenamiento de archivos y una forma de que tu app pida datos directamente desde el navegador añadidos alrededor.

¿Supabase es una base de datos?

Contiene una, y es más que una. La base de datos es Postgres y es la parte que la gente quiere decir cuando dice Supabase. A su alrededor hay otros tres servicios que tu app puede estar usando: Auth para iniciar sesión, Storage para los archivos subidos y Edge Functions para código que corre en servidores de Supabase en vez de en el navegador de tu visitante. Tu panel lista más de esos cuatro, y puedes dejar el resto en paz hasta que algo lo necesite.

¿Eligió Supabase por mí el builder de mi app?

Casi con seguridad, sí. Lovable, Bolt, v0, Cursor, Replit y Windsurf recurren todos a un Postgres alojado en cuanto tu app necesita recordar algo, y Supabase es la respuesta habitual. Puede que pulsaras un botón que decía conectar una base de datos, o puede que tu builder creara el proyecto sin preguntar. En cualquier caso la cuenta es tuya y puedes entrar en ella, que es lo primero que conviene hacer.

¿Qué partes de la seguridad de Supabase son cosa mía?

Supabase lleva los servidores, la versión de Postgres, las actualizaciones, el cifrado en sus discos y el propio sistema de login. Tuyas son las reglas: qué filas puede leer cada visitante, qué archivos de un bucket son públicos, quién tiene tus claves y cuál de ellas está en tu app, y si existe una copia de tus datos en algún sitio al que tu proyecto no llegue. Nada de la primera lista falla en silencio. Todo lo de la segunda puede estar mal durante meses mientras tu app funciona perfectamente.

¿Mis datos de Supabase son privados por defecto?

Depende de cómo se creó cada tabla. La documentación de Supabase dice que el Table Editor activa Row Level Security por ti cuando creas una tabla en el Dashboard, y que cuando creas una tabla con SQL la activas tú. Un builder escribe SQL, así que las tablas que creó por ti llegan con ese ajuste apagado. Mientras siga apagado y no haya una política escrita, Supabase dice que cualquiera que tenga tu clave publishable puede leer y escribir todas las filas de esa tabla, y esa clave está en tu app, donde cualquiera puede leerla.

Escrito por

Vlad Tkachenko

Fundador de Reeve

Me paso el día mirando apps creadas con Lovable, Bolt, v0, Cursor y Replit, y la corta lista de errores que aparecen en ellas una y otra vez.

Más sobre el autor

Sigue leyendo

Todos los artículos

Haz una copia de tu base de datos de Supabase antes del próximo cambio

Reeve la guarda cifrada con regularidad y la restaura por ti si algo falla.

Ver copias de Supabase

Comprobación externa automatizada, no una auditoría completa. La ausencia de hallazgos no es garantía de seguridad.