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

Le viste sicure parametrizzate forniscono alle applicazioni la sicurezza dei dati e controllo dell'accesso alle righe. Filtrano i risultati delle query in base all'identità dell'utente dell'applicazione.

Questo tutorial descrive come configurare viste sicure parametrizzate in Cloud SQL, configurare i ruoli e i privilegi del database per limitare l'accesso alle tabelle di base e verificare la sicurezza dei dati. Gli esempi forniti in questo documento sono solo a scopo dimostrativo.

Che cosa sono le viste sicure parametrizzate?

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

Quando la tua applicazione richiede una sicurezza più granulare di quella consentita dall'accesso standard a livello di database, puoi utilizzare le viste protette parametrizzate per assicurarti che gli utenti visualizzino solo i dati autorizzati. Le viste sicure parametrizzate forniscono sicurezza dei dati dinamica e controllo dell'accesso alle righe adatto per applicazioni SaaS multi-tenant senza richiedere ruoli di database separati per ogni utente finale dell'applicazione.

L'utilizzo di viste sicure parametrizzate offre tre vantaggi principali:

  • Sicurezza dei dati dinamica e controllo dell'accesso alle righe: filtra le query utilizzando gli identificatori degli utenti finali in modo che gli utenti accedano solo ai dati autorizzati, indipendentemente dalla formulazione della query.
  • Gestione dei ruoli più semplice: utilizza un unico ruolo di database condiviso per tutti gli utenti dell'applicazione anziché gestire ruoli di database separati per ogni singolo utente.

Obiettivi

  • Crea viste sicure parametrizzate 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 le autorizzazioni del nuovo ruolo alle viste sicure parametrizzate 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 sulle viste sicure 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 utenti di Google Cloud potrebbero avere diritto a una prova senza costi.

Per evitare l'addebito di ulteriori costi, elimina le risorse create al termine delle attività descritte in questo documento. Per ulteriori informazioni, consulta Esegui la pulizia.

Prima di iniziare

Prima di creare viste sicure parametrizzate, completa i seguenti prerequisiti.

Abilita la fatturazione e le API richieste

  1. Nella console Google Cloud , seleziona un progetto.

    Vai al selettore di progetti

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

  3. Abilita le API Cloud necessarie per creare e connetterti a Cloud SQL.

    1. Abilita l'API

    2. Nel passaggio Conferma progetto, fai clic su Avanti per confermare il nome del progetto a cui apporterai le modifiche.

    3. Nel passaggio Abilita API, fai clic su Abilita per abilitare quanto segue:

      • API Cloud SQL per PostgreSQL
      • API Knowledge Catalog
      • API Data Analytics con Gemini (geminidataanalytics.googleapis.com)

Creare e connettersi a un database

  1. Crea un'istanza.
  2. Connettiti all'istanza e crea un database.
  3. Abilita l'API Cloud SQL Data sull'istanza Cloud SQL per PostgreSQL in modo che l'API QueryData possa eseguire query su di essa:

    gcloud sql instances patch INSTANCE_ID \
        --project=PROJECT_ID \
        --data-api-access=ALLOW_DATA_API

    Sostituisci quanto segue:

    • INSTANCE_ID: l'ID dell'istanza Cloud SQL per PostgreSQL.
    • PROJECT_ID: il tuo ID progetto Google Cloud .

Concedi i ruoli richiesti e crea un utente del database IAM

Per eseguire l'autenticazione con Identity and Access Management (IAM) ed eseguire richieste queryData su viste sicure parametrizzate, configura l'utente o il account di servizio IAM:

  1. Concedi i seguenti ruoli IAM a IAM_USER_EMAIL nel tuo progetto Google Cloud :

    • roles/geminidataanalytics.queryDataUser
    • roles/serviceusage.serviceUsageConsumer
    • roles/cloudsql.instanceUser

    Per saperne di più sulla concessione dei ruoli IAM, consulta Aggiungi l'associazione della policy IAM per un progetto.

  2. Abilita l'autenticazione del database IAM sulla tua istanza Cloud SQL e aggiungi IAM_USER_EMAIL come utente del database IAM nell'istanza. Devi creare questo utente del database IAM prima di concedergli il ruolo database psv_user. Per saperne di più sulla configurazione degli utenti del database IAM, consulta Gestisci gli utenti con l'autenticazione IAM del 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_views e lo schema dell'applicazione.

Abilita il flag di database

Attiva il flag di database cloudsql.enable_parameterized_views, che carica le librerie di estensioni richieste. Per saperne di più, consulta Configura i flag di database di un'istanza.

Configura il database

  • Crea un database denominato database per i dati dell'applicazione e le viste sicure parametrizzate. Per saperne di più, consulta Crea un database.

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

  1. Nella console Google Cloud , vai alla pagina Cloud SQL.

    Vai a Cloud SQL

  2. Seleziona un'istanza dall'elenco.

  3. Nel menu di navigazione, fai clic su Cloud SQL Studio.

  4. Accedi a Studio utilizzando l'autenticazione dell'account amministratore.

  5. Fai clic su Authenticate (Autentica). Il riquadro Explorer mostra un elenco degli oggetti nel database.

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

  7. Per utilizzare le viste parametrizzate, crea l'estensione parameterized_views nel tuo database:

    -- Requires parameterized_views.enabled set to true
    CREATE EXTENSION parameterized_views;
    

    Quando viene creata l'estensione, il database 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.

  8. Accedi come utente con privilegi di super utente, ad esempio l'utente postgres integrato.

  9. Crea un nuovo ruolo del database per eseguire query su viste protette parametrizzate. Questo è un ruolo Cloud SQL utilizzato dall'applicazione per connettersi e accedere al database per eseguire query con accesso limitato a funzioni o oggetti pubblici al set minimo richiesto.

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

    Per saperne di più, vedi CREATE USER.

  10. Connettiti come utente amministrativo.

    SET role TO postgres;
    
  11. Crea lo schema che contiene le tabelle.

    CREATE SCHEMA store;
    
  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 parametrizzate e configura i privilegi di accesso

