Tutorial II sui controlli di servizio VPC - Risoluzione dei problemi relativi alla violazione in uscita

1. Introduzione

I Controlli di servizio VPC (VPC-SC) sono un controllo di sicurezza a livello di organizzazione in Google Cloud che consente ai clienti aziendali di mitigare i rischi di esfiltrazione di dati. I Controlli di servizio VPC consentono l'accesso in modalità Zero Trust ai servizi multi-tenant consentendo ai client di limitare l'accesso agli IP autorizzati, al contesto client e ai parametri dei dispositivi durante la connessione ai servizi multi-tenant da internet e da altri servizi, al fine di ridurre le perdite intenzionali e non intenzionali. Come abbiamo visto in Tutorial di base I sui Controlli di servizio VPC, puoi utilizzare i Controlli di servizio VPC per creare perimetri che proteggono le risorse e i dati dei servizi che specifichi in modo esplicito.

Gli obiettivi di questo tutorial sono:

  • Comprendere le nozioni di base dei Controlli di servizio VPC
  • Aggiornare un perimetro di servizio e testarlo utilizzando la modalità dry run
  • Proteggere due servizi con i Controlli di servizio VPC
  • Risolvere i problemi relativi a una violazione del traffico in uscita dei Controlli di servizio VPC durante l'elenco di un oggetto da Cloud Storage

2. Configurazione e requisiti

Per questo tutorial, sono necessari i seguenti prerequisiti:

dbec101f41102ca2.png

Configurazione delle risorse

  1. Configura le risorse come descritto nella sezione "Configurazione delle risorse" del Tutorial di base I sui Controlli di servizio VPC
  2. Verifica di disporre delle autorizzazioni necessarie per amministrare Cloud Storage.
  3. Per questo tutorial, inizieremo a utilizzare l'interfaccia a riga di comando anziché la console Cloud. Configura gcloud CLI in uno degli ambienti di sviluppo:
  • Cloud Shell: per utilizzare un terminale online con gcloud CLI già configurata, attiva Cloud Shell.

Attiva Cloud Shell facendo clic sull'icona nell'angolo in alto a destra della console Cloud. L'inizializzazione della sessione può richiedere alcuni secondi. Per maggiori dettagli, consulta la guida di Cloud Shell.

a0ceb29950db4eac.png

  • Shell locale: per utilizzare un ambiente di sviluppo locale, installa e inizializza gcloud CLI.

Costo

Devi abilitare la fatturazione nella console Cloud per utilizzare le risorse/API Cloud. Completare questo codelab non costerà molto, se non nulla. Per arrestare le risorse ed evitare addebiti di fatturazione oltre questo tutorial, puoi eliminare le risorse che hai creato o il progetto. I nuovi utenti di Google Cloud possono usufruire del programma di prova senza costi di 300 $.

Le uniche risorse che genereranno un costo sono l'istanza VM e l'oggetto Cloud Storage. Un costo stimato dell'istanza VM è disponibile nel Calcolatore prezzi. Il costo stimato di Cloud Storage è disponibile in questo elenco dei prezzi.

3. Crea un bucket e un oggetto di archiviazione

Come accennato in precedenza, riutilizzeremo le risorse create nel tutorial precedente. Quindi, andremo avanti con la creazione del bucket Cloud Storage. Per questo tutorial, inizieremo a utilizzare gcloud CLI anziché la console.

  1. Nella console Google, seleziona ProjectX. In questo progetto creeremo il bucket di archiviazione e l'oggetto.
  2. Assicurati di impostare Cloud Shell in modo che utilizzi ProjectX eseguendo il comando seguente:
gcloud config set project PROJECT_ID
  1. Nel tuo ambiente di sviluppo, esegui il comando seguente:
gcloud storage buckets create gs://BUCKET_NAME --location=us-central1
  1. Crea un oggetto di archiviazione in modo che possiamo leggerlo dall'istanza VM che si trova in ProjectZ. Creeremo un file .txt.
nano hello.txt 

Aggiungi tutto ciò che vuoi nel file di testo.

  1. Carica l'oggetto nel bucket.
