Panoramica delle visualizzazioni parametrizzate

Questo documento descrive le viste parametrizzate in Spanner. Le viste parametrizzate consentono di filtrare dinamicamente i dati in base ai parametri di sessione passati con le query, in particolare per le applicazioni e i sistemi agentici che utilizzano modelli linguistici di grandi dimensioni (LLM).

Le viste parametrizzate estendono le funzionalità delle viste del database inserendo i parametri di contesto direttamente in una definizione di vista. Le viste parametrizzate ti consentono di:

  • Passa i parametri di contesto al momento della query, come l'identità dell'utente o del tenant, in una definizione di visualizzazione.
  • Limita i risultati della query solo alle righe che corrispondono ai parametri forniti.
  • Impedisci agli utenti di bypassare i filtri dei dati a livello di applicazione nelle query SQL generate o ad hoc.

Per saperne di più, consulta Crea una vista parametrizzata.

Come funzionano le viste parametrizzate

Le viste parametrizzate utilizzano i parametri per trasmettere in modo sicuro al database il contesto a livello di applicazione, ad esempio un ID utente. Quando l'applicazione esegue una query, invia il contesto con l'istruzione della query. Spanner accede a questo contesto durante l'esecuzione, ma né la query né l'utente dell'applicazione possono leggerlo o modificarlo.

La funzione SECURE_CONTEXT() fornisce l'interfaccia SQL per accedere a questi parametri sicuri all'interno di una definizione di vista. Le viste parametrizzate richiedono il modello di sicurezza della vista dei diritti del definer, in cui la vista utilizza SECURE_CONTEXT() per accedere ai valori e filtrare i risultati.

Ad esempio, per filtrare i dati in base all'ID dell'utente che esegue la query, puoi includere quanto segue nella clausola WHERE della vista:

CREATE VIEW MyUserData
SQL SECURITY DEFINER AS
(SELECT *
FROM AllUserData
WHERE UserID = CAST(SECURE_CONTEXT('user_id'), INT));

In questo modo, l'applicazione può visualizzare i dati dell'utente, ma non quelli di altri utenti. Puoi anche creare una vista che consenta ai moderatori di visualizzare i dati meno sensibili di qualsiasi utente:

CREATE VIEW SafeUserData
SQL SECURITY DEFINER AS
(SELECT UserID, AccountCreationTime, PublicProfileText
FROM AllUserData
WHERE SECURE_CONTEXT('role') = 'Moderator');

Sebbene tu possa utilizzare SECURE_CONTEXT() in qualsiasi punto della definizione di una query di visualizzazione, la best practice per le prestazioni è utilizzarlo nella clausola WHERE per filtrare in base alle colonne chiave principali di una tabella o di un indice. In questo modo, Spanner invia in modo efficiente la logica di filtro al livello di archiviazione.

Per impostazione predefinita, l'esecuzione di query sulla funzione SECURE_CONTEXT() direttamente in una query ad hoc non riesce, a meno che il ruolo del database non abbia il ruolo spanner_secure_context_reader. In questo modo, gli utenti senza privilegi non possono ispezionare direttamente i valori dei parametri.

Un pattern consigliato è combinare le viste parametrizzate con le viste con diritti del definer e il controllo granulare dell'accesso (FGAC). Per assicurarti che gli utenti possano eseguire query sui dati solo tramite la vista:

  1. Abilita l'FGAC e crea un ruolo del database per la tua applicazione.
  2. GRANT il privilegio SELECT sulla vista al ruolo.
  3. Assicurati che al ruolo di sistema public non siano concessi privilegi sulle tabelle di base o sulle viste.

Ad esempio:

-- Create a role for the application user
CREATE ROLE pv_user;

-- Grant SELECT permission on the view to the role
GRANT SELECT ON VIEW MyUserData TO ROLE pv_user;

Dopo aver creato la vista con parametri, la procedura per una richiesta tipica è la seguente:

  1. La tua applicazione imposta il contesto sicuro su una richiesta di query. Il contesto contiene informazioni che identificano l'utente dell'applicazione, ad esempio un ID utente o un ruolo.
  2. L'applicazione esegue una query su una vista con diritti del definer.
  3. La vista utilizza la funzione SECURE_CONTEXT() in una clausola WHERE per filtrare le righe in base ai valori forniti nel contesto sicuro.
  4. Spanner restituisce solo le righe che corrispondono al filtro, filtrando in modo efficace i risultati della query in base ai dati associati al contesto della sessione dell'utente.

