Anonimizza i dati BigQuery quando vengono eseguite le query


Questo tutorial mostra come anonimizzare i dati durante l'esecuzione di query sulle tabelle da BigQuery utilizzando le funzioni remote e la protezione dei dati sensibili. Questo approccio è utile per eliminare i risultati delle query in tempo reale e ridurre al minimo l'accesso ai dati non necessari per l'analisi.

Questo tutorial illustra la crittografia e la decrittografia dei dati in transito. Per informazioni sull'utilizzo di Sensitive Data Protection per criptare i dati at-rest, consulta Anonimizzazione dei dati sensibili nello spazio di archiviazione.

Questo tutorial è destinato a segmenti di pubblico le cui responsabilità includono sicurezza dei dati, elaborazione o analisi dei dati. Questa guida presuppone che tu conosca il trattamento e la privacy dei dati; non devi essere un esperto. Questa guida presuppone anche che tu sia in grado di eseguire script di base di Cloud Shell e SQL.

Questo tutorial utilizza funzioni basate su SQL, BigQuery, funzioni remote, Cloud Run e Sensitive Data Protection.

Le tecniche di anonimizzazione, come la crittografia, offuscano gli identificatori sensibili non elaborati nei dati. Queste tecniche ti consentono di preservare l'utilità dei dati per l'unione o l'analisi, riducendo al contempo il rischio di gestione dei dati.

Le aziende potrebbero prevedere criteri o requisiti normativi per archiviare solo dati anonimizzati nel loro data warehouse cloud. Inoltre, potrebbero dover riidentificare in modo efficiente i dati anonimizzati per la generazione dei report.

Per ridurre al minimo il rischio di gestire grandi volumi di dati sensibili, puoi utilizzare una pipeline di trasformazione automatica dei dati per creare set di dati anonimizzati. Puoi utilizzare questo tutorial per sostituire la pipeline con una query SQL solo per la reidentificazione o per l'anonimizzazione e la reidentificazione. Questo tutorial ti aiuta a eseguire sia l'anonimizzazione sia la reidentificazione utilizzando un servizio centrale ospitato su Cloud Run. Puoi utilizzare questo servizio centrale nell'intera organizzazione senza la necessità di configurare o gestire un cluster Dataflow.

Sensitive Data Protection può classificare i set di dati ispezionando i dati per individuare informazioni sensibili. Sensitive Data Protection dispone di più di 150 classificatori integrati, denominati infoTypes. L'utilizzo dell'API Cloud Data Loss Prevention per anonimizzare i dati richiede pipeline di dati e applicazioni. Questo tutorial ha lo scopo di aiutare gli analisti di dati, i tecnici o i data scientist a ottenere lo stesso risultato tramite le funzioni SQL.

Al termine di questo tutorial potrai scrivere una query simile alla seguente; i dati sensibili verranno anonimizzati e nuovamente identificati nel risultato della query.

SELECT
    pii_column,
    fns.dlp_freetext_encrypt(pii_column) AS dlp_encrypted,
    fns.dlp_freetext_decrypt(fns.dlp_freetext_encrypt(pii_column)) AS dlp_decrypted
FROM
    UNNEST(
    [
        'My name is John Doe. My email is [email protected]']) AS pii_column

L'output è simile al seguente:

Riga pii_column dlp_encrypted dlp_decrypted
1 My name is John Doe. My email is [email protected] My name is John Doe. My email is BQ_TRF_EMAIL(40):AQy6lGvwKR+AiiRqJpEr+nBzZUzOcjXkXamUugU= My name is John Doe. My email is [email protected]

Architettura

Il seguente diagramma mostra in che modo questo tutorial utilizza BigQuery come data warehouse, Sensitive Data Protection per anonimizzare e reidentificare i dati e Cloud Run per ospitare le funzioni remote.

Diagramma dell'architettura di alto livello di questo tutorial

Obiettivi

  • Esegui il deployment di un servizio Cloud Run che fornisca funzionalità di anonimizzazione da Sensitive Data Protection.
  • Creare funzioni remote di BigQuery che utilizzano i modelli di anonimizzazione di Sensitive Data Protection.
  • Verifica la crittografia dei dati in BigQuery utilizzando una query SQL.

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 possono essere idonei a una prova senza costi aggiuntivi.

