diff --git a/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-kms-post-exploitation.md b/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-kms-post-exploitation.md index 471cc3503..80913e714 100644 --- a/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-kms-post-exploitation.md +++ b/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-kms-post-exploitation.md @@ -12,7 +12,7 @@ Trova informazioni di base su KMS in: ### `cloudkms.cryptoKeyVersions.destroy` -Un attacker con questo permesso potrebbe distruggere una versione KMS. Per farlo devi prima disabilitare la chiave e poi distruggerla: +Un attacker con questa permission potrebbe distruggere una versione KMS. Per farlo devi prima disabilitare la key e poi distruggerla:
@@ -65,18 +65,32 @@ destroy_key_version(project_id, location_id, key_ring_id, key_id, key_version) ### KMS Ransomware -In AWS è possibile rubare completamente una chiave KMS modificando la resource policy di KMS e permettendo che solo l'account dell'attaccante utilizzi la chiave. Poiché queste resource policy non esistono in GCP, questo non è possibile. +In AWS è possibile completamente **rubare una chiave KMS** modificando la resource policy di KMS e consentendo che solo l'account dell'attaccante possa usare la chiave. Poiché queste resource policy non esistono in GCP, ciò non è possibile. Tuttavia, esiste un altro modo per eseguire un KMS Ransomware globale, che comporterebbe i seguenti passaggi: -- Creare una nuova **versione della chiave con il materiale della chiave** importato dall'attaccante +- Creare una nuova **versione della chiave con materiale della chiave** importato dall'attaccante ```bash gcloud kms import-jobs create [IMPORT_JOB] --location [LOCATION] --keyring [KEY_RING] --import-method [IMPORT_METHOD] --protection-level [PROTECTION_LEVEL] --target-key [KEY] ``` -- Impostalo come **versione predefinita** (per i dati futuri che verranno cifrati) -- **Racifra i dati più vecchi** cifrati con la versione precedente usando quella nuova. +- Impostala come **versione predefinita** (per i dati futuri che verranno crittografati) +- **Ricrittografa i dati più vecchi** crittografati con la versione precedente utilizzando quella nuova. - **Elimina la chiave KMS** -- Ora solo l'attaccante, che possiede il materiale della chiave originale, potrebbe essere in grado di decifrare i dati cifrati +- Ora solo l'attaccante, che possiede il materiale chiave originale, potrebbe essere in grado di decifrare i dati crittografati + +#### Cloud Storage + CMEK modello delle autorizzazioni + +Quando gli oggetti in Cloud Storage sono crittografati con CMEK, le chiamate di decrypt/encrypt a KMS sono effettuate dall'**agente di servizio di Cloud Storage del progetto il cui indirizzo email è service-${BUCKET_PROJECT_NUMBER}@gs-project-accounts.iam.gserviceaccount.com)**, non direttamente dall'utente finale che legge l'oggetto. + +Questo significa che per leggere qualcosa crittografata con CMEK: + +- L'agente di Cloud Storage del progetto deve avere permessi KMS sulla chiave KMS usata (tipicamente `roles/cloudkms.cryptoKeyEncrypterDecrypter`). +- L'utente ha bisogno solo dei permessi di lettura dell'oggetto (per esempio `storage.objects.get`). Non necessita di permessi sulla chiave KMS. + +Questo significa che per controllare l'accesso ai dati crittografati con la chiave KMS è necessario aggiungere/rimuovere permessi KMS per l'agente di Cloud Storage del progetto. + +Nota che un binding a livello di progetto come `roles/cloudkms.cryptoKeyEncrypterDecrypter` per l'agente del servizio Storage consentirà comunque la decrittazione con le chiavi nello stesso progetto. + #### Ecco i passaggi per importare una nuova versione e disabilitare/eliminare i dati più vecchi: @@ -162,7 +176,7 @@ gcloud kms keys versions destroy \
-Crittografa i dati con una chiave simmetrica (Python) +Cifrare i dati con una chiave simmetrica (Python) ```python from google.cloud import kms import base64 @@ -203,7 +217,7 @@ print('Ciphertext:', ciphertext)
-Firma un messaggio con chiave asimmetrica (Python) +Firma un messaggio con una chiave asimmetrica (Python) ```python import hashlib from google.cloud import kms @@ -243,7 +257,7 @@ print('Signature:', signature)
-Verificare la firma con chiave asimmetrica (Python) +Verifica della firma con chiave asimmetrica (Python) ```python from google.cloud import kms import hashlib @@ -271,7 +285,7 @@ verified = verify_asymmetric_signature(project_id, location_id, key_ring_id, key print('Verified:', verified) ``` ### `cloudkms.cryptoKeyVersions.restore` -Il permesso `cloudkms.cryptoKeyVersions.restore` consente a un'identità di ripristinare una versione di chiave che era stata precedentemente programmata per la distruzione o disabilitata in Cloud KMS, riportandola in uno stato attivo e utilizzabile. +L'autorizzazione `cloudkms.cryptoKeyVersions.restore` permette a un'identità di ripristinare una versione di chiave che è stata precedentemente programmata per la distruzione o disabilitata in Cloud KMS, riportandola a uno stato attivo e utilizzabile. ```bash gcloud kms keys versions restore \ --key= \ diff --git a/src/pentesting-cloud/gcp-security/gcp-services/gcp-kms-enum.md b/src/pentesting-cloud/gcp-security/gcp-services/gcp-kms-enum.md index 3dc95a56d..7898a16a7 100644 --- a/src/pentesting-cloud/gcp-security/gcp-services/gcp-kms-enum.md +++ b/src/pentesting-cloud/gcp-security/gcp-services/gcp-kms-enum.md @@ -4,40 +4,53 @@ ## KMS -Il [**Cloud Key Management Service**](https://cloud.google.com/kms/docs/) funge da archiviazione sicura per le **chiavi crittografiche**, essenziali per operazioni come **la crittografia e la decrittografia dei dati sensibili**. Queste chiavi sono organizzate all'interno di anelli di chiavi, consentendo una gestione strutturata. Inoltre, il controllo degli accessi può essere configurato in modo meticoloso, sia a livello di singola chiave che per l'intero anello di chiavi, garantendo che i permessi siano precisamente allineati con i requisiti di sicurezza. +The [**Cloud Key Management Service**](https://cloud.google.com/kms/docs/) funge da archivio sicuro per le **chiavi crittografiche**, essenziali per operazioni come **cifratura e decifratura di dati sensibili**. Queste chiavi sono organizzate all'interno di key rings, permettendo una gestione strutturata. Inoltre, il controllo degli accessi può essere configurato in modo dettagliato, sia a livello di singola key sia per l'intero key ring, garantendo che i permessi siano allineati ai requisiti di sicurezza. -Gli anelli di chiavi KMS sono **creati per impostazione predefinita come globali**, il che significa che le chiavi all'interno di quell'anello di chiavi sono accessibili da qualsiasi regione. Tuttavia, è possibile creare anelli di chiavi specifici in **regioni specifiche**. +KMS key rings are by **default created as global**, il che significa che le chiavi all'interno di quel key ring sono accessibili da qualsiasi regione. Tuttavia, è possibile creare key rings specifici in **regioni specifiche**. -### Livello di Protezione delle Chiavi +### Key Protection Level -- **Chiavi software**: Le chiavi software sono **create e gestite interamente da KMS in software**. Queste chiavi **non sono protette da alcun modulo di sicurezza hardware (HSM)** e possono essere utilizzate per **test e sviluppo**. Le chiavi software **non sono raccomandate per l'uso in produzione** perché offrono bassa sicurezza e sono suscettibili ad attacchi. -- **Chiavi ospitate nel cloud**: Le chiavi ospitate nel cloud sono **create e gestite da KMS** nel cloud utilizzando un'infrastruttura altamente disponibile e affidabile. Queste chiavi sono **protette da HSM**, ma gli HSM **non sono dedicati a un cliente specifico**. Le chiavi ospitate nel cloud sono adatte per la maggior parte dei casi d'uso in produzione. -- **Chiavi esterne**: Le chiavi esterne sono **create e gestite al di fuori di KMS**, e vengono importate in KMS per l'uso in operazioni crittografiche. Le chiavi esterne **possono essere memorizzate in un modulo di sicurezza hardware (HSM) o in una libreria software, a seconda delle preferenze del cliente**. +- **Software keys**: Le software keys sono **create e gestite interamente da KMS in software**. Queste chiavi **non sono protette da alcun hardware security module (HSM)** e possono essere usate per **test e sviluppo**. Le software keys **non sono raccomandate per l'uso in produzione** perché offrono una sicurezza ridotta e sono suscettibili ad attacchi. +- **Cloud-hosted keys**: Le cloud-hosted keys sono **create e gestite da KMS** nel cloud utilizzando un'infrastruttura altamente disponibile e affidabile. Queste chiavi sono **protette da HSM**, ma gli HSM **non sono dedicati a un cliente specifico**. Le cloud-hosted keys sono adatte per la maggior parte dei casi d'uso in produzione. +- **External keys**: Le external keys sono **create e gestite al di fuori di KMS**, e vengono importate in KMS per l'uso nelle operazioni crittografiche. Le external keys **possono essere memorizzate in un hardware security module (HSM) o in una libreria software, a seconda della preferenza del cliente**. -### Scopi delle Chiavi +### Key Purposes -- **Crittografia/decrittografia simmetrica**: Utilizzata per **crittografare e decrittografare i dati utilizzando una singola chiave per entrambe le operazioni**. Le chiavi simmetriche sono veloci ed efficienti per crittografare e decrittografare grandi volumi di dati. -- **Supportato**: [cryptoKeys.encrypt](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys/encrypt), [cryptoKeys.decrypt](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys/decrypt) -- **Firma asimmetrica**: Utilizzata per comunicazioni sicure tra due parti senza condividere la chiave. Le chiavi asimmetriche vengono fornite in coppia, consistenti in una **chiave pubblica e una chiave privata**. La chiave pubblica è condivisa con altri, mentre la chiave privata è mantenuta segreta. -- **Supportato:** [cryptoKeyVersions.asymmetricSign](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys.cryptoKeyVersions/asymmetricSign), [cryptoKeyVersions.getPublicKey](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys.cryptoKeyVersions/getPublicKey) -- **Decrittografia asimmetrica**: Utilizzata per verificare l'autenticità di un messaggio o di dati. Una firma digitale viene creata utilizzando una chiave privata e può essere verificata utilizzando la corrispondente chiave pubblica. -- **Supportato:** [cryptoKeyVersions.asymmetricDecrypt](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys.cryptoKeyVersions/asymmetricDecrypt), [cryptoKeyVersions.getPublicKey](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys.cryptoKeyVersions/getPublicKey) -- **Firma MAC**: Utilizzata per garantire **l'integrità e l'autenticità dei dati creando un codice di autenticazione del messaggio (MAC) utilizzando una chiave segreta**. L'HMAC è comunemente utilizzato per l'autenticazione dei messaggi nei protocolli di rete e nelle applicazioni software. -- **Supportato:** [cryptoKeyVersions.macSign](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys.cryptoKeyVersions/macSign), [cryptoKeyVersions.macVerify](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys.cryptoKeyVersions/macVerify) +- **Symmetric encryption/decryption**: Usato per **cifrare e decifrare dati usando una singola chiave per entrambe le operazioni**. Le symmetric keys sono veloci ed efficienti per cifrare e decifrare grandi volumi di dati. +- **Supported**: [cryptoKeys.encrypt](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys/encrypt), [cryptoKeys.decrypt](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys/decrypt) +- **Asymmetric Signing**: Usato per comunicazioni sicure tra due parti senza condividere la chiave. Le asymmetric keys sono in coppia, composte da una **chiave pubblica e una chiave privata**. La chiave pubblica viene condivisa, mentre la chiave privata viene mantenuta segreta. +- **Supported:** [cryptoKeyVersions.asymmetricSign](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys.cryptoKeyVersions/asymmetricSign), [cryptoKeyVersions.getPublicKey](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys.cryptoKeyVersions/getPublicKey) +- **Asymmetric Decryption**: Usato per verificare l'autenticità di un messaggio o dato. Una firma digitale viene creata usando una chiave privata e può essere verificata con la corrispondente chiave pubblica. +- **Supported:** [cryptoKeyVersions.asymmetricDecrypt](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys.cryptoKeyVersions/asymmetricDecrypt), [cryptoKeyVersions.getPublicKey](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys.cryptoKeyVersions/getPublicKey) +- **MAC Signing**: Usato per garantire **l'integrità e l'autenticità dei dati creando un message authentication code (MAC) usando una chiave segreta**. HMAC è comunemente usato per l'autenticazione dei messaggi in protocolli di rete e applicazioni software. +- **Supported:** [cryptoKeyVersions.macSign](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys.cryptoKeyVersions/macSign), [cryptoKeyVersions.macVerify](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys.cryptoKeyVersions/macVerify) -### Periodo di Rotazione & Periodo Programmato per la Distruzione +### Rotation Period & Programmed for destruction period -Per **impostazione predefinita**, ogni **90 giorni**, ma può essere **facilmente** e **completamente personalizzato.** +Per **default**, ogni **90 giorni**, ma può essere **facilmente** e **completamente personalizzato.** -Il periodo "Programmato per la distruzione" è il **tempo trascorso da quando l'utente richiede la cancellazione della chiave** fino a quando la chiave è **cancellata**. Non può essere modificato dopo la creazione della chiave (impostazione predefinita 1 giorno). +Il periodo "Programmed for destruction" è il **tempo che intercorre da quando l'utente richiede la cancellazione della key** fino a quando la key è **eliminata**. Non può essere modificato dopo la creazione della key (default 1 giorno). -### Versione Primaria +### Primary Version -Ogni chiave KMS può avere diverse versioni, una di esse deve essere quella **predefinita**, questa sarà quella utilizzata quando **non viene specificata una versione durante l'interazione con la chiave KMS**. +Ogni KMS key può avere diverse versioni; una di queste deve essere quella **predefinita** (default), che sarà quella utilizzata quando **una versione non viene specificata durante l'interazione con la KMS key**. -### Enumerazione +### CMEK permission model -Avendo **permessi per elencare le chiavi**, ecco come puoi accedervi: +Quando gli oggetti in Cloud Storage sono crittografati con CMEK, le chiamate di decrypt/encrypt verso KMS sono effettuate dall'agent di servizio Cloud Storage del progetto, il cui indirizzo email è service-${BUCKET_PROJECT_NUMBER}@gs-project-accounts.iam.gserviceaccount.com, non direttamente dall'utente finale che legge l'oggetto. + +Questo significa che per leggere qualcosa criptato con una CMEK: + +- L'agent di servizio Cloud Storage del progetto deve avere permessi KMS sulla KMS key usata (tipicamente `roles/cloudkms.cryptoKeyEncrypterDecrypter`). +- L'utente ha bisogno solo dei permessi di lettura sull'oggetto (per esempio `storage.objects.get`). Non ha bisogno di permessi sulla KMS key. + +Questo implica che per controllare l'accesso ai dati crittografati con la KMS key è necessario aggiungere/rimuovere i permessi KMS all'agent di servizio Cloud Storage del progetto. + +Nota che un binding a livello di progetto come `roles/cloudkms.cryptoKeyEncrypterDecrypter` per lo Storage service agent consentirà comunque la decryption con le chiavi nello stesso progetto. + +### Enumeration + +Avere **i permessi per elencare le chiavi** — ecco come puoi accedervi: ```bash # List the global keyrings available gcloud kms keyrings list --location global @@ -61,13 +74,13 @@ gcloud kms decrypt --ciphertext-file=[INFILE] \ --keyring [KEYRING] \ --location global ``` -### Escalation dei privilegi +### Privilege Escalation {{#ref}} ../gcp-privilege-escalation/gcp-kms-privesc.md {{#endref}} -### Post Sfruttamento +### Post Exploitation {{#ref}} ../gcp-post-exploitation/gcp-kms-post-exploitation.md