Proteggi e controlla l'accesso ai dati dell'applicazione utilizzando viste sicure parametrizzate

Questo tutorial descrive come utilizzare le viste sicure con parametri in AlloyDB per PostgreSQL per limitare l'accesso degli utenti alle tabelle del database. In questo tutorial, configurerai le viste sicure con parametri, configurerai i ruoli e i privilegi del database per limitare l'accesso alle tabelle di base e verificherai la sicurezza dei dati. Le viste sicure con parametri consentono di proteggere le applicazioni che utilizzano query in linguaggio naturale generate utilizzando l'API QueryData.

Sono inclusi esempi per illustrare le funzionalità delle viste sicure con parametri. Questi esempi sono destinati esclusivamente a scopi dimostrativi.

Che cosa sono le viste sicure con parametri?

Come best practice generale, l'applicazione deve essere eseguita utilizzando un account di servizio con l'accesso minimo richiesto al database. Ad esempio, se l'applicazione non deve scrivere nel database, deve utilizzare un ruolo con accesso di sola lettura. Devi configurare questi controlli dell'accesso a livello di database.

Tuttavia, a volte l'applicazione ha bisogno di controlli di sicurezza più granulari rispetto a quelli consentiti dall'accesso standard a livello di database. Le viste sicure con parametri forniscono la sicurezza dei dati dell'applicazione e il controllo dell'accesso alle righe utilizzando le viste SQL. Consentono di garantire che gli utenti dell'applicazione possano visualizzare solo i dati a cui sono autorizzati ad accedere.

Le viste sicure con parametri riducono i rischi per la sicurezza quando gestiscono query in linguaggio naturale ad hoc o generate da LLM parametrizzando le viste con gli identificatori degli utenti finali, assicurando che gli utenti accedano solo ai dati autorizzati indipendentemente dalla formulazione della query. Questo approccio semplifica anche la gestione degli utenti consentendo a un singolo ruolo del database di servire in modo sicuro tutti gli utenti dell'applicazione, evitando la necessità di creare ruoli del database separati per ogni utente per applicare la sicurezza a livello di riga.

Obiettivi

  • Crea viste sicure con parametri con parametri di visualizzazione denominati.
  • Crea il ruolo del database utilizzato dall'applicazione per connettersi al database e accedere alle viste sicure con parametri.
  • Concedi al nuovo ruolo le autorizzazioni per le viste sicure e revoca l'accesso alle tabelle di base.
  • Connettiti utilizzando il nuovo ruolo e verifica che non sia possibile accedere alle tabelle con limitazioni.
  • Esegui query sulla vista sicura con parametri utilizzando la funzione execute_parameterized_query o l'API QueryData.

Costi

In questo documento vengono utilizzati i seguenti componenti fatturabili di Google Cloud:

Per generare una stima dei costi in base all'utilizzo previsto, utilizza il calcolatore prezzi.

I nuovi Google Cloud utenti potrebbero avere diritto a una prova senza costi.

Per evitare addebiti continui, elimina le risorse che hai creato al termine delle attività descritte in questo documento. Per ulteriori informazioni, consulta Liberare spazio.

Prima di iniziare

Completa i seguenti prerequisiti prima di creare un set di contesti.

Abilita fatturazione e API richieste

  1. Nellaconsole, seleziona un progetto. Google Cloud

    Vai al selettore di progetti

  2. Assicurati che la fatturazione sia abilitata per il tuo Google Cloud progetto.

  3. Abilita le API Cloud necessarie per creare e connetterti ad AlloyDB per PostgreSQL.

    1. Nel passaggio Conferma progetto, fai clic su Avanti per confermare il nome del progetto a cui apporterai le modifiche.
    2. Nel passaggio Abilita API, fai clic su Abilita per abilitare le seguenti API:

      • API AlloyDB per PostgreSQL
      • API Dataplex Universal Catalog