Ad esempio, un'applicazione può passare l'ID dell'utente corrente nel contesto sicuro utilizzando una delle librerie client di Spanner. L'esempio seguente utilizza la libreria client C++ per impostare il parametro sicuro user_id:

(*request.mutable_secure_context())["user_id"] = "ca6095c4-1a68-44a8-9562-dd9e897326f0";

L'applicazione esegue quindi una query SQL standard sulla vista. La vista utilizza questo user_id nella clausola WHERE per restituire solo i record che appartengono a quell'utente:

--Query executed by the application
SELECT * FROM MyUserData;

Vantaggi delle viste parametrizzate

I parametri ti aiutano a raggiungere i seguenti obiettivi:

  • Isolare i dati dei tenant nelle applicazioni multi-tenant: utilizza i parametri per assicurarti che le query restituiscano i dati solo per un tenant specifico.

  • Vincola le query dell'AI agentica: limita le query in linguaggio naturale ai dati di un utente o di un tenant.

  • Filtra i dati con credenziali temporanee: limita l'accesso ai dati in base a un ID utente o tenant che non esiste in Identity and Access Management (IAM).

  • Utilizza credenziali private per i filtri: filtra i dati utilizzando i valori richiesti per la query che non devono essere restituiti all'utente finale.

Mitigazione dei rischi per la sicurezza

Le viste parametrizzate aiutano a mitigare i rischi per la sicurezza quando gli utenti finali eseguono query non attendibili, come le query in linguaggio naturale, sul tuo database. Questi rischi includono:

  • Prompt dannosi: gli utenti potrebbero tentare di manipolare il modello sottostante per accedere a tutti i dati dell'applicazione.
  • Query SQL ad ampio raggio: i modelli linguistici di grandi dimensioni (LLM) potrebbero generare query SQL che espongono dati sensibili, anche da query degli utenti con buone intenzioni.

Utilizzando le viste parametrizzate, puoi limitare l'intervallo di righe restituite ai singoli utenti dell'applicazione, indipendentemente da come gli utenti formulano le query.

Best practice

Segui queste pratiche per implementare in modo efficace le viste parametrizzate.

  • Combina con le viste dei diritti del definer e il controllo granulare dell'accesso: utilizza i parametri come parte di un modello di sicurezza completo che include le viste dei diritti del definer e i ruoli di controllo dell'accesso granulare dell'accesso. Concedi i privilegi del ruolo SELECT solo alle viste e assicurati che il ruolo e il ruolo di sistema public non abbiano privilegi sulle tabelle di base sottostanti.

  • Utilizza JSON per contesti complessi: per passare un contesto strutturato, ad esempio un utente con più ruoli, serializza i dati come stringa JSON. Passa la stringa JSON come singolo parametro. Utilizza i tipi JSON o JSONB integrati di Spanner per estrarre i valori all'interno della vista.

  • Semplifica l'accesso con le funzioni definite dall'utente SQL: se accedi di frequente ai campi all'interno di un contesto JSON strutturato, crea funzioni definite dall'utente SQL per incapsulare la logica di estrazione. L'utilizzo di funzioni definite dall'utente nelle visualizzazioni migliora la leggibilità e la manutenibilità.

  • Proteggiti dal prompt injection con Model Armor: quando generi query utilizzando LLM con input utente non attendibile, utilizza Model Armor per identificare e bloccare in modo proattivo i tentativi di prompt injection e jailbreak.

Limitazioni

Le viste parametrizzate presentano le seguenti limitazioni:

  • Tipi di argomenti: la funzione SECURE_CONTEXT() richiede un argomento letterale stringa.
  • Tipi di risultati: la funzione SECURE_CONTEXT() restituisce una stringa.
  • Interazioni con le funzionalità di Spanner: non puoi utilizzare SECURE_CONTEXT() nelle colonne generate, nelle espressioni dei valori predefiniti delle colonne o all'interno delle funzioni definite dall'utente (UDF).
  • Barriere di sicurezza: le viste parametrizzate in Spanner non includono una barriera di sicurezza. Sebbene tutti i filtri vengano applicati prima di restituire i risultati della query, potrebbero non limitare i dati a cui viene eseguito l'accesso durante l'elaborazione interna della query.

Passaggi successivi