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 nel tutorial di base sui Controlli di servizio VPC I, 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
  • Aggiorna un perimetro di servizio e testalo utilizzando la modalità dry run
  • Proteggere due servizi con i Controlli di servizio VPC
  • Risolvere i problemi di una violazione 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:

  • Organizzazione Google Cloud.
  • Una cartella nell'organizzazione.
  • Due progetti GCP all'interno della stessa organizzazione inseriti nella cartella.
  • Autorizzazioni richieste a livello di organizzazione.
  • Account di fatturazione per entrambi i progetti.
  • Tutorial di base sui Controlli di servizio VPC I: configurazione dei Controlli di servizio VPC e di Gestore contesto accesso.

dbec101f41102ca2.png

Resources-setup

  1. Configura le risorse come descritto nella sezione "Configurazione delle risorse" del tutorial di base sui Controlli di servizio VPC I.
  2. Verifica di disporre delle autorizzazioni necessarie per amministrare Cloud Storage.
  3. Per questo tutorial, inizieremo a utilizzare la CLI 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 saperne di più, consulta la guida di Cloud Shell.

a0ceb29950db4eac.png

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

Costo

Per utilizzare le risorse/API Cloud, devi abilitare la fatturazione in Cloud Console. Completare questo codelab non costa molto, se non nulla. Per arrestare le risorse ed evitare addebiti oltre a quelli previsti in questo tutorial, puoi eliminare le risorse che hai creato o il progetto. I nuovi utenti di Google Cloud possono beneficiare 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. Continueremo 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 Storage e l'oggetto.
  2. Assicurati di impostare Cloud Shell in modo che utilizzi ProjectX eseguendo questo comando:
gcloud config set project PROJECT_ID
  1. Nel tuo ambiente di sviluppo, esegui questo comando:
gcloud storage buckets create gs://BUCKET_NAME --location=us-central1
  1. Crea un oggetto di archiviazione in modo da poterlo leggere 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

Devi visualizzare il file hello.txt elencato nella console.

4. Proteggere 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à prova generale e aggiungeremo Cloud Storage. Ciò ci aiuterà a determinare l'impatto della protezione del perimetro mostrandoci le violazioni dei Controlli di servizio VPC nei log di controllo, 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 trovarti nell'ambito dell'organizzazione.
  2. Apri Cloud Shell e aggiorna il perimetro di simulazione "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 Cloud Storage è elencata sotto i servizi con limitazioni

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

2025ddc01a2e9a81.png

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

In modalità Dry Run, verifica che il perimetro "SuperProtection" mostri il rifiuto elencando l'oggetto dall'istanza VM creata in ProjectZ a ProjectX, che ospita il bucket Storage.

  1. Nella console Google Cloud, vai al selettore di progetti e seleziona ProjectZ, poi vai a Compute Engine > Istanze VM.
  2. Fai clic sul pulsante SSH per connetterti all'istanza VM e accedere alla relativa 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 Cloud Storage è protetta in modalità di prova, dovresti essere in grado di elencare le risorse, ma devi avere un messaggio di errore nei log di controllo di ProjectZ.

  1. Vai all'API Explorer log nel progetto Z 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 mostrerà l'ultima violazione in modalità test di prova che appartiene a Cloud Storage. Ecco un esempio di come appare il log e possiamo verificare che la violazione è in uscita quando tentiamo di elencare i contenuti nel 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 prova:
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 prova sia stato applicato correttamente.
gcloud storage ls gs://BUCKET_NAME

Nella CLI della VM verrà visualizzata una violazione dei Controlli di servizio VPC anziché un elenco degli oggetti Storage:

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 della lista.

Risolviamo il problema del rifiuto ricevuto dalla CLI dell'istanza VM. Controlliamo gli audit log e cerchiamo l'ID univoco dei Controlli di servizio VPC.

  1. Vai al selettore dei 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 il log desiderato direttamente utilizzando questo filtro:

protoPayload.metadata.vpcServiceControlsUniqueId="UNIQUE_ID"
  1. Fai clic sull'intestazione Controlli di servizio VPC e seleziona "Risolvi i problemi di rifiuto", che aprirà lo strumento per la risoluzione dei problemi relativi a 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, oltre ad altre informazioni 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 farci capire che dobbiamo creare una regola di uscita per consentire al service account di Compute Engine di accedere al bucket di archiviazione dal progetto Z al progetto X. 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 di 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 Google Cloud, vai al selettore di progetti e seleziona ProjectZ, poi vai a Compute Engine > Istanze VM.
  2. Fai clic sul pulsante SSH per connetterti all'istanza VM e accedere alla relativa riga di comando.
  3. Una volta nella CLI della VM, prova a elencare gli oggetti nel bucket Storage.
gcloud storage ls gs://BUCKET_NAME/

Riceverai 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 Storage.
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 violare l'autorizzazione dei Controlli di servizio VPC, ma cosa succede al download del 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 pulire la 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 al suo interno.

  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" e poi su Elimina.
  1. Per eliminare l'oggetto Storage e il bucket, 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 arrestare il progetto, completa i seguenti passaggi:
  • Nella console Google Cloud, vai alla pagina Impostazioni IAM e amministrazione del progetto che vuoi eliminare.
  • Nella pagina delle impostazioni IAM e amministrazione, fai clic su Arresto.
  • 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 ne hai risolto i problemi.

Scopri di più

Licenza

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