# GCP - KMS Enum

{{#include ../../../banners/hacktricks-training.md}}

## KMS

[**Cloud Key Management Service**](https://cloud.google.com/kms/docs/) služi kao sigurno skladište za **kriptografske ključeve**, koji su neophodni za operacije poput **šifrovanja i dešifrovanja osetljivih podataka**. Ovi ključevi su organizovani unutar ključnih prstenova, što omogućava strukturirano upravljanje. Pored toga, kontrola pristupa može se pažljivo konfigurisati, bilo na nivou pojedinačnog ključa ili za ceo ključni prsten, osiguravajući da su dozvole precizno usklađene sa bezbednosnim zahtevima.

KMS ključni prstenovi se po **defaultu kreiraju kao globalni**, što znači da su ključevi unutar tog ključnog prstena dostupni iz bilo koje regije. Međutim, moguće je kreirati specifične ključne prstenove u **specifičnim regijama**.

### Nivo zaštite ključeva

- **Softverski ključevi**: Softverski ključevi se **kreiraju i upravljaju isključivo putem KMS-a**. Ovi ključevi **nisu zaštićeni nijednim hardverskim bezbednosnim modulom (HSM)** i mogu se koristiti za **testiranje i razvoj**. Softverski ključevi se **ne preporučuju za proizvodnu** upotrebu jer pružaju nisku bezbednost i podložni su napadima.
- **Ključevi u oblaku**: Ključevi u oblaku se **kreiraju i upravljaju putem KMS-a** u oblaku koristeći visoko dostupnu i pouzdanu infrastrukturu. Ovi ključevi su **zaštićeni HSM-ima**, ali HSM-ovi nisu **posvećeni određenom korisniku**. Ključevi u oblaku su pogodni za većinu proizvodnih slučajeva.
- **Eksterni ključevi**: Eksterni ključevi se **kreiraju i upravljaju van KMS-a**, i uvoze se u KMS za korišćenje u kriptografskim operacijama. Eksterni ključevi **mogu biti pohranjeni u hardverskom bezbednosnom modulu (HSM) ili softverskoj biblioteci, u zavisnosti od preferencija korisnika**.

### Svrhe ključeva

- **Simetrično šifrovanje/dešifrovanje**: Koristi se za **šifrovanje i dešifrovanje podataka koristeći jedan ključ za obe operacije**. Simetrični ključevi su brzi i efikasni za šifrovanje i dešifrovanje velikih količina podataka.
- **Podržano**: [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)
- **Asimetrično potpisivanje**: Koristi se za sigurnu komunikaciju između dve strane bez deljenja ključa. Asimetrični ključevi dolaze u paru, koji se sastoji od **javnog ključa i privatnog ključa**. Javni ključ se deli sa drugima, dok se privatni ključ čuva u tajnosti.
- **Podržano:** [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)
- **Asimetrično dešifrovanje**: Koristi se za verifikaciju autentičnosti poruke ili podataka. Digitalni potpis se kreira koristeći privatni ključ i može se verifikovati koristeći odgovarajući javni ključ.
- **Podržano:** [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 potpisivanje**: Koristi se za osiguranje **integriteta i autentičnosti podataka kreiranjem koda za autentifikaciju poruka (MAC) koristeći tajni ključ**. HMAC se često koristi za autentifikaciju poruka u mrežnim protokolima i softverskim aplikacijama.
- **Podržano:** [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)

### Period rotacije i period programiran za uništenje

Po **defaultu**, svaki **90 dana**, ali se može **lako** i **potpuno prilagoditi.**

Period "Programiran za uništenje" je **vreme od kada korisnik zatraži brisanje ključa** do trenutka kada je ključ **obrisan**. Ne može se promeniti nakon što je ključ kreiran (default 1 dan).

### Primarna verzija

Svaki KMS ključ može imati nekoliko verzija, jedna od njih mora biti **default** verzija, koja će se koristiti kada **verzija nije specificirana prilikom interakcije sa KMS ključem**.

### Enumeracija

Imajući **dozvole za listanje ključeva**, ovako možete pristupiti njima:
```bash
# List the global keyrings available
gcloud kms keyrings list --location global
gcloud kms keyrings get-iam-policy <KEYRING>

# List the keys inside a keyring
gcloud kms keys list --keyring <KEYRING> --location <global/other_locations>
gcloud kms keys get-iam-policy <KEY>

# Encrypt a file using one of your keys
gcloud kms encrypt --ciphertext-file=[INFILE] \
--plaintext-file=[OUTFILE] \
--key [KEY] \
--keyring [KEYRING] \
--location global

# Decrypt a file using one of your keys
gcloud kms decrypt --ciphertext-file=[INFILE] \
--plaintext-file=[OUTFILE] \
--key [KEY] \
--keyring [KEYRING] \
--location global
```
### Eskalacija privilegija

{{#ref}}
../gcp-privilege-escalation/gcp-kms-privesc.md
{{#endref}}

### Post Eksploatacija

{{#ref}}
../gcp-post-exploitation/gcp-kms-post-exploitation.md
{{#endref}}

## Reference

- [https://about.gitlab.com/blog/2020/02/12/plundering-gcp-escalating-privileges-in-google-cloud-platform/#reviewing-stackdriver-logging](https://about.gitlab.com/blog/2020/02/12/plundering-gcp-escalating-privileges-in-google-cloud-platform/#reviewing-stackdriver-logging)

{{#include ../../../banners/hacktricks-training.md}}
