alexp97 commited on
Commit
cdc15a4
·
1 Parent(s): 630f5ff

feat(security): habilita RLS en tablas publicas de supabase

Browse files

Habilita 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).