mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-03-12 21:22:57 -07:00
Translated ['', 'src/pentesting-cloud/gcp-security/gcp-services/gcp-kms-
This commit is contained in:
@@ -12,7 +12,7 @@ Trova informazioni di base su KMS in:
|
|||||||
|
|
||||||
### `cloudkms.cryptoKeyVersions.destroy`
|
### `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:
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
@@ -65,18 +65,32 @@ destroy_key_version(project_id, location_id, key_ring_id, key_id, key_version)
|
|||||||
|
|
||||||
### KMS Ransomware
|
### 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:
|
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
|
```bash
|
||||||
gcloud kms import-jobs create [IMPORT_JOB] --location [LOCATION] --keyring [KEY_RING] --import-method [IMPORT_METHOD] --protection-level [PROTECTION_LEVEL] --target-key [KEY]
|
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)
|
- Impostala come **versione predefinita** (per i dati futuri che verranno crittografati)
|
||||||
- **Racifra i dati più vecchi** cifrati con la versione precedente usando quella nuova.
|
- **Ricrittografa i dati più vecchi** crittografati con la versione precedente utilizzando quella nuova.
|
||||||
- **Elimina la chiave KMS**
|
- **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:
|
#### Ecco i passaggi per importare una nuova versione e disabilitare/eliminare i dati più vecchi:
|
||||||
|
|
||||||
@@ -162,7 +176,7 @@ gcloud kms keys versions destroy \
|
|||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Crittografa i dati con una chiave simmetrica (Python)</summary>
|
<summary>Cifrare i dati con una chiave simmetrica (Python)</summary>
|
||||||
```python
|
```python
|
||||||
from google.cloud import kms
|
from google.cloud import kms
|
||||||
import base64
|
import base64
|
||||||
@@ -203,7 +217,7 @@ print('Ciphertext:', ciphertext)
|
|||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Firma un messaggio con chiave asimmetrica (Python)</summary>
|
<summary>Firma un messaggio con una chiave asimmetrica (Python)</summary>
|
||||||
```python
|
```python
|
||||||
import hashlib
|
import hashlib
|
||||||
from google.cloud import kms
|
from google.cloud import kms
|
||||||
@@ -243,7 +257,7 @@ print('Signature:', signature)
|
|||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Verificare la firma con chiave asimmetrica (Python)</summary>
|
<summary>Verifica della firma con chiave asimmetrica (Python)</summary>
|
||||||
```python
|
```python
|
||||||
from google.cloud import kms
|
from google.cloud import kms
|
||||||
import hashlib
|
import hashlib
|
||||||
@@ -271,7 +285,7 @@ verified = verify_asymmetric_signature(project_id, location_id, key_ring_id, key
|
|||||||
print('Verified:', verified)
|
print('Verified:', verified)
|
||||||
```
|
```
|
||||||
### `cloudkms.cryptoKeyVersions.restore`
|
### `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
|
```bash
|
||||||
gcloud kms keys versions restore <VERSION_ID> \
|
gcloud kms keys versions restore <VERSION_ID> \
|
||||||
--key=<KEY_NAME> \
|
--key=<KEY_NAME> \
|
||||||
|
|||||||
@@ -4,40 +4,53 @@
|
|||||||
|
|
||||||
## KMS
|
## 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.
|
- **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.
|
||||||
- **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.
|
- **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.
|
||||||
- **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**.
|
- **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.
|
- **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.
|
||||||
- **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)
|
- **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)
|
||||||
- **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.
|
- **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.
|
||||||
- **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)
|
- **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)
|
||||||
- **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.
|
- **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.
|
||||||
- **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)
|
- **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)
|
||||||
- **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.
|
- **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.
|
||||||
- **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)
|
- **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
|
```bash
|
||||||
# List the global keyrings available
|
# List the global keyrings available
|
||||||
gcloud kms keyrings list --location global
|
gcloud kms keyrings list --location global
|
||||||
@@ -61,13 +74,13 @@ gcloud kms decrypt --ciphertext-file=[INFILE] \
|
|||||||
--keyring [KEYRING] \
|
--keyring [KEYRING] \
|
||||||
--location global
|
--location global
|
||||||
```
|
```
|
||||||
### Escalation dei privilegi
|
### Privilege Escalation
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
../gcp-privilege-escalation/gcp-kms-privesc.md
|
../gcp-privilege-escalation/gcp-kms-privesc.md
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
### Post Sfruttamento
|
### Post Exploitation
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
../gcp-post-exploitation/gcp-kms-post-exploitation.md
|
../gcp-post-exploitation/gcp-kms-post-exploitation.md
|
||||||
|
|||||||
Reference in New Issue
Block a user