Una volta completate le attività descritte in questo documento, puoi evitare la fatturazione continua eliminando le risorse che hai creato. Per ulteriori informazioni, consulta la pagina Pulizia.

Prima di iniziare

  1. Accedi al tuo account Google Cloud. Se non conosci Google Cloud, crea un account per valutare le prestazioni dei nostri prodotti in scenari reali. I nuovi clienti ricevono anche 300 $di crediti gratuiti per l'esecuzione, il test e il deployment dei carichi di lavoro.
  2. Installa Google Cloud CLI.
  3. Per initialize gcloud CLI, esegui questo comando:

    gcloud init
  4. Crea o seleziona un progetto Google Cloud.

    • Crea un progetto Google Cloud:

      gcloud projects create PROJECT_ID

      Sostituisci PROJECT_ID con un nome per il progetto Google Cloud che stai creando.

    • Seleziona il progetto Google Cloud che hai creato:

      gcloud config set project PROJECT_ID

      Sostituisci PROJECT_ID con il nome del tuo progetto Google Cloud.

  5. Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.

  6. Abilita le API Artifact Registry, BigQuery, API BigQuery Connection, Cloud Build, API Cloud Data Loss Prevention, Cloud Key Management Service, Cloud Run, Container Registry, Identity and Access Management, Resource Manager, Secret Manager e Service Usage.

    gcloud services enable artifactregistry.googleapis.com bigquery.googleapis.com bigqueryconnection.googleapis.com cloudbuild.googleapis.com cloudkms.googleapis.com cloudresourcemanager.googleapis.com containerregistry.googleapis.com dlp.googleapis.com iam.googleapis.com run.googleapis.com secretmanager.googleapis.com serviceusage.googleapis.com
  7. Installa Google Cloud CLI.
  8. Per initialize gcloud CLI, esegui questo comando:

    gcloud init
  9. Crea o seleziona un progetto Google Cloud.

    • Crea un progetto Google Cloud:

      gcloud projects create PROJECT_ID

      Sostituisci PROJECT_ID con un nome per il progetto Google Cloud che stai creando.

    • Seleziona il progetto Google Cloud che hai creato:

      gcloud config set project PROJECT_ID

      Sostituisci PROJECT_ID con il nome del tuo progetto Google Cloud.

  10. Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.

  11. Abilita le API Artifact Registry, BigQuery, API BigQuery Connection, Cloud Build, API Cloud Data Loss Prevention, Cloud Key Management Service, Cloud Run, Container Registry, Identity and Access Management, Resource Manager, Secret Manager e Service Usage.

    gcloud services enable artifactregistry.googleapis.com bigquery.googleapis.com bigqueryconnection.googleapis.com cloudbuild.googleapis.com cloudkms.googleapis.com cloudresourcemanager.googleapis.com containerregistry.googleapis.com dlp.googleapis.com iam.googleapis.com run.googleapis.com secretmanager.googleapis.com serviceusage.googleapis.com

Prepara l'ambiente

  1. In Cloud Shell, clona il repository di origine:

    git clone https://github.com/GoogleCloudPlatform/bigquery-dlp-remote-function.git
    
  2. Vai alla directory di questo tutorial:

    cd bigquery-dlp-remote-function/
    

Esegui il deployment delle risorse utilizzando uno script