Per creare viste sicure parametrizzate e configurare i privilegi di accesso appropriati per la tabella di base e le viste, segui questi passaggi:

  1. Nella console Google Cloud , vai alla pagina Cloud SQL.

    Vai a Cloud SQL

  2. Seleziona un'istanza dall'elenco.

  3. Nel menu di navigazione, fai clic su Cloud SQL Studio.

  4. Accedi a Studio e connettiti al database denominato database come utente postgres.

  5. Fai clic su Authenticate (Autentica). Il riquadro Explorer mostra un elenco degli oggetti nel database.

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

  7. Per fornire un accesso limitato alla vista, crea una vista parametrizzata:

    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. Revocare l'accesso diretto alla tabella di base.

    REVOKE ALL PRIVILEGES ON store.checked_items FROM psv_user;
    

    SELECT Inoltre, l'utente della vista con parametri deve disporre di USAGE sullo schema della vista e di SELECT sulla vista. Ad esempio, l'utente postgres è proprietario della vista parametrizzata, quindi dispone dei privilegi SELECT sulle tabelle di base, mentre psv_user deve disporre di USAGE sullo schema store e di SELECT sulla vista.

  11. Assicurati che IAM_USER_EMAIL sia stato aggiunto all'istanza come utente del database IAM, accedi come utente postgres e concedi il ruolo psv_user all'utente autenticato IAM:

    GRANT psv_user TO "IAM_USER_EMAIL";
    

    Sostituisci IAM_USER_EMAIL con l'indirizzo email del tuo utente IAM.

Verifica la sicurezza dei dati

Per verificare che le viste sicure parametrizzate limitino l'accesso alle viste designate, accedi al database come utente autenticato con IAM. In Cloud SQL, 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 alle viste protette parametrizzate 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. Accedi a Google Cloud CLI come IAM_USER_EMAIL eseguendo gcloud auth application-default login in modo che gcloud auth application-default print-access-token generi un token per l'utente database IAM con limitazioni, quindi esegui una query sulle viste sicure parametrizzate utilizzando il metodo queryData con i parametri PSV:

      curl -X POST \
        "https://geminidataanalytics.googleapis.com/v1beta/projects/PROJECT_ID/locations/REGION:queryData" \
        -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
        -H "x-goog-user-project: PROJECT_ID" \
        -H "Content-Type: application/json; charset=utf-8" \
        -d '{
          "prompt": "Show me the checked items.",
          "context": {
            "datasource_references": {
              "cloud_sql_reference": {
                "database_reference": {
                  "engine": "POSTGRESQL",
                  "project_id": "PROJECT_ID",
                  "region": "REGION",
                  "instance_id": "INSTANCE_ID",
                  "database_id": "DATABASE_ID",
                  "table_ids": [
                    "store.secure_checked_items"
                  ]
                }
              }
            },
            "parameterized_secure_view_parameters": {
              "parameters": [
                {
                  "key": "app_end_userid",
                  "value": "303"
                }
              ]
            }
          },
          "generation_options": {
            "generate_query_result": true,
            "generate_natural_language_answer": true,
            "generate_explanation": true
          }
        }'

    Utilizza il campo table_ids in database_reference per assicurarti che QueryData generi SQL solo per la vista sicura con parametri store.secure_checked_items. Se ometti table_ids e il ruolo del database ha accesso SELECT alla tabella di base store.checked_items, QueryData potrebbe eseguire query direttamente sulla tabella di base, ignorando la vista sicura. Specifica il nome della vista qualificato per lo schema, perché i nomi non qualificati in table_ids vengono impostati per impostazione predefinita sullo schema public.

    Sostituisci quanto segue:

    • PROJECT_ID: il tuo ID progetto Google Cloud .
    • REGION: la regione in cui si trova l'istanza Cloud SQL per PostgreSQL.
    • INSTANCE_ID: l'ID dell'istanza Cloud SQL per PostgreSQL.
    • DATABASE_ID: l'ID del tuo database Cloud SQL per PostgreSQL, che in questo tutorial è database.

Esegui la pulizia

Elimina l'istanza

Quando elimini l'istanza che hai creato nella sezione Prima di iniziare, elimini anche tutti gli oggetti che hai creato.

  1. Nella console Google Cloud , vai alla pagina Cloud SQL.

    Vai a Cloud SQL

  2. Seleziona un'istanza dall'elenco.

  3. Fai clic su Elimina.

  4. Conferma di voler eliminare l'istanza inserendo il nome dell'istanza e facendo clic su Elimina.

Passaggi successivi

  • Scopri di più sulle viste sicure parametrizzate.

  • Scopri come utilizzare le viste sicure parametrizzate.