# GCP - KMS Enum

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

## KMS

[**Cloud Key Management Service**](https://cloud.google.com/kms/docs/)は、**暗号鍵**の安全なストレージとして機能し、**機密データの暗号化および復号化**などの操作に不可欠です。これらの鍵はキーリング内に整理され、構造的な管理が可能です。さらに、アクセス制御は個々の鍵レベルまたは全体のキーリングに対して詳細に設定でき、権限がセキュリティ要件に正確に一致するようにします。

KMSキーリングは**デフォルトでグローバル**に作成されるため、そのキーリング内の鍵は任意のリージョンからアクセス可能です。ただし、**特定のリージョン**に特定のキーリングを作成することも可能です。

### Key Protection Level

- **Software keys**: ソフトウェアキーは**KMSによって完全にソフトウェアで作成および管理**されます。これらの鍵は**ハードウェアセキュリティモジュール（HSM）によって保護されておらず**、**テストおよび開発目的**で使用できます。ソフトウェアキーは**本番環境**での使用は推奨されません。なぜなら、セキュリティが低く、攻撃に対して脆弱だからです。
- **Cloud-hosted keys**: クラウドホストされた鍵は、**KMSによってクラウド内で作成および管理**され、高可用性で信頼性の高いインフラストラクチャを使用します。これらの鍵は**HSMによって保護されていますが**、HSMは**特定の顧客に専用ではありません**。クラウドホストされた鍵は、ほとんどの本番使用ケースに適しています。
- **External keys**: 外部鍵は**KMSの外部で作成および管理**され、暗号操作に使用するためにKMSにインポートされます。外部鍵は**顧客の好みに応じてハードウェアセキュリティモジュール（HSM）またはソフトウェアライブラリに保存できます**。

### Key Purposes

- **Symmetric encryption/decryption**: **単一の鍵を使用してデータを暗号化および復号化するために使用**されます。対称鍵は、大量のデータを暗号化および復号化するのに高速で効率的です。
- **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**: 鍵を共有せずに二者間の安全な通信に使用されます。非対称鍵は、**公開鍵と秘密鍵**のペアで構成されます。公開鍵は他者と共有され、秘密鍵は秘密に保たれます。
- **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**: メッセージまたはデータの真正性を確認するために使用されます。デジタル署名は秘密鍵を使用して作成され、対応する公開鍵を使用して検証できます。
- **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**: **秘密鍵を使用してメッセージ認証コード（MAC）を作成することにより、データの整合性と真正性を確保するために使用**されます。HMACは、ネットワークプロトコルやソフトウェアアプリケーションでメッセージ認証に一般的に使用されます。
- **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)

### Rotation Period & Programmed for destruction period

**デフォルト**では、**90日ごと**ですが、**簡単に**かつ**完全にカスタマイズ可能です**。

「プログラムされた破壊」期間は、**ユーザーが鍵の削除を要求してからの時間**であり、鍵が**削除されるまで**の期間です。鍵が作成された後は変更できません（デフォルトは1日）。

### Primary Version

各KMS鍵は複数のバージョンを持つことができ、そのうちの1つは**デフォルト**のものでなければなりません。これは、**KMS鍵と対話する際にバージョンが指定されていない場合に使用されるもの**です。

### Enumeration

**鍵をリストする権限がある場合**、これがそれらにアクセスする方法です：
```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
```
### 権限昇格

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

### ポストエクスプロイト

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

## 参考文献

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