Questo documento descrive come utilizzare le viste sicure con parametri in AlloyDB per PostgreSQL, che consentono di limitare l'accesso ai dati in base a parametri denominati specifici dell'applicazione, come le credenziali utente dell'applicazione. Le viste sicure con parametri migliorano la sicurezza econtrollo dell'accessoo estendendo la funzionalità delle viste PostgreSQL. Queste viste riducono anche i rischi di esecuzione di query non attendibili dalle applicazioni applicando automaticamente una serie di restrizioni a qualsiasi query eseguita.
Per ulteriori informazioni, consulta la panoramica delle viste sicure parametrizzate e il tutorial sulle viste sicure parametrizzate.
Prima di iniziare
Questo documento presuppone che tu abbia creato un cluster e un'istanza AlloyDB. Per saperne di più, vedi Creare un database.
Prima di poter utilizzare le visualizzazioni sicure con parametri, devi:
Richiedi l'accesso alle visualizzazioni sicure con parametri e attendi di ricevere la conferma dell'attivazione prima di iniziare.
Attendi che il team di AlloyDB attivi il flag del database
parameterized_views.enabled
che carica le librerie di estensioni richieste. Questo flag del database deve essere attivato prima di poter iniziare.Dopo che il team AlloyDB ha attivato il flag del database
parameterized_views.enabled
, il database viene riavviato per rendere effettive queste modifiche.Utilizza AlloyDB Studio o psql per creare l'estensione
parameterized_views
in qualsiasi database in cui viene creata una vista parametrizzata:-- Requires parameterized_views.enabled set to true CREATE EXTENSION parameterized_views;
Quando viene creata l'estensione, il sistema crea anche uno schema denominato
parameterized_views
in modo che le API siano contenute nello spazio dei nomi dello schema e non entrino in conflitto con le API esistenti.
Creare una vista sicura con parametri
Per creare una vista sicura con parametri:
Esegui il comando DDL
CREATE VIEW
, come mostrato nell'esempio seguente:CREATE VIEW secure_checked_items WITH (security_barrier) AS SELECT bag_id, timestamp, location FROM checked_items t WHERE customer_id = $@app_end_userid;
Nell'esempio precedente, la visualizzazione sicura con parametri consente l'accesso a tre colonne di una tabella denominata
/users/checked_items/
. I limiti di visualizzazione restringono i risultati alle righe in cui/users.id/checked_items.customer_id/
corrisponde a un parametro obbligatorio.Utilizza i seguenti attributi:
- Crea la vista utilizzando l'opzione
security_barrier
. - Per limitare gli utenti dell'applicazione in modo che possano visualizzare solo le righe
a cui è consentito l'accesso, aggiungi i parametri richiesti utilizzando la
sintassi
$@PARAMETER_NAME
nella clausolaWHERE
. Un caso d'uso comune è controllare il valore di una colonna utilizzandoWHERE COLUMN = $@PARAMETER_NAME
. $@PARAMETER_NAME
indica un parametro della visualizzazione denominata. Il suo valore viene fornito quando utilizzi l'APIexecute_parameterized_query
. I parametri della visualizzazione denominata devono soddisfare i seguenti requisiti:- I parametri della visualizzazione denominata devono iniziare con una lettera (a-z).
- Puoi utilizzare lettere con segni diacritici e lettere non latine, nonché un trattino basso (
_
). - I caratteri successivi possono essere lettere, trattini bassi o cifre (
0
-9
). - I parametri della visualizzazione denominata non possono contenere
$
. - I parametri della visualizzazione denominata sono sensibili alle maiuscole. Ad esempio,
$@PARAMETER_NAME
viene interpretato in modo diverso da$@parameter_name
.
- Crea la vista utilizzando l'opzione
Concedi
SELECT
alla vista a qualsiasi utente del database autorizzato a interrogare la vista.Concedi
USAGE
sullo schema che contiene le tabelle definite nella vista a qualsiasi utente del database autorizzato a eseguire query sulla vista.
Per saperne di più, vedi Proteggere e controllare l'accesso ai dati delle applicazioni utilizzando viste sicure parametrizzate.
Configura la sicurezza per la tua applicazione
Per configurare la sicurezza per le tue applicazioni utilizzando viste sicure parametrizzate, segui questi passaggi:
- Crea le visualizzazioni con parametri sicuri come utente amministrativo. Questo utente è un utente del database AlloyDB che esegue operazioni amministrative per l'applicazione, tra cui la configurazione del database e l'amministrazione della sicurezza.
Crea un nuovo ruolo del database per l'esecuzione di query su viste sicure con parametri. Si tratta di un ruolo del database AlloyDB che l'applicazione utilizza per connettersi e accedere al database ed eseguire query sulle viste con parametri.
- Concedi le nuove autorizzazioni del ruolo alle visualizzazioni protette, che
in genere includono i privilegi
SELECT
per le visualizzazioni eUSAGE
per gli schemi. - Limita gli oggetti a cui questo ruolo può accedere al set minimo richiesto di funzioni e oggetti pubblici necessari all'applicazione. Evita di fornire l'accesso a schemi e tabelle non pubblici.
Quando esegui una query sulle visualizzazioni, l'applicazione fornisce i valori dei parametri di visualizzazione obbligatori, che sono collegati all'identità dell'utente dell'applicazione.
Per saperne di più, vedi Creare un utente del database.
- Concedi le nuove autorizzazioni del ruolo alle visualizzazioni protette, che
in genere includono i privilegi
Eseguire query su una vista sicura con parametri
Per eseguire query su una vista sicura con parametri, utilizza una delle seguenti opzioni che supporta al meglio il tuo caso d'uso:
- Basata su JSON: utilizza questa API per eseguire la query in un'unica operazione e restituire righe JSON.
- Basata sul CURSORE: utilizza questa API quando hai query di esecuzione più lunga o quando hai query di grandi dimensioni e vuoi recuperare il risultato in batch. La funzione
execute_parameterized_query
fornita dall'estensioneparameterized_views
accetta un nome di cursore. - Istruzione
PREPARE EXECUTE
: utilizzala per le istruzioni preparate che possono essere eseguite più volte con valori di parametri diversi.
Per eseguire query sulle viste sicure parametrizzate, utilizza la funzione execute_parameterized_query()
fornita dall'estensione parameterized_views
.
API JSON
Questa API presenta limitazioni perché dichiara un cursore per la query specificata. Di conseguenza, la query deve essere compatibile con i cursori PostgreSQL.
Ad esempio, l'API CURSOR non supporta le istruzioni DO
o SHOW
.
Inoltre, questa API non limita i risultati in base alle dimensioni o al numero di righe restituite.
Esegui la funzione execute_parameterized_query()
, che ha la seguente
sintassi:
SELECT * FROM
parameterized_views.execute_parameterized_query(
query => SQL_QUERY,
param_names => ARRAY [PARAMETER_NAMES],
param_values => ARRAY [PARAMETER_VALUES]
)
Sostituisci quanto segue:
SQL_QUERY
: una query SQL la cui clausolaFROM
fa riferimento a una o più viste sicure con parametri.PARAMETER_NAMES
: un elenco di nomi di parametri da passare come stringhe.PARAMETER_VALUES
: un elenco di valori dei parametri da inserire.- Questo elenco deve avere le stesse dimensioni dell'elenco
param_names
, in cui l'ordine dei valori corrisponde all'ordine dei nomi. - Il tipo esatto dei valori viene dedotto dalla query e dalla definizione della vista parametrizzata. Le conversioni di tipo vengono eseguite quando necessario e quando possibile per ilvalore parametroo specificato. In caso di mancata corrispondenza dei tipi, viene generato un errore.
- Questo elenco deve avere le stesse dimensioni dell'elenco
La funzione restituisce una tabella di oggetti JSON. Ogni riga della tabella
equivale al valore ROW_TO_JSON()
della riga dei risultati della query originale.
Utilizza il seguente esempio per eseguire query su una vista sicura con parametri:
SELECT * FROM
parameterized_views.execute_parameterized_query(
query => 'SELECT * FROM secure_checked_items',
param_names => ARRAY ['app_end_userid'],
param_values => ARRAY ['40']
)
L'utilizzo di questa API limita le dimensioni del set di risultati in base alle dimensioni espresse in kilobyte (kB) dei risultati e al numero di righe. Puoi configurare questi limiti utilizzando parameterized_views.json_results_max_size
e parameterized_views.json_results_max_rows
.
API CURSOR
Esegui la funzione execute_parameterized_query()
, che crea e restituisce un
cursore con ambito di transazione che utilizzi per recuperare i risultati della query:
SELECT * FROM
parameterized_views.execute_parameterized_query(
query => SQL_QUERY,
cursor_name => CURSOR_NAME,
param_names => ARRAY [PARAMETER_NAMES],
param_values => ARRAY [PARAMETER_VALUES]
)
Sostituisci quanto segue:
SQL_QUERY
: una query SQL la cui clausolaFROM
fa riferimento a una o più viste sicure con parametri.CURSOR_NAME
: il nome del cursore da dichiarare.PARAMETER_NAMES
: un elenco di nomi di parametri da passare come stringhe.PARAMETER_VALUES
: un elenco di valori dei parametri da inserire. Questo elenco deve avere le stesse dimensioni dell'elencoparam_names
, in cui l'ordine dei valori corrisponde all'ordine dei nomi. Il tipo esatto dei valori viene dedotto dalla query e dalla definizione della vista parametrizzata. Le conversioni di tipo vengono eseguite quando necessario e quando possibile per ilvalore parametroo specificato. In caso di mancata corrispondenza dei tipi, viene generato un errore.
Utilizza il seguente esempio per eseguire query su una vista sicura con parametri:
-- start a transaction as the that is the default lifetime of a CURSOR
BEGIN;
-- create a cursor called 'mycursor'
SELECT * FROM parameterized_views.execute_parameterized_query(
query => 'SELECT * FROM secure_checked_items',
cursor_name => 'mycursor'
param_names => ARRAY ['app_end_userid'],
param_values => ARRAY ['40']
);
-- then, to actually fetch the results
FETCH ALL FROM mycursor;
-- end the transaction, which will clean up the cursor
END;
Il cursore restituito è un cursore NO SCROLL
WITHOUT HOLD
. Non puoi utilizzare il cursore per recuperare le righe in modo non sequenziale, ad esempio in direzione inversa. Non puoi utilizzare il cursore al di fuori della transazione che lo ha creato.
Istruzione PREPARE
Utilizza il comando PREPARE .. AS RESTRICTED
per creare un'istruzione preparata
che fa riferimento a viste parametrizzate. Queste istruzioni preparate supportano
i parametri posizionali e applicano varie limitazioni quando le esegui.
Per ulteriori informazioni, vedi Meccanismo di sicurezza.
Questa funzionalità estende
PREPARE
e EXECUTE commands
per supportare i parametri della visualizzazione denominata. Utilizza istruzioni preparate per evitare il sovraccarico di analisi, analisi e riscrittura ogni volta che l'istruzione viene eseguita, il che può comportare un aumento significativo delle prestazioni, soprattutto per le query eseguite di frequente o complesse. Un'istruzione
preparata è un oggetto lato server che può ottimizzare le prestazioni
precompilando e memorizzando un'istruzione SQL parametrizzata per l'esecuzione successiva.
Questa API presenta limitazioni perché l'istruzione deve essere consentita in un'istruzione PREPARE
, il che significa che sono supportate solo le istruzioni SELECT
e VALUES
.
Inoltre, questa API non limita i risultati in base alle dimensioni o al numero di righe restituite.
Per creare un'istruzione preparata che fa riferimento a viste parametrizzate, esegui il comando
PREPARE .. AS RESTRICTED
:
PREPARE pquery (/POSITIONAL_PARAM_TYPES/)
AS RESTRICTED query % a query that may refer to parameterized views
EXECUTE pquery (/POSITIONAL_PARAM_VALUES/)
WITH VIEW PARAMETERS (VIEW_PARAM_NAME1 = VIEW_PARAM_VALUE1[, ...]);
Sostituisci quanto segue:
POSITIONAL_PARAM_TYPES
: uno o più parametri posizionali utilizzati nella queryRESTRICTED
.POSITIONAL_PARAM_VALUES
: i valori effettivi che vengono sostituiti ai parametri posizionali definiti nell'istruzionePREPARE
.VIEW_PARAM_NAME
: il nome del parametro previsto dalle viste parametrizzate a cui viene fatto riferimento nella queryRESTRICTED
.VIEW_PARAM_VALUE
: i valori effettivi passati ai parametriviewParamName
corrispondenti delle visualizzazioni parametrizzate.
Per includere parametri in un'istruzione preparata, fornisci un elenco di tipi di dati
nell'istruzione PREPARE
. Nella dichiarazione che prepari, fai riferimento
ai parametri per posizione utilizzando, ad esempio, $1
e $2
.
Utilizza il comando EXECUTE .. WITH VIEW PARAMETERS
per eseguire un'istruzione preparata in precedenza che hai creato utilizzando il comando PREPARE .. AS RESTRICTED
.
Se l'istruzione PREPARE
che ha creato l'istruzione ha specificato parametri posizionali, devi passare un insieme compatibile di parametri all'istruzione EXECUTE
. Devi trasmettere tutti i parametri della visualizzazione denominata richiesti dalle visualizzazioni
parametrizzate nella clausola WITH VIEW PARAMETERS
.
Utilizza il seguente esempio per eseguire query su una vista sicura con parametri:
PREPARE pquery (timestamp) AS RESTRICTED SELECT * FROM secure_checked_items WHERE timestamp > $1;
EXECUTE pquery (current_date - 1) WITH VIEW PARAMETERS (app_end_userid = 40);
EXECUTE pquery (current_date - 30) WITH VIEW PARAMETERS (app_end_userid = 40);
Restrizioni imposte alle query
Di seguito è riportato l'insieme di operazioni con limitazioni per le query eseguite utilizzando le opzioni descritte in Eseguire query su una vista sicura con parametri:
- È vietata qualsiasi invocazione ricorsiva di API,
execute_parameterized_query
o tramite l'utilizzo diEXECUTE .. WITH VIEW PARAMETERS
, in modo che vengano utilizzati solo i valori specificati dall'applicazione. Questa limitazione impedisce inoltre che la query venga utilizzata per aggirare l'envelope di sicurezza dell'insieme specificato di valori dei parametri. - Alcune estensioni che avviano una nuova sessione in background non sono consentite,
tra cui le estensioni
dblink
,pg_cron
epg_background
. - Il seguente elenco mostra l'insieme di costrutti di query consentiti che sono
limitati:
- Sono consentite solo istruzioni
SELECT
di sola lettura. - Sono consentite le istruzioni
SHOW
di sola lettura, le istruzioniCALL
e le istruzioniDO
. - Le istruzioni DML come
INSERT
,UPDATE
eDELETE
non sono consentite. - Le istruzioni DDL come
CREATE TABLE
eALTER TABLE
non sono consentite. - Altri tipi di istruzioni, come
LOAD
,SET
,CLUSTER
,LOCK
,CHECKPOINT
eEXPLAIN
, non sono consentiti.
- Sono consentite solo istruzioni
- Le istruzioni
EXPLAIN
non sono consentite per evitare la possibilità di attacchi al canale nascosto utilizzando i piani di query. Per ulteriori informazioni, vedi Canale nascosto.
Elenco di tutte le viste con parametri
Utilizza l'estensione parameterized_views
per elencare tutte le viste parametrizzate
nel database utilizzando la vista all_parameterized_views
. L'output
di questa visualizzazione è lo stesso della visualizzazione
del catalogo pg_views
, ma all_parameterized_views
elenca solo le visualizzazioni con parametri
della visualizzazione denominata.
Per elencare le visualizzazioni con parametri, utilizza il seguente esempio:
postgres=# select * from parameterized_views.all_parameterized_views ;
schemaname | viewname | viewowner | definition
-----------+--------------------+-----------+---------------------------------------------------------
public | checked_items_view | postgres | SELECT checked_items.bag_id, +
| | | checked_items."timestamp", +
| | | checked_items.location +
| | | FROM checked_items +
| | | WHERE (checked_items.customer_id = $@app_end_userid);
Per elencare una visualizzazione parametrizzata in all_parameterized_views
, assicurati che
la visualizzazione parametrizzata contenga almeno un parametro di visualizzazione denominato nella sua definizione.
Passaggi successivi
- Scopri di più sulle visualizzazioni sicure parametrizzate.
- Scopri come proteggere e controllare l'accesso ai dati delle applicazioni utilizzando viste sicure parametrizzate.