権限と役割

Cloud KMS では、リソースが階層状に編成されています。この階層構造は、さまざまな粒度のリソースを管理してアクセス権を付与するのに役立ちます。鍵はキーリングに含まれ、キーリングはプロジェクト内に存在します。EKM 接続もプロジェクト内に存在します。プロジェクトはフォルダや組織にさらに編成できます。

このトピックでは、Cloud KMS 内のリソースの階層について詳しく説明します。Google Cloud リソースの詳細については、リソース階層をご覧ください。

リソース階層

IAM のロールの範囲は、ロールが付与されるリソース階層のレベルによって異なります。次の表は、階層のさまざまなレベルでの Cloud KMS CryptoKey Encryptor のロール(roles/cloudkms.cryptoKeyEncrypter)によって付与される有効な機能を示しています。

鍵またはキーリングへのアクセスは管理できますが、個々の鍵バージョンへのアクセスは管理できません。

リソース階層 能力
組織 組織内のすべてのプロジェクトのすべての鍵を使用して暗号化する
フォルダ フォルダ内のすべてのプロジェクトのすべての鍵を使用して暗号化する
プロジェクト プロジェクト内のすべての鍵を使用して暗号化する
キーリング キーリングのすべての鍵を使用して暗号化する
その鍵だけを使用して暗号化する

セキュリティ原則

IAM は、職務の分離と最小権限という相互に関連するセキュリティ原則を適用するのに役立ちます。

  • 職務の分離の原則を適用した場合、1 人のメンバーに、重要なビジネス機能の遂行に必要なアクセス権がすべて付与されることはありません。たとえば、銀行の窓口係が口座から資金を引き出せるのは、アカウント所有者が物理的に存在し、取引を開始している場合のみです。

  • 最小権限の原則を適用した場合、メンバーにはその特定のビジネス機能を遂行するために必要な最小限のアクセスレベルだけが与えられます。たとえば、銀行の窓口係が顧客のローンを承認できる権限は自動的に付与されません。

定義済みの役割

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 リファレンスに記載されている 1 つ以上の権限が含まれています。Cloud Key Management Service API に関連する権限は、文字列 cloudkms で始まります。詳細については、カスタムロールでの権限のサポートレベルをご覧ください。

特定の Cloud Key Management Service API メソッドを呼び出すために必要な権限の詳細については、そのメソッドの API リファレンスをご覧ください。

Cloud KMS でアクセスを管理するための一般的なガイドライン

ownereditorviewer など、プロジェクト全体の基本ロールを使用しないことをおすすめします。これらのロールは、鍵を暗号オペレーションに使用する機能から鍵の管理機能を分離するものではないため、本番環境では推奨されません。代わりに、事前定義ロールを使用するか、ビジネス要件を反映するカスタムロールを作成します。

適切なセキュリティ ガイドラインの例を以下に示します。

  • 大規模な組織または複雑な組織の場合、次のようなアプローチが考えられます。

    • すべてのプロジェクトで Cloud KMS 管理者ロール(roles/cloudkms.admin)を IT セキュリティ チームのメンバーに付与します。さまざまなチームメンバーが鍵のライフサイクルのさまざまな側面を処理する場合は、Cloud KMS インポータのロール(roles/cloudkms.importer)など、よりきめ細かなロールをそれらのチームメンバーに付与できます。
    • 暗号化されたデータの読み取りまたは書き込みを行うユーザーやアプリケーションに、Cloud KMS Encrypter / Decrypter のロール(roles/cloudkms.cryptoKeyEncrypterDecrypter)を付与します。
    • 非対称暗号化に使用される鍵の公開部分を表示するユーザーまたはアプリケーションに、Cloud KMS 公開鍵閲覧者のロール(roles/cloudkms.publicKeyViewer)を付与します。
    • ビジネス要件に合わせて事前定義ロールを作成できます。たとえば、同じユーザーがプロジェクトの割り当てをモニタリングし、ログデータを表示することが必要な場合があります。
  • セキュリティ要件が単純な小規模な組織の場合、組織管理者roles/resourcemanager.organizationAdmin)などの広範なロールを付与することで、シンプルなアプローチを選択できます。ただし、このアプローチは継続的な要件に応じてスケーリングできない場合があります。

  • 鍵で保護されているデータとは別の Google Cloud プロジェクトで鍵をホストすることを検討してください。あるプロジェクトで基本ロールまたは高い権限を持つロール(editor など)を持つユーザーは、このロールを使用して別のプロジェクトの鍵への不正アクセスを行うことはできません。

  • どのメンバーにも owner ロールを付与しないでください。owner ロールがない場合、これらの各権限がメンバーに付与されていない限り、プロジェクト内のどのメンバーも、鍵を作成し、その鍵を使用してデータを復号したり署名したりすることはできません。暗号化権限または復号権限を付与することなく、幅広い管理権限を付与するには、代わりに Cloud KMS 管理者ロール(roles/cloudkms.admin)を付与します。

  • 顧客データなどの暗号化されたデータへのアクセスを制限するには、鍵にアクセスできるユーザーと鍵を復号に使用できるユーザーを制限します。必要に応じて、ビジネス要件を満たすように詳細なカスタムロールを作成できます。

権限の確認

きめ細かい IAM 権限を設定可能な Cloud KMS オブジェクトの型ごとに、そのオブジェクトは testIamPermissions メソッドを持ちます。testIamPermissions メソッドは、呼び出し元がそのオブジェクトに対して付与している権限セットを返します。

鍵バージョンに IAM 権限を設定できないため、CryptoKeyVersion オブジェクト タイプにはこのメソッドがありません。

オブジェクトの testIamPermissions メソッドは TestIamPermissionsResponse を返します。

testIamPermissions メソッドを呼び出す例については、IAM ドキュメントの権限のテストに関するドキュメントをご覧ください。

次のステップ

  • IAM を使用して、Google Cloud リソースの権限とアクセス スコープを一元管理する方法を確認します。
  • さまざまな種類の Cloud KMS オブジェクトを理解します。