Creare e connettersi a un database

  1. Crea un cluster e la relativa istanza principale.
  2. Connettiti all'istanza e crea un database.

Prepara l'ambiente

Per prepararti a eseguire query su una vista sicura con parametri, configura il database, i ruoli del database, l'estensione parameterized_view e lo schema dell'applicazione.

Abilita l'estensione richiesta

Abilita il flag di database parameterized_views.enabled, che carica le librerie di estensioni richieste. Per ulteriori informazioni, consulta Configurare i flag di database di un'istanza.

Configura il database

  • Crea un database denominato database per i dati dell'applicazione e le viste con parametri. Per ulteriori informazioni, consulta Creare un database.

Crea ruoli del database, l'estensione e lo schema dell'applicazione

  1. Nellaconsole, vai alla pagina AlloyDB. Google Cloud

    Vai ad AlloyDB

  2. Seleziona un cluster dall'elenco.

  3. Nel menu di navigazione, fai clic su AlloyDB Studio.

  4. Accedi a Studio utilizzando l'autenticazione postgres.

  5. Fai clic su Authenticate (Autentica). Nel riquadro Explorer viene visualizzato un elenco degli oggetti nel database.

  6. Fai clic su Nuova scheda dell'editor SQL o Nuova scheda per aprire una nuova scheda.

  7. Crea l'estensione parameterized_views nel database.

    -- 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 siano in conflitto con le API esistenti.

  8. Accedi come utente con privilegi di superutente, ad esempio l'utente postgres integrato. Se vuoi creare un nuovo superutente, ad esempio admin_user, esegui i seguenti comandi:

    CREATE ROLE admin_user WITH LOGIN PASSWORD '...';
    GRANT ALL PRIVILEGES ON DATABASE database TO admin_user;
    

    Per ulteriori informazioni, consulta CREATE USER.

  9. Crea un nuovo ruolo del database per l'esecuzione di query sulle viste sicure con parametri. Si tratta di un ruolo AlloyDB che l'applicazione utilizza per connettersi e accedere al database per eseguire query con accesso limitato alle funzioni o agli oggetti pubblici al set minimo richiesto.

    CREATE ROLE psv_user WITH LOGIN PASSWORD '...';
    

    Per ulteriori informazioni, consulta CREATE USER.

  10. Connettiti come utente amministratore.

    SET role TO admin_user;
    
  11. Crea lo schema contenente le tabelle.

    CREATE SCHEMA schema;
    
  12. Crea le tabelle e inserisci i dati.

    CREATE TABLE store.checked_items(bag_id INT,timestamp TIMESTAMP, loc_code CHAR(3), scan_type CHAR(1), location TEXT, customer_id INT);
    
    INSERT INTO store.checked_items (bag_id, timestamp, loc_code, scan_type, location, customer_id) VALUES
    (101, '2023-10-26 10:00:00', 'ABC', 'I', 'Warehouse A', 123),
    (102, '2023-10-26 10:15:30', 'DEF', 'O', 'Loading Dock B', 456),
    (103, '2023-10-26 10:30:45', 'GHI', 'I', 'Conveyor Belt 1', 789),
    (104, '2023-10-26 11:00:00', 'JKL', 'O', 'Shipping Area C', 101),
    (105, '2023-10-26 11:45:15', 'MNO', 'I', 'Sorting Station D', 202),
    (106, '2023-10-26 12:00:00', 'PQR', 'O', 'Truck Bay E', 303);
    

Crea viste sicure con parametri e configura i privilegi di accesso

