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

1. Introduzione

Controlli di servizio VPC (VPC-SC) è 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 offrono un accesso in stile Zero Trust ai servizi multi-tenant consentendo ai client di limitare l'accesso a IP autorizzati, contesto client e parametri dei dispositivi durante la connessione ai servizi multi-tenant da internet e da altri servizi al fine di ridurre le perdite sia intenzionali che non intenzionali. Come abbiamo visto nel Tutorial I di base sui Controlli di servizio VPC, puoi utilizzare Controlli di servizio VPC per creare perimetri che proteggono le risorse e i dati dei servizi specificati in modo esplicito.

Gli obiettivi di questo tutorial sono:

  • Nozioni di base sui Controlli di servizio VPC
  • Aggiorna un perimetro di servizio e testalo utilizzando la modalità dry run
  • Proteggi due servizi con i Controlli di servizio VPC
  • Risolvi una violazione del traffico in uscita dei Controlli di servizio VPC mentre elenca un oggetto da Cloud Storage

2. Configurazione e requisiti

Per questo tutorial, abbiamo bisogno dei seguenti prerequisiti:

  • Organizzazione Google Cloud.
  • Una cartella all'interno dell'organizzazione.
  • 2 progetti Google Cloud all'interno della stessa organizzazione inseriti nella cartella.
  • Le 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

Configurazione-risorse

  1. Configura le risorse come descritto in "Impostazione delle risorse" sezione del Tutorial I di base 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. In uno degli ambienti di sviluppo, configura gcloud CLI:
  • 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 ulteriori dettagli, 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/le API Cloud, devi abilitare la fatturazione nella console Cloud. L'esecuzione di questo codelab non ha alcun costo. Per arrestare le risorse ed evitare di incorrere in fatturazione dopo questo tutorial, puoi eliminare le risorse che hai creato o eliminare il progetto. I nuovi utenti di Google Cloud sono idonei al 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 listino prezzi.

3. Crea un bucket e un oggetto Storage

Come accennato in precedenza, utilizzeremo le risorse create nel tutorial precedente. Andremo quindi 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 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. Verrà creato un file .txt.
nano hello.txt 

Aggiungi tutto ciò che vuoi nel file di testo.

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

Devi vedere il file hello.txt elencato nella console.

4. API Protect Cloud Storage

Nel codelab precedente abbiamo creato un perimetro e l'API Compute Engine protetta. In questo codelab, modificheremo il perimetro in modalità dry run e aggiungeremo Cloud Storage. Questo ci aiuterà a determinare l'impatto della protezione perimetrale mostrando le violazioni dei Controlli di servizio VPC negli audit log, ma le risorse rimarranno accessibili finché non applichiamo il perimetro.

  1. Nella Console Google, seleziona la tua organizzazione. Accedi ai Controlli di servizio VPC. Assicurati di essere nell'ambito Organizzazione.
  2. Apri Cloud Shell e aggiorna il perimetro Dry Run "SuperProtection" creati 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 limitati

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 lo stato "SuperProtection" il perimetro mostra 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 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 Cloud Storage è protetta in modalità dry run, dovresti essere in grado di elencare le risorse, ma devi visualizzare 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 dell'aspetto del log e possiamo confermare che la violazione è in uscita quando proviamo a elencare i contenuti nel bucket situato 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 nuovamente il bucket di archiviazione per verificare che il perimetro di prova sia stato applicato correttamente.
gcloud storage ls gs://BUCKET_NAME

Ricevi una violazione dei Controlli di servizio VPC nell'interfaccia a riga di comando della VM 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 Controlli di servizio VPC per impedire la lettura dei dati da o la copia di dati in una risorsa esterna al perimetro.

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

Stiamo per risolvere il problema del rifiuto ricevuto dall'interfaccia a riga di comando dell'istanza VM. Analizziamo gli audit log e cerchiamo l'ID univoco di Controlli di servizio VPC.

  1. Vai al selettore 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 di errori. Poiché la chiamata API è stata effettuata dall'istanza VM, l'entità deve essere l'account di servizio Compute Engine "PROJECT_NUMBER-compute@developer.gserviceaccount.com"

Poiché disponiamo già dell'ID univoco di 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 relativi al rifiuto" che aprirà lo strumento per la risoluzione dei problemi di Controlli di servizio VPC.

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

In questo esercizio esamineremo i seguenti aspetti:

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 capire che occorre creare una regola in uscita per consentire all'account di servizio Compute Engine di accedere al bucket di archiviazione da ProjectZ a ProjectX. Possiamo anche vedere che la rete non si trova nello stesso perimetro, quindi dobbiamo consentire la comunicazione VPC con i 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 il criterio 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 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. Nell'interfaccia a riga di comando della VM, prova a elencare gli oggetti nel bucket di archiviazione.
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 per il lettore di oggetti all'account di servizio 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 dall'interfaccia a riga di comando 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. Cosa accade nel download del file? Proviamo.

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

Otteniamo 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

Anche se non è previsto alcun addebito separato per l'utilizzo di Controlli di servizio VPC quando il servizio non è in uso, è consigliabile eseguire la pulizia della configurazione utilizzata in questo lab. 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 e fai clic su Elimina.

da0abf0894fe03cd.png

  1. Per eliminare il perimetro:
  • Nella console Google Cloud, fai clic su Sicurezza, quindi su Controlli di servizio VPC nell'ambito Organizzazione.
  • Nella pagina Controlli di servizio VPC, nella riga della tabella corrispondente al perimetro da eliminare, fai clic su "Elimina icona"
  1. Per eliminare il livello di accesso, completa i seguenti passaggi:
  • Nella console Google Cloud, apri la pagina Gestore contesto accesso nell'ambito Cartella.
  • Nella griglia, nella riga relativa al livello di accesso che vuoi eliminare, fai clic su "Elimina icona" e poi su Elimina.
  1. Per eliminare l'oggetto Storage e il bucket:
  • Nella console Google Cloud, apri la pagina Bucket Cloud Storage .
  • Seleziona la casella di controllo accanto al bucket che hai creato.
  • Fai clic su Elimina.
  • Nella finestra che si apre, conferma di voler eliminare il bucket.
  • Fai clic su Elimina.
  1. Per chiudere il progetto, completa i seguenti passaggi:
  • Nella console Google Cloud, vai alla sezione IAM e Impostazioni amministratore del progetto che vuoi eliminare.
  • Nella piattaforma IAM e Pagina Impostazioni amministratore, fai clic su Arresto.
  • Inserisci l'ID progetto e fai clic su Chiudi comunque.

8. Complimenti!

In questo codelab, hai aggiornato un perimetro di prova di Controlli di servizio VPC, lo hai applicato in modo forzato 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.