gcloud storage cp /home/${USER}/hello.txt gs://BUCKET_NAME
  1. Verifica che l'oggetto sia stato caricato nel bucket elencandolo.
gcloud storage ls gs://BUCKET_NAME

Dovresti vedere il file hello.txt elencato nella console.

4. Proteggi l'API Cloud Storage

Nel codelab precedente abbiamo creato un perimetro e protetto l'API Compute Engine. In questo codelab, modificheremo il perimetro della modalità dry run e aggiungeremo Cloud Storage. In questo modo potremo determinare l'impatto della protezione del perimetro visualizzando le violazioni dei Controlli di servizio VPC negli audit log, ma le risorse rimarranno accessibili finché non applicheremo il perimetro.

  1. Nella console Google, seleziona la tua organizzazione; accedi ai Controlli di servizio VPC. Assicurati di essere nell'ambito dell'organizzazione.
  2. Apri Cloud Shell e aggiorna il perimetro in modalità dry run "SuperProtection" creato nel lab precedente:
gcloud access-context-manager perimeters dry-run update SuperProtection --policy=POLICY --add-restricted-services=storage.googleapis.com
  1. Verifica che l'API Cloud Storage sia stata aggiornata descrivendo il perimetro
gcloud access-context-manager perimeters dry-run describe SuperProtection --policy=POLICY 

Nell'output, vedrai che l'API Storage è elencata sotto i servizi limitati

insieme all'API Compute Engine, ma con l'etichetta "-vpcAccessibleServices: {}":

2025ddc01a2e9a81.png

5. Verifica che l'API Cloud Storage sia stata protetta

In modalità dry run, verifica che il perimetro "SuperProtection" ci mostri il rifiuto elencando l'oggetto dall'istanza VM creata in ProjectZ a ProjectX, che ospita il bucket di archiviazione.

  1. Nella console Cloud, vai al selettore di progetti e seleziona ProjectZ, quindi vai a Compute Engine > Istanze VM.
  2. Fai clic sul pulsante SSH per connetterti all'istanza VM e accedere alla riga di comando.

5ca02149b78c11f9.png

  1. Elenca il file hello.txt che abbiamo caricato in precedenza.
gcloud storage ls gs://BUCKET_NAME

Poiché l'API Storage di Cloud Storage è protetta in modalità dry run, dovresti essere in grado di elencare le risorse, ma devi avere un messaggio di errore negli audit log di ProjectZ.

  1. Vai all'API Esplora log in ProjectZ e cerca l'ultimo messaggio di errore dei Controlli di servizio VPC. Puoi utilizzare questo filtro per ottenere il log che stiamo cercando:
protoPayload.status.details.violations.type="VPC_SERVICE_CONTROLS"
"(Dry Run Mode) Request is prohibited by organization's policy. vpcServiceControlsUniqueIdentifier:UNIQUE_ID"

Questo filtro ci mostrerà l'ultima violazione in modalità dry run che appartiene a Cloud Storage. Ecco un esempio di come appare il log e possiamo verificare che la violazione sia in uscita quando tentiamo di elencare i contenuti del bucket che si trova in ProjectX.

egressViolations: [
0: {
servicePerimeter: "accessPolicies/POLICY/servicePerimeters/SuperProtection"
source: "projects/PROJECTX_ID"
sourceType: "Network"
targetResource: "projects/PROJECTZ_ID"
}
]
resourceNames: [
0: "projects//buckets/BUCKET_NAME"
]
securityPolicyInfo: {
organizationId: "ORGANIZATION_ID"
servicePerimeterName: "accessPolicies/POLICY/servicePerimeters/SuperProtection"
}
violationReason: "NETWORK_NOT_IN_SAME_SERVICE_PERIMETER"
vpcServiceControlsUniqueId: "UNIQUE_ID"
}
methodName: "google.storage.objects.list"
  1. Poiché abbiamo verificato che la chiamata API a Cloud Storage genera una violazione dei Controlli di servizio VPC, applicheremo il perimetro con la nuova configurazione. Apri Cloud Shell e applica il perimetro di dry run:
gcloud access-context-manager perimeters dry-run enforce SuperProtection --policy=POLICY --async
  1. Connettiti all'istanza VM utilizzando SSH ed elenca di nuovo il bucket di archiviazione per verificare che il perimetro di dry run sia stato applicato correttamente.
gcloud storage ls gs://BUCKET_NAME

Riceveremo una violazione dei Controlli di servizio VPC nella CLI della VM anziché un elenco degli oggetti di archiviazione:

ERROR: (gcloud.storage.ls) User [PROJECT_NUMBER-compute@developer.gserviceaccount.com] does not have permission to access b instance [BUCKET_NAME] (or it may not exist): Request is prohibited by organization's policy. vpcServiceControlsUniqueIdentifier:"UNIQUE_ID"

Abbiamo impedito l'esfiltrazione di dati utilizzando i Controlli di servizio VPC per impedire la lettura o la copia di dati in una risorsa esterna al perimetro.

6. Risoluzione dei problemi relativi al rifiuto dell'elenco.

Risolviamo i problemi relativi al rifiuto che abbiamo ricevuto dalla CLI dell'istanza VM. Controlliamo gli audit log e cerchiamo l'ID univoco dei Controlli di servizio VPC.

  1. Vai al selettore di progetti e seleziona ProjectZ.
  2. Trova l'ID univoco dei Controlli di servizio VPC negli audit log utilizzando la seguente query in Esplora log:
resource.type="audited_resource"
protoPayload.metadata."@type"="type.googleapis.com/google.cloud.audit.VpcServiceControlAuditMetadata"

Verranno visualizzati tutti gli audit log dei Controlli di servizio VPC. Cercheremo l'ultimo log degli errori. Poiché la chiamata API è stata effettuata dall'istanza VM, l'entità deve essere il service account Compute Engine "PROJECT_NUMBER-compute@developer.gserviceaccount.com"".

Poiché abbiamo già l'ID univoco dei Controlli di servizio VPC, possiamo utilizzarlo per ottenere direttamente il log desiderato utilizzando questo filtro:

protoPayload.metadata.vpcServiceControlsUniqueId="UNIQUE_ID"
  1. Fai clic sull'intestazione Controlli di servizio VPC e seleziona "Risolvi i problemi di rifiuto" per aprire lo strumento per la risoluzione dei problemi relativi ai Controlli di servizio VPC.

Questa API ci mostrerà in un'interfaccia utente intuitiva il motivo della violazione e se si trattava di una violazione in entrata o in uscita, tra le altre cose utili.

In questo esercizio cercheremo quanto segue:

