权限和角色

在 Cloud KMS 中,资源以层次结构的形式组织。此层次结构可帮助您以不同的粒度级别管理和授予对资源的访问权限。密钥包含在密钥环中,而密钥环位于项目中。项目可以进一步组织到文件夹或组织中。

本主题详细介绍 Cloud KMS 中的资源层次结构。如需从整体上详细了解 Google Cloud 资源,请参阅资源层次结构

资源层次结构

IAM 角色的范围因授予该角色的资源层次结构级层而异。下表显示了在层次结构中的不同级层中,由 Cloud KMS CryptoKey Encrypter 角色 (roles/cloudkms.cryptoKeyEncrypter) 授予的有效功能。

您可以管理对密钥或密钥环的访问权限,但不能管理对各个密钥版本的访问权限。

资源层次结构 功能
组织 使用组织内所有项目中的所有密钥进行加密
文件夹 使用文件夹内所有项目中的所有密钥进行加密
项目 使用项目中的所有密钥进行加密
密钥环 使用密钥环中的所有密钥进行加密
密钥 仅使用该密钥进行加密

安全原则

IAM 有助于强制执行职责分离和最小权限的相互关联的安全原则:

  • 强制执行职责分离原则时,任何单个成员都没有完成关键业务功能所需的所有访问权限。例如,银行账号只有在账号持有人亲身在场并发起交易时,才能从账户中提取资金。

  • 当您强制执行最小权限原则时,成员仅具有完成该成员的特定业务职能所需的最小访问权限级别。例如,银行出纳员不会自动获得批准客户贷款的权限。

预定义角色

IAM 提供的预定义角色可以授予每种 Google Cloud 资源的访问权限。如果没有能满足您需求的预定义角色,您可以创建自定义角色

IAM 为 Cloud KMS 提供以下预定义角色:

角色 名称 说明 权限 最低资源要求
roles/cloudkms.admin Cloud KMS Admin 提供 Cloud KMS 资源的完整访问权限,但不提供执行加密和解密操作的权限。
  • cloudkms.cryptoKeyVersions.create
  • cloudkms.cryptoKeyVersions.destroy
  • cloudkms.cryptoKeyVersions.get
  • cloudkms.cryptoKeyVersions.list
  • cloudkms.cryptoKeyVersions.restore
  • cloudkms.cryptoKeyVersions.update
  • cloudkms.cryptoKeys.*
  • cloudkms.importJobs.*
  • cloudkms.keyRings.*
  • cloudkms.locations.get
  • cloudkms.locations.list
  • resourcemanager.projects.get
CryptoKey
roles/cloudkms.cryptoKeyDecrypter Cloud KMS CryptoKey Decrypter 仅提供使用 Cloud KMS 资源执行解密操作的权限。
  • cloudkms.cryptoKeyVersions.useToDecrypt
  • cloudkms.locations.get
  • cloudkms.locations.list
  • resourcemanager.projects.get
CryptoKey
roles/cloudkms.cryptoKeyEncrypter Cloud KMS CryptoKey Encrypter 仅提供使用 Cloud KMS 资源执行加密操作的权限。
  • cloudkms.cryptoKeyVersions.useToEncrypt
  • cloudkms.locations.get
  • cloudkms.locations.list
  • resourcemanager.projects.get
CryptoKey
roles/cloudkms.cryptoKeyEncrypterDecrypter Cloud KMS CryptoKey Encrypter/Decrypter 仅提供使用 Cloud KMS 资源执行加密和解密操作的权限。
  • cloudkms.cryptoKeyVersions.useToDecrypt
  • cloudkms.cryptoKeyVersions.useToEncrypt
  • cloudkms.locations.get
  • cloudkms.locations.list
  • resourcemanager.projects.get
CryptoKey
roles/cloudkms.cryptoOperator Cloud KMS Crypto Operator 启用所有加密操作。
  • cloudkms.cryptoKeyVersions.useToDecrypt
  • cloudkms.cryptoKeyVersions.useToEncrypt
  • cloudkms.cryptoKeyVersions.useToSign
  • cloudkms.cryptoKeyVersions.useToVerify
  • cloudkms.cryptoKeyVersions.viewPublicKey
  • cloudkms.locations.*
  • resourcemanager.projects.get
roles/cloudkms.importer Cloud KMS Importer 可启用 ImportCryptoKeyVersion、CreateImportJob、ListImportJobs 和 GetImportJob 操作
  • cloudkms.importJobs.create
  • cloudkms.importJobs.get
  • cloudkms.importJobs.list
  • cloudkms.importJobs.useToImport
  • cloudkms.locations.get
  • cloudkms.locations.list
  • resourcemanager.projects.get
