GCP - KMS 列挙

Tip

学んで実践する AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
学んで実践する GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
学んで実践する Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks をサポートする

KMS

The Cloud Key Management Service は、暗号鍵の安全な格納場所として機能し、機密データの暗号化や復号化などの操作に不可欠です。これらの鍵はキーリング (key rings) 内に整理され、構造化された管理が可能です。さらに、アクセス制御は個々の鍵レベルまたはキーリング全体で細かく設定でき、権限をセキュリティ要件に応じて厳密に調整できます。

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

Key Protection Level

  • ソフトウェアキー (Software keys): ソフトウェアキーは KMS によって完全にソフトウェア上で作成および管理されます。これらの鍵は HSM によって保護されていません。テストや開発目的での使用に適していますが、セキュリティが低く攻撃を受けやすいため、本番環境には推奨されません
  • Cloud-hosted keys: Cloud-hosted keys は KMS によってクラウド上で作成および管理され、高可用かつ信頼性の高いインフラ上で動作します。これらの鍵は HSM によって保護されています が、HSM は 特定の顧客に専有されるものではありません。Cloud-hosted keys はほとんどの本番ユースケースに適しています。
  • External keys: External keys は KMS の外部で作成および管理され、暗号操作のために KMS にインポートされます。External keys は 顧客の選択に応じて HSM またはソフトウェアライブラリに格納できます

Key Purposes

  • 対称暗号化/復号 (Symmetric encryption/decryption): 単一の鍵でデータの暗号化と復号化の両方を行うために使用されます。対称鍵は大量のデータを高速かつ効率的に暗号化/復号化できます。
  • Supported: cryptoKeys.encrypt, cryptoKeys.decrypt
  • 非対称署名 (Asymmetric Signing): 鍵を共有せずに二者間で安全な通信を行うために使用されます。非対称鍵は 公開鍵と秘密鍵のペア で構成されます。公開鍵は他者と共有され、秘密鍵は秘匿されます。
  • Supported: cryptoKeyVersions.asymmetricSign, cryptoKeyVersions.getPublicKey
  • 非対称復号 (Asymmetric Decryption): メッセージやデータの真正性を検証するために使用されます。デジタル署名は秘密鍵で作成され、対応する公開鍵で検証できます。
  • Supported: cryptoKeyVersions.asymmetricDecrypt, cryptoKeyVersions.getPublicKey
  • MAC 署名 (MAC Signing): 秘密鍵を用いてメッセージ認証コード (MAC) を作成することで、データの整合性と真正性を保証します。HMAC はネットワークプロトコルやソフトウェアアプリケーションのメッセージ認証で一般的に使用されます。
  • Supported: cryptoKeyVersions.macSign, cryptoKeyVersions.macVerify

Rotation Period & Programmed for destruction period

デフォルトでは 90日ごと のローテーションですが、これは 簡単に完全にカスタマイズ可能 です。

「Programmed for destruction」期間とは、ユーザーが鍵の削除を要求してから鍵が実際に 削除されるまでの期間 を指します。鍵作成後は変更できません(デフォルトは 1 日)。

Primary Version

各 KMS 鍵は複数のバージョンを持つことができ、そのうちの一つが デフォルト(primary) になります。バージョンを指定せずに KMS 鍵とやり取りする場合は、このデフォルトバージョンが使用されます。

CMEK permission model

Cloud Storage のオブジェクトが CMEK で暗号化されている場合、KMS への復号/暗号化呼び出しはエンドユーザーではなく、プロジェクトの Cloud Storage service agent(service-${BUCKET_PROJECT_NUMBER}@gs-project-accounts.iam.gserviceaccount.com) によって行われます。

これは、CMEK で暗号化されたオブジェクトを読み取るために必要な条件が次のようになることを意味します:

  • プロジェクトの Cloud Storage service agent が使用されている KMS 鍵に対する KMS 権限(通常は roles/cloudkms.cryptoKeyEncrypterDecrypter)を持っていること。
  • ユーザーはオブジェクトの読み取り権限(例: storage.objects.get)のみを必要とし、KMS 鍵に対する権限は不要であること。

つまり、KMS 鍵で暗号化されたデータへのアクセスを制御するには、プロジェクトの Cloud Storage service agent に対する KMS 権限を追加/削除する必要があります。

注意:roles/cloudkms.cryptoKeyEncrypterDecrypter のようなプロジェクトレベルのバインディングが Storage service agent に対してある場合でも、同一プロジェクト内の鍵での復号は引き続き許可されます。

Enumeration

鍵を列挙する権限を持っている場合、鍵へアクセスする方法は次のとおりです:

# 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

Privilege Escalation

GCP - KMS Privesc

Post Exploitation

GCP - KMS Post Exploitation

参考資料

Tip

学んで実践する AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
学んで実践する GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
学んで実践する Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks をサポートする