Spaces:
Sleeping
Sleeping
feat(security): habilita RLS en tablas publicas de supabase
Browse filesHabilita RLS en las tablas public.events y public.vegetation_indices para prevenir la exposicion publica de datos a traves de PostgREST. Se omitio public.spatial_ref_sys debido a restricciones de propiedad de PostGIS.
supabase/migrations/0007_enable_rls.sql
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
-- =====================================================================================
|
| 2 |
+
-- AgroVisión — Políticas RLS (Fase 14): Seguridad en tablas públicas sin RLS.
|
| 3 |
+
-- Resuelve las alertas críticas de Supabase Linter (rls_disabled_in_public, sensitive_columns_exposed)
|
| 4 |
+
-- para las tablas de la aplicación.
|
| 5 |
+
--
|
| 6 |
+
-- NOTA: No es posible habilitar RLS en public.spatial_ref_sys debido a restricciones de
|
| 7 |
+
-- privilegios (es propiedad de 'supabase_admin').
|
| 8 |
+
--
|
| 9 |
+
-- Conexión directa por DATABASE_URL (rol 'postgres') evade RLS.
|
| 10 |
+
-- Estas políticas aseguran que el acceso mediante la API REST de Supabase (PostgREST)
|
| 11 |
+
-- con la clave 'anon' o 'authenticated' esté protegido.
|
| 12 |
+
-- =====================================================================================
|
| 13 |
+
|
| 14 |
+
-- 1. Habilitar RLS en las tablas del dominio
|
| 15 |
+
ALTER TABLE public.events ENABLE ROW LEVEL SECURITY;
|
| 16 |
+
ALTER TABLE public.vegetation_indices ENABLE ROW LEVEL SECURITY;
|
| 17 |
+
|
| 18 |
+
-- 2. Políticas para vegetation_indices
|
| 19 |
+
-- Aislamiento por usuario a nivel de fila (propietario de la parcela).
|
| 20 |
+
-- Como vegetation_indices no tiene column user_id directa, validamos contra la parcela asociada en 'fields'.
|
| 21 |
+
DROP POLICY IF EXISTS vegetation_indices_owner ON public.vegetation_indices;
|
| 22 |
+
CREATE POLICY vegetation_indices_owner ON public.vegetation_indices
|
| 23 |
+
FOR ALL USING (
|
| 24 |
+
EXISTS (
|
| 25 |
+
SELECT 1 FROM public.fields f
|
| 26 |
+
WHERE f.id = vegetation_indices.field_id
|
| 27 |
+
AND f.user_id = auth.uid()
|
| 28 |
+
)
|
| 29 |
+
) WITH CHECK (
|
| 30 |
+
EXISTS (
|
| 31 |
+
SELECT 1 FROM public.fields f
|
| 32 |
+
WHERE f.id = vegetation_indices.field_id
|
| 33 |
+
AND f.user_id = auth.uid()
|
| 34 |
+
)
|
| 35 |
+
);
|
| 36 |
+
|
| 37 |
+
-- 3. Políticas para events (Telemetría de UI)
|
| 38 |
+
-- Dado que la persistencia de eventos se realiza exclusivamente a través del backend
|
| 39 |
+
-- y no directamente por la API de cliente de Supabase (PostgREST), por seguridad
|
| 40 |
+
-- no definimos ninguna política de lectura/escritura pública (anon/authenticated).
|
| 41 |
+
-- Esto bloquea por completo el acceso API externo a esta tabla (evitando la exposición de session_id).
|