Se vuoi utilizzare lo script di deployment senza effettuare personalizzazioni, segui questi passaggi. Se vuoi personalizzare il deployment, salta questa sezione e vedi Eseguire manualmente il deployment di una soluzione personalizzata.

  1. Imposta i valori per i campi PROJECT_ID e REGION:

    # Project ID of the Google Cloud project
    PROJECT_ID="PROJECT_ID"
    
    # Google Cloud region to use for deployment of resources
    # Refer to https://cloud.google.com/about/locations
    REGION="REGION"
    

    Sostituisci quanto segue:

    • PROJECT_ID: l'ID del progetto per questo tutorial.
    • REGION: la regione in cui vuoi archiviare ed elaborare i dati, ad esempio us-west1. Specifica una regione, non una zona.
  2. (Facoltativo) Se vuoi utilizzare un modello di ispezione, imposta il campo DLP_INSPECT_TEMPLATE sul nome completo della risorsa del modello di ispezione. Il modello di ispezione deve trovarsi nella stessa regione impostata nel campo REGION.

    Assicurati che il modello di ispezione includa tutti gli infoType utilizzati nel modello di anonimizzazione.

    Se salti questo passaggio, Sensitive Data Protection esamina i dati con un insieme predefinito di sistema di rilevatori di infoType.

    DLP_INSPECT_TEMPLATE="DLP_INSPECT_TEMPLATE"
    

    Sostituisci DLP_INSPECT_TEMPLATE con il nome completo della risorsa del modello di ispezione, ad esempio projects/PROJECT_ID/locations/REGION/inspectTemplates/TEMPLATE_ID.

  3. Esegui l'autenticazione utilizzando le credenziali predefinite dell'applicazione:

    gcloud auth application-default login && \
    gcloud auth application-default set-quota-project "${PROJECT_ID}"
    
  4. Inizializza ed esegui lo script Terraform per creare tutte le risorse:

    terraform init && \
    terraform apply \
    -var "project_id=${PROJECT_ID}" \
    -var "region=${REGION}" \
    -var "dlp_inspect_template_full_path=${DLP_INSPECT_TEMPLATE}"
    

    Il sistema visualizza tutte le azioni che Terraform eseguirà. Esamina le azioni. Per continuare, inserisci yes.

  5. Verifica che i dati possano essere criptati e decriptati.

Esegui manualmente il deployment di una soluzione personalizzata

Se vuoi personalizzare il deployment, segui questi passaggi. Se vuoi utilizzare lo script di deployment fornito senza personalizzazioni o passaggi manuali, consulta Eseguire il deployment delle risorse utilizzando uno script.

Imposta le variabili di ambiente

In Cloud Shell, imposta le seguenti variabili di ambiente:

PROJECT_ID="PROJECT_ID"
REGION="REGION"
CLOUD_RUN_SERVICE_NAME="CLOUD_RUN_SERVICE_NAME"
ARTIFACT_REGISTRY_NAME="ARTIFACT_DOCKER_REGISTRY_NAME"

Sostituisci quanto segue:

  • PROJECT_ID: l'ID del progetto per questo tutorial.
  • REGION: la regione in cui vuoi archiviare ed elaborare i dati, ad esempio us-west1. Specifica una regione, non una zona.
  • CLOUD_RUN_SERVICE_NAME: un nome per il nuovo servizio Cloud Run. Inserisci fino a 15 caratteri.
  • ARTIFACT_REGISTRY_NAME: un nome per il nuovo Artifact Registry per l'archiviazione delle immagini container.

Crea un account di servizio per il servizio Cloud Run

  1. Crea un account di servizio:

    RUNNER_SA_NAME="${CLOUD_RUN_SERVICE_NAME}-runner"
    RUNNER_SA_EMAIL="${RUNNER_SA_NAME}@${PROJECT_ID}.iam.gserviceaccount.com"
    gcloud iam service-accounts create "${RUNNER_SA_NAME}" \
        --project="${PROJECT_ID}" \
        --description "Runner for BigQuery remote function execution" \
        --display-name "${RUNNER_SA_NAME}"
    
  2. Concedi i ruoli richiesti per la protezione dei dati sensibili.

    Concedi il ruolo Lettore DLP:

    gcloud projects add-iam-policy-binding "${PROJECT_ID}" \
        --member="serviceAccount:${RUNNER_SA_EMAIL}" \
        --role='roles/dlp.reader'
    

    Concedi il ruolo Utente DLP:

    gcloud projects add-iam-policy-binding "${PROJECT_ID}" \
        --member="serviceAccount:${RUNNER_SA_EMAIL}" \
        --role='roles/dlp.user'
    

Esegui il deployment del servizio Cloud Run

