GCP - KMS Enum

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 用作 cryptographic keys 的安全存储,这些密钥对于像 encrypting and decrypting sensitive data 这样的操作至关重要。密钥被组织在密钥环(key rings)中,便于结构化管理。此外,访问控制可以精细配置,可以在单个密钥级别或整个密钥环级别设置,确保权限与安全需求精确匹配。

KMS 密钥环默认创建为全局(global),这意味着该密钥环中的密钥可以从任何区域访问。然而,也可以在特定的区域创建特定的密钥环。

Key Protection Level

  • Software keys:Software keys 完全由 KMS 以软件方式创建和管理。这些密钥不受任何硬件安全模块 (HSM) 保护,适合用于测试和开发目的。由于安全性较低且容易受到攻击,不建议在生产环境中使用 software keys。
  • Cloud-hosted keys:Cloud-hosted keys 在云端由 KMS 创建和管理,依赖高可用且可靠的基础设施。这些密钥受 HSM 保护,但 HSM 并不专属于某一客户。cloud-hosted keys 适用于大多数生产场景。
  • External keys:External keys 在 KMS 之外创建和管理,并导入到 KMS 以用于加密操作。external keys 可以根据客户偏好存储在硬件安全模块 (HSM) 或软件库中。

Key Purposes

Rotation Period & Programmed for destruction period

默认情况下,轮换周期为每 90 天,但可以轻松且完全自定义。

“Programmed for destruction” 期间是指从用户请求删除密钥开始到密钥被删除之间的时间。此设置在密钥创建后不可更改(默认 1 天)。

Primary Version

每个 KMS 密钥可以有多个版本,其中一个必须是 默认 版本,当与 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 权限。

请注意,在项目级别为 Storage service agent 绑定诸如 roles/cloudkms.cryptoKeyEncrypterDecrypter 的角色,仍然允许对同一项目内的密钥进行解密。

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

权限提升

GCP - KMS Privesc

后利用

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