authenticationInfo: {
principalEmail: "PROJECT_ID-compute@developer.gserviceaccount.com"
egressViolations: [
0: {
servicePerimeter: "accessPolicies/POLICY/servicePerimeters/SuperProtection"
source: "projects/PROJECTZ_ID"
sourceType: "Network"
targetResource: "projects/PROJECTX_ID"
}
violationReason: "NETWORK_NOT_IN_SAME_SERVICE_PERIMETER"

Queste informazioni sono sufficienti per sapere che dobbiamo creare una regola in uscita per consentire al service account Compute Engine di accedere al bucket di archiviazione da ProjectZ a ProjectX. Inoltre, possiamo vedere che la rete non si trova nello stesso perimetro, quindi dobbiamo consentire la comunicazione VPC ai servizi e condividere i dati tra i perimetri di servizio.

  1. Attiva Cloud Shell e crea un file .yaml con la regola in uscita utilizzando un editor di testo.
nano egresstorage.yaml 
- egressTo:
    operations:
    - serviceName: storage.googleapis.com
      methodSelectors:
      - method: \"*\"
    resources:
    - projects/PROJECTX_ID
 egressFrom:
    identities:
    - serviceAccount:PROJECT_ID-compute@developer.gserviceaccount.com
  1. Aggiorna la policy in entrata che protegge ProjectZ.
gcloud access-context-manager perimeters update SuperProtection --set-egress-policies=egresstorage.yaml --policy=POLICY 

Ora possiamo riprovare ad accedere al bucket dall'istanza VM.

  1. Nella console Cloud, vai al selettore di progetti e seleziona ProjectZ, quindi vai a Compute Engine > Istanze VM.
  2. Fai clic sul pulsante SSH per connetterti all'istanza VM e accedere alla riga di comando.
  3. Una volta nella CLI della VM, prova a elencare gli oggetti nel bucket di archiviazione.
gcloud storage ls gs://BUCKET_NAME/

Verrà visualizzato il seguente messaggio di errore:

ERROR: (gcloud.storage.ls) User [PROJECT_ID-compute@developer.gserviceaccount.com] does not have permission to access b instance [BUCKET_NAME] (or it may not exist): PROJECT_ID-compute@developer.gserviceaccount.com does not have storage.objects.list access to the Google Cloud Storage bucket. Permission 'storage.objects.list' denied on resource (or it may not exist).
  1. Dobbiamo concedere un'autorizzazione di lettura degli oggetti al service account Compute Engine per poter elencare gli oggetti nel bucket di archiviazione.
gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME --member=serviceAccount:PROJECT_ID-compute@developer.gserviceaccount.com --role=roles/storage.objectViewer
  1. Ancora una volta, proviamo a elencare il file hello.txt dalla CLI dell'istanza VM .
gcloud storage ls gs://BUCKET_NAME/
.
.
gs://BUCKET_NAME/hello.txt

Ora possiamo elencare l'oggetto senza una violazione delle autorizzazioni dei Controlli di servizio VPC, ma cosa succede se scarichiamo il file? Proviamo.

gcloud storage cp gs://BUCKET_NAME/hello.txt /home/${USER}

E otterremo il seguente output

Copying gs://BUCKET_NAME/hello.txt to file:///home/${USER}
 Completed files 1/1 | 54.0B/54.0B  

7. Esegui la pulizia

Sebbene non siano previsti addebiti separati per l'utilizzo dei Controlli di servizio VPC quando il servizio non è in uso, è una best practice liberare spazio dalla configurazione utilizzata in questo laboratorio. Puoi anche eliminare l'istanza VM e/o i progetti Cloud per evitare addebiti. L'eliminazione del progetto Cloud interrompe la fatturazione per tutte le risorse utilizzate all'interno del progetto.

  1. Per eliminare l'istanza VM, seleziona la casella di controllo a sinistra del nome dell'istanza VM, quindi fai clic su Elimina.

da0abf0894fe03cd.png

  1. Per eliminare il perimetro, completa i seguenti passaggi:
  • Nella console Google Cloud, fai clic su Sicurezza, quindi su Controlli di servizio VPC nell'ambito dell'organizzazione.
  • Nella pagina Controlli di servizio VPC, nella riga della tabella corrispondente al perimetro che vuoi eliminare, fai clic su "Icona Elimina"
  1. Per eliminare il livello di accesso, completa i seguenti passaggi:
  • Nella console Google Cloud, apri la pagina Gestore contesto accesso nell'ambito della cartella.
  • Nella griglia, nella riga corrispondente al livello di accesso che vuoi eliminare, fai clic su "Icona Elimina", quindi su Elimina.
  1. Per eliminare l'oggetto e il bucket di archiviazione, completa i seguenti passaggi:
  • Nella console Google Cloud, apri la pagina dei bucket Cloud Storage .
  • Seleziona la casella di controllo accanto al bucket che hai creato.
  • Fai clic su Elimina.
  • Nella finestra che si apre, conferma che vuoi eliminare il bucket.
  • Fai clic su Elimina.
  1. Per chiudere il progetto, completa i seguenti passaggi:
  • Nella console Google Cloud, vai alla pagina Impostazioni di IAM e amministrazione del progetto che vuoi eliminare.
  • Nella pagina Impostazioni di IAM e amministrazione, fai clic su Chiudi.
  • Inserisci l'ID progetto e fai clic su Chiudi comunque.

8. Complimenti!

In questo codelab, hai aggiornato un perimetro di dry run dei Controlli di servizio VPC, lo hai applicato e hai risolto i problemi.

Scopri di più

Licenza

Questo lavoro è concesso in licenza ai sensi di una licenza Creative Commons Attribution 2.0 Generic.