Per eseguire il deployment dell'applicazione:

  1. (Facoltativo) Puoi modificare i valori predefiniti cambiando le variabili di ambiente o aggiornando il file src/main/resources/aes.properties.

  2. Crea un repository Artifact Registry per archiviare l'immagine container della funzione:

    gcloud artifacts repositories create "${ARTIFACT_REGISTRY_NAME}" \
    --repository-format=docker \
    --location="${REGION}" \
    --description="Container images repository for BigQuery Functions" \
    --project="${PROJECT_ID}"
    
  3. Compila l'applicazione ed eseguine il deployment su Cloud Run utilizzando Cloud Build:

    gcloud builds submit \
    --project ${PROJECT_ID} \
    --substitutions=_CONTAINER_IMAGE_NAME="${REGION}-docker.pkg.dev/${PROJECT_ID}/${ARTIFACT_REGISTRY_NAME}/${CLOUD_RUN_SERVICE_NAME}:latest" \
    --machine-type=e2-highcpu-8 && \
    gcloud beta run deploy ${CLOUD_RUN_SERVICE_NAME} \
    --image="${REGION}-docker.pkg.dev/${PROJECT_ID}/${ARTIFACT_REGISTRY_NAME}/${CLOUD_RUN_SERVICE_NAME}:latest" \
    --execution-environment=gen2 \
    --platform=managed \
    --region="${REGION}" \
    --service-account="${RUNNER_SA_EMAIL}" \
    --cpu=4 \
    --memory=8Gi \
    --no-allow-unauthenticated \
    --project ${PROJECT_ID} \
    --update-env-vars=PROJECT_ID=${PROJECT_ID}
    

    La fine dell'output è simile alla seguente:

    ID: 403a276e-b0c6-41f3-aaed-f0ec9f9cedba
    CREATE_TIME: 2023-02-04T01:52:15+00:00
    DURATION: 1M59S
    SOURCE: gs://PROJECT_ID_cloudbuild/source/1675475534.124241-9c43787f64e04cfd9e4a1979d3324fe0.tgz
    IMAGES: gcr.io/PROJECT_ID/CLOUD_RUN_SERVICE_NAME (+1 more)
    STATUS: SUCCESS
    Deploying container to Cloud Run service [CLOUD_RUN_SERVICE_NAME] in project [PROJECT_ID] region [REGION]
    OK Deploying new service... Done.
     OK Creating Revision... Revision deployment finished. Checking container heal
     th.
     OK Routing traffic...
    Done.
    Service [CLOUD_RUN_SERVICE_NAME] revision [CLOUD_RUN_SERVICE_NAME-00001-tat] has been deployed and is serving 100 percent of traffic.
    Service URL: https://CLOUD_RUN_SERVICE_NAME-j2bpjx2xoq-uw.a.run.app
    
  4. Recupera l'URL di Cloud Run e salvalo nelle tue variabili di ambiente:

    RUN_URL="$(gcloud run services describe ${CLOUD_RUN_SERVICE_NAME} --region \
        ${REGION} --project ${PROJECT_ID} --format="get(status.address.url)")"
    

Crea un modello di anonimizzazione di Sensitive Data Protection

I modelli di anonimizzazione di Sensitive Data Protection ti consentono di salvare le impostazioni di anonimizzazione in modo da poterle riutilizzare in più operazioni e origini dati.

Questo passaggio utilizza il file sample_dlp_deid_config.json, che contiene un modello di anonimizzazione di esempio.

In Cloud Shell, crea il modello:

DEID_TEMPLATE=$(curl -X POST \
-H "Authorization: Bearer `gcloud auth print-access-token`" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "X-Goog-User-Project: ${PROJECT_ID}" \
--data-binary "@sample_dlp_deid_config.json" \
"https://dlp.googleapis.com/v2/projects/${PROJECT_ID}/locations/${REGION}/deidentifyTemplates")

DEID_TEMPLATE_NAME="$(echo ${DEID_TEMPLATE} | jq -r '.name')"