Per creare viste sicure con parametri e configurare i privilegi di accesso appropriati per la tabella e le viste di base:

  1. Nellaconsole, vai alla pagina AlloyDB. Google Cloud

    Vai ad AlloyDB

  2. Seleziona un cluster dall'elenco.

  3. Nel menu di navigazione, fai clic su AlloyDB Studio.

  4. Accedi a Studio e connettiti al database come admin_user.

  5. Fai clic su Authenticate (Autentica). Nel riquadro Explorer viene visualizzato un elenco degli oggetti nel database.

  6. Fai clic su Nuova scheda dell'editor SQL o Nuova scheda per aprire una nuova scheda.

  7. Per fornire un accesso limitato alla vista, crea una vista sicura con parametri:

    CREATE VIEW store.secure_checked_items WITH (security_barrier) AS
    SELECT bag_id, timestamp, location
    FROM store.checked_items t
    WHERE customer_id = $@app_end_userid;
    
  8. Concedi l'accesso alla vista.

    GRANT SELECT ON store.secure_checked_items TO psv_user;
    
  9. Per accedere alla vista, concedi l'accesso allo schema.

    GRANT USAGE ON SCHEMA store TO psv_user;
    
  10. Revoca l'accesso diretto alla tabella di base.

    REVOKE ALL PRIVILEGES ON store.checked_items FROM psv_user;
    
  11. Accedi come amministratore admin_user e assegna il ruolo psv_user a un utente autenticato con IAM

    GRANT psv_user TO "IAM_USER_EMAIL";
    

    Sostituisci IAM_USER_EMAIL con l'indirizzo email dell'utente IAM.

Verifica la sicurezza dei dati

Per verificare che le viste sicure con parametri limitino l'accesso alle viste designate, accedi al database come utente autenticato con IAM. In AlloyDB, gli utenti IAM ereditano le autorizzazioni dei ruoli del database assegnati.

  1. Accedi al database come utente autenticato con IAM.

  2. Verifica che non sia possibile accedere alla tabella di base.

    SELECT * FROM store.checked_items;
    ERROR:  permission denied for table checked_items
    
  3. Accedi alla vista sicura con parametri utilizzando la funzione execute_parameterized_query:

    SELECT * FROM parameterized_views.execute_parameterized_query(
      query => 'SELECT * from store.secure_checked_items',
      param_names => ARRAY ['app_end_userid'],
      param_values => ARRAY ['303']
    );
    
  4. Esegui query sulla vista sicura con parametri utilizzando la sintassi SQL e la richiesta QueryData con i parametri PSV.

    curl -X POST \
      "https://geminidataanalytics.googleapis.com/v1beta/projects/PROJECT_ID/locations/REGION:queryData" \
      -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json; charset=utf-8" \
      -d '{
        "prompt": "Show me the checked items.",
        "context": {
          "datasource_references": {
            "alloydb": {
              "database_reference": {
                "project_id": "PROJECT_ID",
                "region": "REGION",
                "cluster_id": "CLUSTER_ID",
                "instance_id": "INSTANCE_ID",
                "database_id": "DATABASE_ID"
              }
            }
          },
          "parameterized_secure_view_parameters": {
            "parameters": {
              "app_end_userid": "303"
            }
          }
        },
        "generation_options": {
          "generate_query_result": true,
          "generate_natural_language_answer": true,
          "generate_explanation": true
        }
      }'

Sostituisci i seguenti valori:

  • PROJECT_ID: l' Google Cloud ID progetto.
  • REGION: la regione in cui si trova l'istanza AlloyDB per PostgreSQL.
  • CLUSTER_ID: l'ID del cluster AlloyDB per PostgreSQL.
  • INSTANCE_ID: l'ID dell'istanza AlloyDB per PostgreSQL.
  • DATABASE_ID: l'ID del database AlloyDB per PostgreSQL.

Libera spazio

Elimina il cluster

Quando elimini il cluster che hai creato nella sezione Prima di iniziare, elimini anche tutti gli oggetti che hai creato.

  1. Nellaconsole, vai alla pagina AlloyDB. Google Cloud

    Vai ad AlloyDB

  2. Seleziona un cluster dall'elenco.

  3. Fai clic su Elimina cluster.

  4. In Elimina cluster, inserisci il nome del cluster per confermare che vuoi eliminarlo.

Passaggi successivi