La sicurezza a livello di riga (RLS) è un controllo degli accessi al database che limita quali righe di una tabella un utente può leggere o modificare in base alla propria identità, al ruolo o al contesto della sessione.
Invece di limitare l'accesso a intere tabelle o a colonne specifiche, la RLS filtra i dati riga per riga. Il motore del database applica il filtro automaticamente al momento della query, quindi la stessa regola vale indipendentemente dallo strumento utilizzato dall'utente per accedere ai dati.
La RLS fa parte del controllo degli accessi granulare, insieme a:
Ad esempio, un addetto alle vendite può eseguire una query sulla tabella degli ordini dell'azienda ma visualizzare solo gli ordini per la regione assegnata, anche se la tabella contiene i dati di tutte le regioni. L'utente scrive una normale istruzione SELECT e il motore restituisce solo le righe che è autorizzato a vedere.
La RLS è oggi un elemento fondamentale per il SaaS multi-tenant, la segregazione dei dati regionali e i casi d'uso di conformità. Questo articolo spiega come funziona la RLS, dove è utile, quali sono i suoi limiti e come funziona sulla piattaforma Databricks.
La sicurezza a livello di riga funziona applicando a una tabella una regola di filtro, spesso chiamata policy o predicato. Quando un utente esegue una query, il motore del database applica automaticamente tale filtro e restituisce solo le righe che l'utente è autorizzato a visualizzare.
In pratica, la RLS funziona solitamente in tre passaggi:
CURRENT_USER, una variabile di sessione impostata dall'applicazione o una tabella di mappatura che collega utenti e gruppi ai dati consentiti.TRUE per le righe che l'utente può visualizzare e FALSE per tutto il resto. Vengono restituite solo le righe che superano il predicato.Poiché l'applicazione avviene a livello di database, la stessa regola si applica in modo coerente a ogni percorso di acesso, inclusi dashboard BI, notebook, SQL ad-hoc, API e strumenti di terze parti. Questa coerenza è ciò che rende potente la RLS: una sola regola, applicata ovunque, imposta dal motore.
La maggior parte dei motori distingue anche tra applicazione lato lettura e lato scrittura. Un predicato di lettura controlla ciò che restituisce una query SELECT. Un predicato di scrittura, spesso definito separatamente con una clausola WITH CHECK, controlla quali righe un utente può inserire, aggiornare o eliminare.
I due predicati possono essere uguali, ma non devono necessariamente esserlo. Ad esempio, a un utente potrebbe essere consentito di leggere le righe di tutte le regioni ma di inserire solo le righe della propria regione. Definire entrambi i lati è importante quando una tabella accetta scritture, perché saltare il controllo di scrittura è uno dei modi più comuni in cui i team configurano in modo errato la RLS in produzione.
La RLS è uno dei diversi controlli degli accessi granulari e in produzione è quasi sempre abbinata ad altri. La tabella seguente mostra come si inserisce ciascun controllo.
| Controllo | Cosa limita | Caso d'uso tipico |
|---|---|---|
| Sicurezza a livello di riga (RLS) | Righe specifiche in una tabella | Limitare gli utenti alla propria regione, tenant o reparto |
| Sicurezza a livello di colonna (CLS) | Colonne specifiche in una tabella | Nascondere agli analisti le colonne relative a stipendio, SSN o PII |
| Sicurezza a livello di oggetto (OLS) | Intere tabelle, viste o misure | Bloccare completamente l'accesso a un dataset sensibile |
| Mascheramento dei dati | Valori visibili all'interno di una colonna | Mostrare solo le ultime 4 cifre del numero di una carta |
| GRANT / REVOKE | Autorizzazioni di lettura/scrittura a livello di tabella | Consentire o negare l'accesso alla tabella nel suo complesso |
Questi controlli sono progettati per essere stratificati. Una configurazione tipica utilizza autorizzazioni a livello di tabella per controllare chi può accedere a una tabella, la RLS per definire quali righe sono visibili e la sicurezza a livello di colonna o il mascheramento dei dati per proteggere i campi sensibili all'interno di tali righe. Considerarli come uno stack piuttosto che come un menu di alternative rende la governance sia verificabile che resiliente. Una configurazione errata in un livello non compromette gli altri.
La RLS è il modo standard per imporre chi può vedere cosa all'interno di una tabella condivisa, filtrando le righe in base agli attributi di un utente rispetto a una colonna chiave come regione, tenant o classificazione. La maggior parte dei team vi ricorre quando un singolo dataset deve servire più destinatari con regole di visibilità diverse.
Il modello generale è coerente tra le varie piattaforme, con l'inserimento della sintassi specifica del fornitore dove necessario.
tenant_id, region o owner_id. Se tale colonna non esiste ancora, pianificare un backfill prima che la policy diventi attiva e valutare l'indicizzazione della colonna per mantenere il predicato economico.Spostare la logica di accesso nel livello dati offre diversi vantaggi pratici. In breve, il database diventa l'unica fonte di verità per l'accesso, anziché ogni singola applicazione che tocca i dati.
La RLS è potente, ma presenta alcune insidie ben note che i team dovrebbero pianificare. La maggior parte di queste emerge solo in produzione o durante un audit, il che rende utile conoscerle in anticipo.
In molti database, i proprietari delle tabelle e gli amministratori con privilegi elevati bypassano la RLS per impostazione predefinita. PostgreSQL, ad esempio, richiede l'impostazione FORCE ROW LEVEL SECURITY per applicare i criteri al proprietario della tabella, e impostazioni simili esistono in altri motori. Questo è un riscontro comune negli audit: presupponi che gli utenti con privilegi vedano ogni riga, a meno che la configurazione non imponga esplicitamente l'applicazione del criterio anche a loro. Testa il criterio da una sessione con privilegi, non solo da una normale, prima di approvarlo.
La RLS filtra le righe, ma non nasconde le colonne né blocca i risultati aggregati. Un analista a cui è impedito di vedere i singoli record dell'EU può comunque eseguire SELECT COUNT(*) sulla tabella non filtrata se la RLS non è associata a restrizioni sulle colonne o sulle aggregazioni. Associa la RLS alla sicurezza a livello di colonna o al data masking per colmare questa lacuna, e valuta se le query aggregate stesse debbano essere regolate per le tabelle più sensibili.
A ogni query viene applicato il predicato RLS, il che può rallentare le prestazioni se la logica del filtro è complessa o se la colonna chiave non è indicizzata. Indicizza le colonne a cui fa riferimento il criterio e mantieni il predicato il più semplice possibile. Preferisci espressioni CASE lineari rispetto a sottoquery o ricerche in tabelle di mappatura all'interno del filtro. Se il motore lo supporta, materializza la mappatura utente-righe in una tabella piccola e ben indicizzata anziché calcolarla al volo.
I set di risultati vuoti causati dalla RLS sembrano identici a "nessun dato corrispondente". Gli sviluppatori alla ricerca di una riga mancante spesso passano ore prima di rendersi conto che il criterio l'ha filtrata. Registra l'identità dell'utente effettiva e la versione del criterio durante lo sviluppo, offri agli ingegneri un modo per verificare se la RLS è attiva quando i risultati sembrano errati e documenta il criterio nello stesso posto dello schema della tabella in modo che sia facilmente individuabile.
I criteri RLS hanno spesso due lati: una clausola USING che filtra ciò che gli utenti possono leggere e una clausola WITH CHECK che controlla ciò che possono inserire o aggiornare. Definire l'una senza l'altra è un errore classico: il filtraggio in lettura senza controllo in scrittura consente agli utenti di inserire o aggiornare righe di cui non dovrebbero essere proprietari. Definisci sempre entrambi i lati quando la tabella accetta scritture ed esegui un test sul lato scrittura come parte della revisione del criterio.
Sulla piattaforma Databricks, la sicurezza a livello di riga viene gestita tramite filtri di riga in Unity Catalog, il livello di governance unificato di Databricks per dati e IA. Il pattern è semplice: definisci una funzione definita dall'utente SQL che restituisce true per le righe che un determinato utente è autorizzato a vedere, quindi associala alla tabella di destinazione. Il filtro viene eseguito automaticamente al momento della query, utilizzando l'identità dell'utente corrente o il contesto di sessione per determinare quali righe restituire.
I filtri di riga vengono applicati in modo coerente in Databricks SQL, notebook, job e strumenti di BI connessi, senza richiedere logica personalizzata per ciascuna interfaccia. Funzionano insieme alle maschere di colonna per un controllo completo dell'accesso granulare, e ogni query che interessa una tabella filtrata viene acquisita nei log di lineage e di audit di Unity Catalog, in modo che i team di governance e sicurezza possano vedere esattamente quali criteri si applicano a quali tabelle e quali utenti hanno eseguito query su cosa.
Cos'è la sicurezza dinamica a livello di riga? La RLS dinamica valuta la regola di accesso al momento della query utilizzando l'identità dell'utente corrente o il contesto di sessione, in modo che lo stesso criterio restituisca risultati diversi per utenti diversi. Tutte le moderne implementazioni di RLS funzionano in questo modo, inclusi i criteri ABAC di Databricks, i filtri di riga e le viste dinamiche.
Qual è la differenza tra la sicurezza a livello di riga e la sicurezza a livello di colonna? La RLS limita le righe che un utente può vedere; la sicurezza a livello di colonna limita le colonne, in genere per nascondere campi sensibili come lo stipendio o i numeri di previdenza sociale. La maggior parte delle distribuzioni in produzione utilizza entrambe le soluzioni insieme.
La sicurezza a livello di riga è sufficiente da sola per proteggere i dati sensibili? No. La RLS gestisce la visibilità delle righe ma non maschera i valori delle colonne, non blocca le query aggregate né sostituisce la gestione delle identità e degli accessi. Associala alla sicurezza a livello di colonna, alle autorizzazioni a livello di tabella e alla registrazione degli audit come parte di una strategia di difesa approfondita.
In che modo Databricks implementa la sicurezza a livello di riga? Tramite Unity Catalog, con tre opzioni: criteri ABAC, filtri di riga a livello di tabella e viste dinamiche. L'ABAC è consigliato per la governance su larga scala; i filtri di riga e le viste dinamiche sono disponibili per esigenze più personalizzate.
La sicurezza a livello di riga influisce sulle prestazioni delle query? Sì, ma l'impatto è solitamente gestibile. Mantieni semplice la logica dei criteri, indicizza le colonne a cui fa riferimento il criterio e preferisci le UDF SQL rispetto alle UDF Python. Analizza il profilo delle query prima e dopo le modifiche ai criteri per individuare tempestivamente eventuali regressioni.
La sicurezza a livello di riga è più efficace se inserita in un modello di governance più ampio che copre anche colonne, mascheramento, lineage e audit. Scopri come Unity Catalog unisce la sicurezza a livello di riga, il mascheramento delle colonne e la governance unificata sulla piattaforma Databricks.
(Questo post sul blog è stato tradotto utilizzando strumenti basati sull'intelligenza artificiale) Post originale
Iscriviti al nostro blog e ricevi gli ultimi articoli direttamente nella tua casella di posta.