Google consiglia di utilizzare una chiave con wrapping durante l'esecuzione della crittografia di Sensitive Data Protection su carichi di lavoro sensibili effettivi. A scopo dimostrativo, questo tutorial utilizza una chiave senza wrapping. Per ulteriori informazioni su come creare una chiave con wrapping e utilizzarla nelle richieste di anonimizzazione e reidentificazione, consulta Anonimizzazione e reidentificazione dei dati sensibili.

Crea la connessione BigQuery a Cloud Run

  1. In Cloud Shell, crea una connessione BigQuery per accedere a Cloud Run:

    bq mk --connection \
    --display_name='External transform function connection' \
    --connection_type=CLOUD_RESOURCE \
    --project_id="${PROJECT_ID}" \
    --location="${REGION}" \
    ext-${CLOUD_RUN_SERVICE_NAME}
    
  2. Trova e imposta l'account di servizio BigQuery utilizzato per la connessione:

    CONNECTION_SA="$(bq --project_id ${PROJECT_ID} --format json show \
        --connection ${PROJECT_ID}.${REGION}.ext-${CLOUD_RUN_SERVICE_NAME} \
        | jq -r '.cloudResource.serviceAccountId')"
    
  3. Concedi il ruolo Invoker di Cloud Run all'account di servizio:

    gcloud projects add-iam-policy-binding ${PROJECT_ID} \
        --member="serviceAccount:${CONNECTION_SA}" \
        --role='roles/run.invoker'
    

Creare il set di dati BigQuery per le funzioni remote

  1. Definisci il set di dati BigQuery per le funzioni remote:

    BQ_FUNCTION_DATASET="fns"
    
  2. Crea il set di dati se non esiste già:

       bq mk --dataset \
           --project_id ${PROJECT_ID} \
           --location ${REGION} \
           ${BQ_FUNCTION_DATASET}
    

