# GCP - KMS Enum

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

## KMS

Le [**Cloud Key Management Service**](https://cloud.google.com/kms/docs/) sert de stockage sécurisé pour les **clés cryptographiques**, qui sont essentielles pour des opérations telles que **le chiffrement et le déchiffrement de données sensibles**. Ces clés sont organisées au sein de bagues de clés, permettant une gestion structurée. De plus, le contrôle d'accès peut être méticuleusement configuré, soit au niveau de la clé individuelle, soit pour l'ensemble de la bague de clés, garantissant que les autorisations sont précisément alignées avec les exigences de sécurité.

Les bagues de clés KMS sont par **défaut créées comme globales**, ce qui signifie que les clés à l'intérieur de cette bague de clés sont accessibles depuis n'importe quelle région. Cependant, il est possible de créer des bagues de clés spécifiques dans **des régions spécifiques**.

### Niveau de Protection des Clés

- **Clés logicielles** : Les clés logicielles sont **créées et gérées par KMS entièrement dans le logiciel**. Ces clés ne sont **pas protégées par un module de sécurité matériel (HSM)** et peuvent être utilisées à des fins de **test et de développement**. Les clés logicielles ne sont **pas recommandées pour une utilisation en production** car elles offrent une faible sécurité et sont susceptibles aux attaques.
- **Clés hébergées dans le cloud** : Les clés hébergées dans le cloud sont **créées et gérées par KMS** dans le cloud en utilisant une infrastructure hautement disponible et fiable. Ces clés sont **protégées par des HSM**, mais les HSM ne sont **pas dédiés à un client spécifique**. Les clés hébergées dans le cloud conviennent à la plupart des cas d'utilisation en production.
- **Clés externes** : Les clés externes sont **créées et gérées en dehors de KMS**, et sont importées dans KMS pour être utilisées dans des opérations cryptographiques. Les clés externes **peuvent être stockées dans un module de sécurité matériel (HSM) ou une bibliothèque logicielle, selon la préférence du client**.

### Objectifs des Clés

- **Chiffrement/déchiffrement symétrique** : Utilisé pour **chiffrer et déchiffrer des données en utilisant une seule clé pour les deux opérations**. Les clés symétriques sont rapides et efficaces pour chiffrer et déchiffrer de grands volumes de données.
- **Supporté** : [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)
- **Signature asymétrique** : Utilisé pour une communication sécurisée entre deux parties sans partager la clé. Les clés asymétriques se présentent sous forme de paire, composée d'une **clé publique et d'une clé privée**. La clé publique est partagée avec d'autres, tandis que la clé privée est gardée secrète.
- **Supporté :** [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)
- **Déchiffrement asymétrique** : Utilisé pour vérifier l'authenticité d'un message ou de données. Une signature numérique est créée à l'aide d'une clé privée et peut être vérifiée à l'aide de la clé publique correspondante.
- **Supporté :** [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)
- **Signature MAC** : Utilisé pour garantir **l'intégrité et l'authenticité des données en créant un code d'authentification de message (MAC) à l'aide d'une clé secrète**. HMAC est couramment utilisé pour l'authentification des messages dans les protocoles réseau et les applications logicielles.
- **Supporté :** [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)

### Période de Rotation & Période Programmée pour la Destruction

Par **défaut**, chaque **90 jours** mais cela peut être **facilement** et **complètement personnalisé.**

La période "Programmée pour la destruction" est le **temps depuis que l'utilisateur demande la suppression de la clé** jusqu'à ce que la clé soit **supprimée**. Elle ne peut pas être modifiée après la création de la clé (par défaut 1 jour).

### Version Principale

Chaque clé KMS peut avoir plusieurs versions, l'une d'elles doit être la **version par défaut**, celle-ci sera utilisée lorsqu'une **version n'est pas spécifiée lors de l'interaction avec la clé KMS**.

### Énumération

Ayant **les autorisations pour lister les clés**, voici comment vous pouvez y accéder :
```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
```
### Escalade de Privilèges

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

### Post Exploitation

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

## Références

- [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}}