roles/cloudkms.publicKeyViewer Cloud KMS CryptoKey Public Key Viewer 可启用 GetPublicKey 操作
  • cloudkms.cryptoKeyVersions.viewPublicKey
  • cloudkms.locations.get
  • cloudkms.locations.list
  • resourcemanager.projects.get
roles/cloudkms.signer Cloud KMS CryptoKey Signer 可以启用 Sign 操作
  • cloudkms.cryptoKeyVersions.useToSign
  • cloudkms.locations.get
  • cloudkms.locations.list
  • resourcemanager.projects.get
roles/cloudkms.signerVerifier Cloud KMS CryptoKey Signer/Verifier 可以启用 Sign、Verify 和 GetPublicKey 操作
  • cloudkms.cryptoKeyVersions.useToSign
  • cloudkms.cryptoKeyVersions.useToVerify
  • cloudkms.cryptoKeyVersions.viewPublicKey
  • cloudkms.locations.get
  • cloudkms.locations.list
  • resourcemanager.projects.get
roles/cloudkms.verifier Cloud KMS CryptoKey Verifier 可以启用 Verify 和 GetPublicKey 操作
  • cloudkms.cryptoKeyVersions.useToVerify
  • cloudkms.cryptoKeyVersions.viewPublicKey
  • cloudkms.locations.get
  • cloudkms.locations.list
  • resourcemanager.projects.get

自定义角色

除了预定义角色之外,您还可以创建自定义角色。通过自定义角色,您可以授予角色执行给定任务所需的最低权限,以强制执行最小权限原则

自定义角色包含 IAM 参考文档中列出的一项或多项权限。与 Cloud Key Management Service API 相关的权限以字符串 cloudkms 开头。如需了解详情,请参阅自定义角色中的权限支持级别

如需了解调用特定 Cloud Key Management Service API 方法所需的权限,请参阅该方法的 API 参考文档

在 Cloud KMS 中管理访问权限的一般准则

我们建议您避免使用项目级基本角色,例如 ownereditorviewer。这些角色并未将管理密钥的能力与使用密钥进行加密操作的能力分开,因此不建议在生产环境中使用。请改为使用预定义角色或创建符合业务需求的自定义角色。

以下示例有助于说明一些良好的安全准则:

  • 对于大型或复杂的组织,您可能会决定使用如下方法:

    • 向 IT 安全团队成员授予所有项目的 Cloud KMS Admin 角色 (roles/cloudkms.admin)。如果不同的团队成员处理密钥生命周期的不同方面,您可为这些团队成员授予更精细的角色,例如 Cloud KMS Importer 角色 (roles/cloudkms.importer)。
    • 将 Cloud KMS Encrypter / Decrypter 角色 (roles/cloudkms.cryptoKeyEncrypterDecrypter) 授予读取或写入加密数据的用户或应用。
    • 将 Cloud KMS Public Key Viewer 角色 (roles/cloudkms.publicKeyViewer) 授予需要查看用于非对称加密的密钥公开部分的用户或应用。
    • 创建符合您业务需求的预定义角色。例如,同一用户可能需要监控项目的配额以及查看日志数据。
  • 对于具有简单安全要求的小型组织,您可能会选择较简单的方法:授予广泛的角色,例如 Organization Admin (roles/resourcemanager.organizationAdmin)。但是,此方法可能无法随着您不断提高的要求而调整。

  • 请考虑将密钥托管在独立的 Google Cloud 项目中,使其不受受这些受密钥保护的数据影响。在一个项目中具有基本或高特权的角色(例如 editor)的用户不能使用此角色授予另一个项目中的密钥的未经授权访问权限。

  • 避免向任何成员授予 owner 角色。如果没有 owner 角色,则项目中的任何成员都不能既创建密钥又使用它来解密数据或进行签名,除非将这些权限中的每一项都授予该成员。如需在授予广泛的管理访问权限的同时不授予加密或解密的能力,请改为授予 Cloud KMS Admin 角色 (roles/cloudkms.admin)。

  • 如需限制对加密数据(例如客户数据)的访问权限,您可以限制谁可以访问密钥,谁可以使用密钥进行解密。如有必要,您可以创建精细的自定义角色,以满足您的业务需求。

检查权限

对于可设置精细 IAM 权限的每个 Cloud KMS 对象类型,该对象具有 testIamPermissions 方法。testIamPermissions 方法会返回调用方已经为该对象授予的一组权限。

您无法对密钥版本设置 IAM 权限,因此 CryptoKeyVersion 对象类型没有此方法。

对象的 testIamPermissions 方法会返回 TestIamPermissionsResponse

如需查看调用 testIamPermissions 方法的示例,请参阅 IAM 文档中有关测试权限的文档。

后续步骤

  • 了解 IAM 如何集中管理 Google Cloud 资源的权限和访问权限范围。
  • 了解不同类型的 Cloud KMS 对象