Creare le funzioni remote di Sensitive Data Protection

  1. (Facoltativo) Se vuoi utilizzare un modello di ispezione, imposta la variabile DLP_INSPECT_TEMPLATE sul nome completo della risorsa del modello di ispezione. Il modello di ispezione deve trovarsi nella stessa regione impostata nella variabile di ambiente REGION.

    Assicurati che il modello di ispezione includa tutti gli infoType utilizzati nel modello di anonimizzazione.

    Se salti questo passaggio, Sensitive Data Protection esamina i dati con un insieme predefinito di sistema di rilevatori di infoType.

    DLP_INSPECT_TEMPLATE="DLP_INSPECT_TEMPLATE"
    

    Sostituisci DLP_INSPECT_TEMPLATE con il nome completo della risorsa del modello di ispezione, ad esempio projects/PROJECT_ID/locations/REGION/inspectTemplates/TEMPLATE_ID.

  2. Crea la funzione di anonimizzazione di Sensitive Data Protection:

    bq query --project_id ${PROJECT_ID} \
    --use_legacy_sql=false \
    "CREATE OR REPLACE FUNCTION ${BQ_FUNCTION_DATASET}.dlp_freetext_encrypt(v STRING)
    RETURNS STRING
    REMOTE WITH CONNECTION \`${PROJECT_ID}.${REGION}.ext-${CLOUD_RUN_SERVICE_NAME}\`
    OPTIONS (endpoint = '${RUN_URL}', user_defined_context = [('mode', 'deidentify'),('algo','dlp'),('dlp-deid-template','${DEID_TEMPLATE_NAME}'),('dlp-inspect-template', '${DLP_INSPECT_TEMPLATE}')]);"
    
  3. Crea la funzione di reidentificazione di Sensitive Data Protection:

    bq query --project_id ${PROJECT_ID} \
    --use_legacy_sql=false \
    "CREATE OR REPLACE FUNCTION ${BQ_FUNCTION_DATASET}.dlp_freetext_decrypt(v STRING)
    RETURNS STRING
    REMOTE WITH CONNECTION \`${PROJECT_ID}.${REGION}.ext-${CLOUD_RUN_SERVICE_NAME}\`
    OPTIONS (endpoint = '${RUN_URL}', user_defined_context = [('mode', 'reidentify'),('algo','dlp'),('dlp-deid-template','${DEID_TEMPLATE_NAME}'),('dlp-inspect-template', '${DLP_INSPECT_TEMPLATE}')]);"
    

Verificare l'anonimizzazione e la reidentificazione

Per verificare se la soluzione anonimizza e reidentifica i dati, segui questi passaggi:

Console

  1. Nella console Google Cloud, vai a BigQuery.

    Vai a BigQuery

    BigQuery si apre nel progetto a cui hai eseguito l'accesso più di recente.

  2. Per aprire un editor query, fai clic su Crea una nuova query.

  3. Inserisci la seguente query:

    SELECT
        pii_column,
        fns.dlp_freetext_encrypt(pii_column) AS dlp_encrypted,
        fns.dlp_freetext_decrypt(fns.dlp_freetext_encrypt(pii_column)) AS dlp_decrypted
    FROM
        UNNEST(
        [
            'My name is John Doe. My email is [email protected]',
            'Some non PII data',
            '650-253-0000',
            'some script with simple number 1234']) AS pii_column
    
  4. Fai clic su Esegui.

bq

  1. Imposta la variabile di ambiente per il set di dati:

    BQ_FUNCTION_DATASET="fns"
    
  2. Esegui la query:

    bq query --project_id ${PROJECT_ID} \
    --use_legacy_sql=false \
    "
    SELECT
      pii_column,
      ${BQ_FUNCTION_DATASET}.dlp_freetext_encrypt(pii_column) AS dlp_encrypted,
    ${BQ_FUNCTION_DATASET}.dlp_freetext_decrypt(${BQ_FUNCTION_DATASET}.dlp_freetext_encrypt(pii_column)) AS dlp_decrypted
    FROM
      UNNEST(
        [
          'My name is John Doe. My email is [email protected]',
          'Some non PII data',
          '650-253-0000',
          'some script with simple number 1234']) AS pii_column"
    

L'output è simile al seguente:

Riga pii_column dlp_encrypted dlp_decrypted
1 My name is John Doe. My email is [email protected] My name is John Doe. My email is BQ_TRF_EMAIL(40):AQy6lGvwKR+AiiRqJpEr+nBzZUzOcjXkXamUugU= My name is John Doe. My email is [email protected]
2 Some non PII data Some non PII data Some non PII data
3 650-253-0000 BQ_TRF_PH(40):AeKpGU5KBXaTyecCun7dv1hHht5w5Q2PTpvkRC4= 650-253-0000
4 some script with simple number 1234 some script with simple number 1234 some script with simple number 1234

Considerazioni

Quando adatti questo tutorial alle tue esigenze, considera quanto segue:

  • L'anonimizzazione e la reidentificazione vengono elaborate tramite un servizio Cloud Run. Esegui il provisioning della CPU e della memoria di Cloud Run in base alle tue esigenze di calcolo. Per maggiori dettagli, consulta Limiti della CPU e limiti di memoria per Cloud Run.
  • Quando usi Sensitive Data Protection, prendi in considerazione i limiti di utilizzo e i consigli per il controllo dei costi.
  • Per controllare i costi e il consumo totale della tua quota di Sensitive Data Protection, limita a massimo 10.000 gli elementi trasmessi tramite la funzione remota di Sensitive Data Protection. La soluzione può raggruppare automaticamente le richieste per gestire in modo controllato i seguenti limiti di richieste di Sensitive Data Protection:

    • Numero massimo di valori della tabella: 50.000
    • Limite di dimensione predefinito della richiesta: 0,5 MB

    I risultati finali e filtrati della query devono essere trasmessi alla funzione Sensitive Data Protection anziché all'origine.

    Per questa soluzione, ogni valore nella colonna pii_column è un elemento, ad esempio My name is John Doe. My email is [email protected] è un elemento.

  • Assicurati che il set di dati BigQuery, il servizio Cloud Run e i modelli di Sensitive Data Protection si trovino nella stessa regione cloud.

Esegui la pulizia

Per evitare che al tuo Account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questo tutorial, elimina il progetto che contiene le risorse oppure mantieni il progetto ed elimina le singole risorse.

    Elimina un progetto Google Cloud:

    gcloud projects delete PROJECT_ID

Passaggi successivi