权限和角色

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

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

资源层次结构

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

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

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

安全原则

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

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

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

预定义角色

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

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

Role Permissions

(roles/cloudkms.admin)

Provides access to Cloud KMS resources, except for access to restricted resource types and cryptographic operations.

Lowest-level resources where you can grant this role:

  • CryptoKey

cloudkms.cryptoKeyVersions.create

cloudkms.cryptoKeyVersions.destroy

cloudkms.cryptoKeyVersions.get

cloudkms.cryptoKeyVersions.list

cloudkms.cryptoKeyVersions.restore

cloudkms.cryptoKeyVersions.update

cloudkms.cryptoKeyVersions.useToDecryptViaDelegation

cloudkms.cryptoKeyVersions.useToEncryptViaDelegation

cloudkms.cryptoKeys.*

  • cloudkms.cryptoKeys.create
  • cloudkms.cryptoKeys.get
  • cloudkms.cryptoKeys.getIamPolicy
  • cloudkms.cryptoKeys.list
  • cloudkms.cryptoKeys.setIamPolicy
  • cloudkms.cryptoKeys.update

cloudkms.ekmConfigs.*

  • cloudkms.ekmConfigs.get
  • cloudkms.ekmConfigs.getIamPolicy
  • cloudkms.ekmConfigs.setIamPolicy
  • cloudkms.ekmConfigs.update

cloudkms.ekmConnections.*

  • cloudkms.ekmConnections.create
  • cloudkms.ekmConnections.get
  • cloudkms.ekmConnections.getIamPolicy
  • cloudkms.ekmConnections.list
  • cloudkms.ekmConnections.setIamPolicy
  • cloudkms.ekmConnections.update
  • cloudkms.ekmConnections.use
  • cloudkms.ekmConnections.verifyConnectivity

cloudkms.importJobs.*

  • cloudkms.importJobs.create
  • cloudkms.importJobs.get
  • cloudkms.importJobs.getIamPolicy
  • cloudkms.importJobs.list
  • cloudkms.importJobs.setIamPolicy
  • cloudkms.importJobs.useToImport

cloudkms.keyRings.*

  • cloudkms.keyRings.create
  • cloudkms.keyRings.createTagBinding
  • cloudkms.keyRings.deleteTagBinding
  • cloudkms.keyRings.get
  • cloudkms.keyRings.getIamPolicy
  • cloudkms.keyRings.list
  • cloudkms.keyRings.listEffectiveTags
  • cloudkms.keyRings.listTagBindings
  • cloudkms.keyRings.setIamPolicy

cloudkms.locations.get

cloudkms.locations.list

cloudkms.locations.optOutKeyDeletionMsa

resourcemanager.projects.get

(roles/cloudkms.cryptoKeyDecrypter)

Provides ability to use Cloud KMS resources for decrypt operations only.

Lowest-level resources where you can grant this role:

  • CryptoKey

cloudkms.cryptoKeyVersions.useToDecrypt

cloudkms.locations.get

cloudkms.locations.list

resourcemanager.projects.get

(roles/cloudkms.cryptoKeyDecrypterViaDelegation)

Enables Decrypt operations via other Google Cloud services

cloudkms.cryptoKeyVersions.useToDecryptViaDelegation

cloudkms.locations.get

cloudkms.locations.list

resourcemanager.projects.get

resourcemanager.projects.list

(roles/cloudkms.cryptoKeyEncrypter)

Provides ability to use Cloud KMS resources for encrypt operations only.

Lowest-level resources where you can grant this role:

  • CryptoKey

cloudkms.cryptoKeyVersions.useToEncrypt

cloudkms.locations.get

cloudkms.locations.list

resourcemanager.projects.get

(roles/cloudkms.cryptoKeyEncrypterDecrypter)

Provides ability to use Cloud KMS resources for encrypt and decrypt operations only.

Lowest-level resources where you can grant this role:

  • CryptoKey

cloudkms.cryptoKeyVersions.useToDecrypt

cloudkms.cryptoKeyVersions.useToEncrypt

cloudkms.locations.get

cloudkms.locations.list

resourcemanager.projects.get

(roles/cloudkms.cryptoKeyEncrypterDecrypterViaDelegation)

Enables Encrypt and Decrypt operations via other Google Cloud services

cloudkms.cryptoKeyVersions.useToDecryptViaDelegation

