Google云平台如何区分系统管理密钥和客户管理密钥?

How to distinguish system managed key and customer managed key in Google Cloud Platform?

我正在尝试编写一个云函数来删除为服务帐户生成的密钥。 但是不允许云功能删除系统管理的密钥。

如何即时区分系统管理和客户管理的密钥?这样,如果它是系统管理的密钥,我就可以跳过,如果它是客户管理的密钥,我就可以删除。

将此作为社区 Wiki 发布,因为它基于@JohnHanley 的评论,因为这些评论是对这个问题的有效答案:

Google 不允许访问 Google 托管服务帐户密钥的私钥。每个服务帐户都有一个,即使不可见。我不确定如何检测哪个是哪个,但关于如何检测的一个想法是尝试下载密钥 material (JSON).

如果被拒绝,则它是一个系统管理的密钥(或者您没有权限),如果您被允许,那么它就是一个由 IAM 用户创建的密钥。

注意:系统管理的密钥总是第一个。如果 Google 在您创建服务帐户时自动创建第一个密钥,那是有道理的。此键也自动轮换 Google.

[John Hanley 的补充信息]

我的评论没有参考 link。我通过观察和编写代码弄清楚了这一点。我对 IAM 和安全帐户在底层的工作方式也有相当深刻的理解。

一个Google 云服务帐户包含一个RSA 私钥。每个私钥都有对应的 public 密钥。 Google Cloud 发布 public 密钥,即使对于这些“私有”私钥也是如此。

当您创建服务帐户但不创建密钥对时,您仍然可以将服务帐户与 Google 云服务一起使用。在我的例子中,我使用了 Compute Engine 和一个新的服务账户。 Google 云元数据服务器不提供服务帐户的私钥。这是 SignBlob 等 IAM 功能的原因之一。您无法访问私钥,但 Google Cloud IAM 可以。

在我的测试中,我使用 IAM 签署数据,然后使用 public 密钥验证该签名。因此,我能够推断出没有密钥的服务帐户实际上有一个“私有”私钥,否则在原始问题中称为系统管理密钥。

这个问题的答案是在我另一个问题的回复中得到的。

归功于 @jccampanero

在高层次上,可以通过查看KeyType来识别enumeration

  • KEY_TYPE_UNSPECIFIED 未指定密钥类型。
    中存在这个 该消息将立即导致错误。
  • USER_MANAGED 用户管理的密钥(由用户管理和轮换)。
  • SYSTEM_MANAGED 系统管理的密钥(由 Google 管理和轮换)。