cloudkms.cryptoKeyVersions.useToEncryptViaDelegation

cloudkms.locations.get

cloudkms.locations.list

resourcemanager.projects.get

resourcemanager.projects.list

(roles/cloudkms.cryptoKeyEncrypterViaDelegation)

Enables Encrypt operations via other Google Cloud services

cloudkms.cryptoKeyVersions.useToEncryptViaDelegation

cloudkms.locations.get

cloudkms.locations.list

resourcemanager.projects.get

resourcemanager.projects.list

(roles/cloudkms.cryptoOperator)

Enables all Crypto Operations.

cloudkms.cryptoKeyVersions.useToDecrypt

cloudkms.cryptoKeyVersions.useToEncrypt

cloudkms.cryptoKeyVersions.useToSign

cloudkms.cryptoKeyVersions.useToVerify

cloudkms.cryptoKeyVersions.viewPublicKey

cloudkms.locations.generateRandomBytes

cloudkms.locations.get

cloudkms.locations.list

resourcemanager.projects.get

(roles/cloudkms.ekmConnectionsAdmin)

Enables management of EkmConnections.

cloudkms.ekmConfigs.get

cloudkms.ekmConfigs.update

cloudkms.ekmConnections.create

cloudkms.ekmConnections.get

cloudkms.ekmConnections.list

cloudkms.ekmConnections.update

cloudkms.ekmConnections.verifyConnectivity

resourcemanager.projects.get

resourcemanager.projects.list

(roles/cloudkms.expertRawAesCbc)

Enables raw AES-CBC keys management.

cloudkms.cryptoKeyVersions.manageRawAesCbcKeys

cloudkms.locations.get

cloudkms.locations.list

resourcemanager.projects.get

resourcemanager.projects.list

(roles/cloudkms.expertRawAesCtr)

Enables raw AES-CTR keys management.

cloudkms.cryptoKeyVersions.manageRawAesCtrKeys

cloudkms.locations.get

cloudkms.locations.list

resourcemanager.projects.get

resourcemanager.projects.list

(roles/cloudkms.expertRawPKCS1)

Enables raw PKCS#1 keys management.

cloudkms.cryptoKeyVersions.manageRawPKCS1Keys

cloudkms.locations.get

cloudkms.locations.list

resourcemanager.projects.get

resourcemanager.projects.list

(roles/cloudkms.importer)

Enables ImportCryptoKeyVersion, CreateImportJob, ListImportJobs, and GetImportJob operations

cloudkms.importJobs.create

cloudkms.importJobs.get

cloudkms.importJobs.list

cloudkms.importJobs.useToImport

cloudkms.locations.get

cloudkms.locations.list

resourcemanager.projects.get

(roles/cloudkms.protectedResourcesViewer)

Enables viewing protected resources.

cloudkms.protectedResources.search

(roles/cloudkms.publicKeyViewer)

Enables GetPublicKey operations

cloudkms.cryptoKeyVersions.viewPublicKey

cloudkms.locations.get

cloudkms.locations.list

resourcemanager.projects.get

(roles/cloudkms.signer)

Enables Sign operations

cloudkms.cryptoKeyVersions.useToSign

cloudkms.locations.get

cloudkms.locations.list

resourcemanager.projects.get

(roles/cloudkms.signerVerifier)

Enables Sign, Verify, and GetPublicKey operations

cloudkms.cryptoKeyVersions.useToSign

cloudkms.cryptoKeyVersions.useToVerify

cloudkms.cryptoKeyVersions.viewPublicKey

cloudkms.locations.get

cloudkms.locations.list

resourcemanager.projects.get

(roles/cloudkms.verifier)

Enables Verify and GetPublicKey operations

cloudkms.cryptoKeyVersions.useToVerify

cloudkms.cryptoKeyVersions.viewPublicKey

cloudkms.locations.get

cloudkms.locations.list

resourcemanager.projects.get

(roles/cloudkms.viewer)

Enables Get and List operations.

cloudkms.cryptoKeyVersions.get

cloudkms.cryptoKeyVersions.list

cloudkms.cryptoKeys.get

cloudkms.cryptoKeys.list

cloudkms.ekmConfigs.get

cloudkms.ekmConnections.get

cloudkms.ekmConnections.list

cloudkms.importJobs.get

cloudkms.importJobs.list

cloudkms.keyRings.get

cloudkms.keyRings.list

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 对象