単一テナント Cloud HSM インスタンスを作成して管理する

このガイドでは、Google Cloud CLI を使用してシングルテナント Cloud HSM インスタンスを作成、プロビジョニング、管理する方法について説明します。インスタンスを作成してプロビジョニングしたら、 Google Cloud コンソール、Cloud Key Management Service API、gcloud CLI、クライアント ライブラリを使用して、インスタンスで鍵を作成して使用できます。

インスタンスの作成と管理には、クォーラム認証が必要です。インスタンスを作成するときに、インスタンス オペレーションを実行するために必要なクォーラム メンバーの承認数を定義します。クォーラム メンバーは、インスタンスの管理制御を維持するために、常にこの数以上の制御キーを使用できる必要があります。

始める前に

  1. インスタンスを作成して維持するときは、単一テナント Cloud HSM のベスト プラクティスを確認して適用します。
  2. 最初に必要なクォーラム メンバーの数を決定します。追加のクォーラム メンバーは、既存のクォーラム メンバーの承認があれば、後で追加できます。クォーラム メンバーの最小数は 3 です。
  3. 提案を承認するために必要なクォーラム メンバーの数を決定します。インスタンスの作成後にこの数値を変更することはできません。クォーラム メンバーは、インスタンスを維持するために、常にこの数の制御鍵にアクセスできる必要があります。最小クォーラム サイズは 2 です。必要なクォーラム サイズは、クォーラム メンバーの数よりも小さくする必要があります。
  4. インスタンスが時間どおりに更新されるようにする方法を決定します。インスタンスの disableDate をモニタリングし、不要なダウンタイムを回避するために、期限のにインスタンス更新オペレーションを提案、承認、実行する必要があります。
  5. シングルテナント Cloud HSM インスタンスの作成、管理、使用に必要な権限を取得するには、プロジェクトまたは親リソースに対する次の IAM ロールの付与を管理者に依頼してください。

    • 提案を作成する: Cloud KMS 単一テナント HSM Proposer(cloudkms.hsmSingleTenantProposer
    • 提案を承認する: Cloud KMS 単一テナント HSM Quorum Member(cloudkms.hsmSingleTenantQuorumMember
    • 提案を実行する: Cloud KMS 単一テナント HSM Executor(cloudkms.hsmSingleTenantExecutor
    • 鍵を作成する: Cloud KMS 単一テナント HSM 鍵作成者 roles/cloudkms.hsmSingleTenantKeyCreator

    ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。

    必要な権限は、カスタムロールや他の事前定義ロールから取得することもできます。

  6. クォーラム メンバーごとに、2 要素認証(2FA)用の RSA-2048 鍵ペアを 1 つ生成します。制御キーには物理トークンを使用することをおすすめします。物理トークンで RSA-2048 鍵ペアを作成する際の組織の標準に沿って対応します。

    このガイドでは、デモ用に OpenSSL を使用して、ソフトウェアでサポートされる 3 つの RSA-2048 鍵を作成します。

        openssl genrsa -out rsaprivate1.pem
        openssl genrsa -out rsaprivate2.pem
        openssl genrsa -out rsaprivate3.pem
    
        openssl rsa -in rsaprivate1.pem  -out rsapub1.pem --pubout
        openssl rsa -in rsaprivate2.pem  -out rsapub2.pem --pubout
        openssl rsa -in rsaprivate3.pem  -out rsapub3.pem --pubout
        

    秘密鍵を安全に保管します。提案を承認する際に必要になります。公開鍵は、シングルテナント Cloud HSM インスタンスの作成に必要になるため、手元に保管しておきます。

  7. 単一テナント Cloud HSM をサポートする Cloud KMS のロケーションを選択します。互換性のあるロケーションを確認するには、Cloud KMS のロケーション ページでロケーションのリストをご覧ください。[HSM サポート] フィルタで、[シングル テナント HSM をサポート] を選択します。

インスタンスを作成してプロビジョニングする

単一テナント Cloud HSM インスタンスを作成してプロビジョニングするには、gcloud CLI を使用してインスタンス リソースを作成し、認証鍵を登録する提案を作成してから、提案を承認して実行します。

インスタンスを作成する

この手順は、Cloud KMS 単一テナント HSM Proposer ロールを持つインスタンス管理者が完了する必要があります。

  1. デフォルト プロジェクトを設定します。

    gcloud config set project PROJECT_ID
    

    PROJECT_ID は、プロジェクトの ID に置き換えます。

  2. Single-tenant Cloud HSM インスタンスを作成します。

    gcloud kms single-tenant-hsm create --location=LOCATION \
        --total-approver-count=QUORUM_MEMBER_COUNT \
        --single-tenant-hsm-instance-id=INSTANCE_ID
    

    次のように置き換えます。

    • LOCATION: インスタンスを作成するロケーション(例: us-central1)。
    • QUORUM_MEMBER_COUNT: クォーラム メンバーの合計数。これは、以前に作成した制御キーの数でもあります。最小値は 3 です。追加のキーは、クォーラムの承認を得て後で追加できます。制御キーを紛失した後に復元するには、必要なクォーラム サイズよりも 1 つ以上多くのクォーラム メンバーが必要です。
    • INSTANCE_ID: インスタンスに使用する識別子(example-sthsm-instance など)。--single-tenant-hsm-instance-id フラグを省略すると、Cloud HSM によって UUID が割り当てられます。
  3. インスタンスのステータスを確認します。

    gcloud kms single-tenant-hsm describe INSTANCE_ID \
        --location=LOCATION
    

    次のように置き換えます。

    • INSTANCE_ID: インスタンスの識別子。
    • LOCATION: インスタンスを作成したロケーション。

    状態が PENDING_TWO_FACTOR_AUTH_REGISTRATION の場合は、インスタンスをプロビジョニングできます。通常、この状態になるまでに 5 ~ 30 分かかります。

インスタンスをプロビジョニングする

  1. register_2fa_keys オペレーションを使用して 2 要素認証鍵を登録する提案を作成します。この手順には、Cloud KMS 単一テナント HSM Proposer ロールが必要です。ほとんどの提案とは異なり、register_2fa_keys 提案では、定足数のすべてのメンバーからの署名付きチャレンジが必要です。

        gcloud kms single-tenant-hsm proposal create INSTANCE_ID 
    --single-tenant-hsm-instance-proposal-id PROPOSAL_ID
    --location LOCATION
    --operation-type register_2fa_keys
    --required-approver-count MEMBERS_REQUIRED_FOR_APPROVAL
    --two-factor-public-key-pems=PUBLIC_KEY_LIST

    次のように置き換えます。

    • INSTANCE_ID: インスタンスの識別子。
    • PROPOSAL_ID: この提案に使用する一意の識別子(例: set-up-2fa)。
    • LOCATION: インスタンスを作成したロケーション。
    • MEMBERS_REQUIRED_FOR_APPROVAL: オペレーションを実行する前に提案を承認する必要があるクォーラム メンバーの数。最小値は 2 です。この値は、インスタンスのプロビジョニング後に変更できません。クォーラム メンバーは、インスタンスの管理権限を保持するために、常に少なくともこの数の制御鍵にアクセスできる必要があります。
    • PUBLIC_KEY_LIST: すべての制御鍵の公開鍵部分へのパスのカンマ区切りリスト(例: rsapub1.pem,rsapub2.pem,rsapub3.pem)。このリストの公開鍵の数は、以前に使用した QUORUM_MEMBER_COUNT の値と一致する必要があります。
  2. 提案のステータスを表示し、状態が PENDING になるまで待ちます。

      gcloud kms single-tenant-hsm proposal describe PROPOSAL_ID \
          --single_tenant_hsm_instance INSTANCE_ID \
          --location LOCATION
      

    次のように置き換えます。

    • INSTANCE_ID: インスタンスの識別子。
    • PROPOSAL_ID は提案の識別子です(例: set-up-2fa)。
    • LOCATION: インスタンスを作成したロケーション。

    ステータスが PENDING の場合、チャレンジに署名できます。

  3. 提案からチャレンジを取得します。新しい単一テナント Cloud HSM インスタンスをプロビジョニングするには、クォーラムのすべてのメンバーからの署名付きチャレンジが必要です。

      gcloud kms single-tenant-hsm proposal describe PROPOSAL_ID \
          --single_tenant_hsm_instance INSTANCE_ID \
          --location LOCATION \
          --format="json[](quorumParameters.challenges)"
      

    このコマンドは、JSON 形式のチャレンジの配列を返します。

  4. 各鍵について、`basenc --base64url -d` を使用してチャレンジをデコードし、対応する秘密鍵で署名します。

      echo CHALLENGE_N | basenc --base64url -d > decoded-challenge-N.txt
      openssl dgst -sign PRIVATE_KEY_N -out signed-challenge-N.txt decoded-challenge-N.txt
      

    次のように置き換えます。

    • N: チャレンジの番号(最初のチャレンジの場合は 1、2 番目のチャレンジの場合は 2 など)。
    • CHALLENGE_N: 前のステップの出力のチャレンジ番号 N の内容。
    • PRIVATE_KEY_N: 秘密鍵番号 N のパス(例: 最初のチャレンジの場合は rsaprivate1.pem)。
  5. 署名済みのチャレンジをアップロードして、提案を承認します。1 つのコマンドでアップロードすることも、複数のコマンドでアップロードすることもできます。この手順には、Cloud KMS 単一テナント HSM Quorum Member ロールが必要です。

      gcloud kms single-tenant-hsm proposal approve PROPOSAL_ID \
          --location LOCATION \
          --single_tenant_hsm_instance INSTANCE_ID \
          --quorum-challenge-replies="SIGNED_QUORUM_CHALLENGE_LIST"
      

    SIGNED_QUORUM_CHALLENGE_LIST を、チャレンジの JSON 形式の配列に置き換えます。各リスト項目は、署名付きチャレンジのパスと対応する公開鍵のパスを含むタプルです。たとえば、[('signed-challenge-1.txt','rsapub1.pem'), ('signed-challenge-2.txt','rsapub2.pem')] を使用して、1 つのコマンドで最初の 2 つの署名付きチャレンジを送信します。

    必要な数の署名付きチャレンジをアップロードすると、提案の状態が APPROVED に更新されます。

  6. 提案が承認されたら、execute コマンドを使用して register_2fa_keys オペレーションを完了します。この手順には Cloud KMS 単一テナント HSM Executor ロールが必要です。提案の作成後 24 時間以内に完了する必要があります。

        gcloud kms single-tenant-hsm proposal execute PROPOSAL_ID 
    --single_tenant_hsm_instance INSTANCE_ID --location LOCATION

    これは、ユーザーをプロビジョニングしてバックアップを作成する長時間実行オペレーションです。インスタンスは 20 ~ 30 分後に ACTIVE になります。

  7. インスタンスが ACTIVE されたら、インスタンスの詳細を表示して disableDate を確認します。

        gcloud kms single-tenant-hsm describe INSTANCE_ID 
    --location=LOCATION

    インスタンスの disableDate をメモします。この時間までに refresh_sthi オペレーションを完了しないと、インスタンスが無効になります。

インスタンスを表示

次のいずれかのロールを持つユーザーは、単一テナント Cloud HSM インスタンスとその状態のリストを表示できます。

  • Cloud KMS 単一テナント HSM Proposer
  • Cloud KMS 単一テナント HSM Quorum Member
  • Cloud KMS 単一テナント HSM Executor
  • Cloud KMS 閲覧者
  • Cloud KMS 管理者

インスタンスの状態を定期的に確認してください。インスタンスをアクティブな状態に保つには、定期的に更新する必要があります。

アクティブ状態のインスタンスを使用できます。単一テナント Cloud HSM インスタンスで鍵を作成またはインポートする必要があるデベロッパーは、インスタンスのリソース識別子が必要です。リソース識別子の形式は次のとおりです。

projects/INSTANCE_PROJECT/locations/LOCATION/singleTenantHsmInstances/INSTANCE_NAME

組織内のインスタンスを表示してリソース識別子を確認する手順は次のとおりです。

コンソール

  1. Google Cloud コンソールで、[KMS インフラストラクチャ] ページに移動します。

    KMS インフラストラクチャに移動

  2. [単一テナント HSM インスタンス] カードで、[表示] をクリックします。[単一テナント HSM インスタンス] ページには、閲覧権限のあるすべての単一テナント Cloud HSM インスタンスのリストが表示されます。

  3. インスタンスの詳細を表示するには、インスタンスの名前をクリックします。[単一テナント HSM インスタンスの詳細] ページには、選択したインスタンスの詳細(インスタンスの完全なリソース識別子や、インスタンス用に作成された提案のリストなど)が表示されます。

  4. 省略可: 定足数メンバーの現在の 2 要素認証(2FA)鍵に関連付けられている公開鍵を表示またはダウンロードするには、[公開鍵を取得] をクリックします。公開鍵と非公開の 2FA 鍵を比較して、どの制御鍵が有効になっているかを確認できます。

gcloud

kms single-tenant-hsm list メソッドを使用して、既存のインスタンスのリストを表示します。

gcloud kms single-tenant-hsm list projects/PROJECT_ID/locations/LOCATION

次のように置き換えます。

  • PROJECT_ID: シングルテナント Cloud HSM インスタンスを表示するプロジェクトの識別子。
  • LOCATION: シングルテナント Cloud HSM インスタンスを表示するロケーション。

kms single-tenant-hsm describe メソッドを使用して、既存のインスタンスの詳細を表示します。

gcloud kms single-tenant-hsm describe --location=LOCATION \
    --singletenanthsminstance=INSTANCE_ID

次のように置き換えます。

  • LOCATION: シングルテナント Cloud HSM インスタンスを表示するロケーション。
  • INSTANCE_ID: 詳細を表示するインスタンス。

インスタンスを使用する

インスタンスが ACTIVE の間は、鍵を作成して使用できます。アクティブな Single-tenant Cloud HSM インスタンスと同じロケーションにあるキーリングに、Single-tenant Cloud HSM 鍵を作成できます。

シングルテナント Cloud HSM 鍵を作成するには、Cloud KMS 管理者ロールに加えて、Cloud KMS シングルテナント HSM 鍵作成者ロールが必要です。

作成後は、シングルテナント Cloud HSM 鍵の使用に特別な権限は必要ありません。

鍵を作成する

単一テナント Cloud HSM 鍵を作成する場合は、作成する単一テナント Cloud HSM インスタンスを指定する必要があります。それ以外の場合、プロセスは他の鍵の作成と似ています。詳細な手順については、キーを作成するをご覧ください。

鍵をインポートする

鍵マテリアルを単一テナント Cloud HSM 鍵にインポートする場合は、鍵マテリアルを保存する単一テナント Cloud HSM インスタンスを指定する必要があります。それ以外の場合、プロセスは他の鍵のインポートと同様です。詳細な手順については、Cloud Key Management Service に鍵バージョンをインポートするをご覧ください。

キーを使用する

鍵の作成後、シングルテナント Cloud HSM 鍵の使用は、他の Cloud HSM 鍵の使用と同じです。鍵を使用するために、単一テナント Cloud HSM インスタンスを指定する必要はありません。

インスタンスを維持する

インスタンスがプロビジョニングされたら、インスタンスのメンテナンスはお客様の責任となります。インスタンスを維持するには、メンテナンス オペレーションの提案を作成し、クォーラムの承認を取得してから、承認されたオペレーションを実行します。一度に有効にできる提案は 1 つだけです。提案を進めない場合は、有効な提案を削除するか、提案の有効期限が切れるまで待つまで、別のオペレーションを提案することはできません。

disableDate の前にインスタンスを更新する必要があります。インスタンスの disableDate を確認する必要がある場合は、インスタンスの詳細を表示できます。

インスタンスの提案を表示する

インスタンスの提案を表示する手順は次のとおりです。

コンソール

  1. Google Cloud コンソールで、[KMS インフラストラクチャ] ページに移動します。

    KMS インフラストラクチャに移動

  2. [単一テナント HSM インスタンス] カードで、[表示] をクリックします。[単一テナント HSM インスタンス] ページには、閲覧権限のあるすべての単一テナント Cloud HSM インスタンスのリストが表示されます。

  3. 提案を表示するインスタンスを見つけて、インスタンスの名前をクリックします。[単一テナント HSM インスタンスの詳細] ページに、インスタンスの詳細(インスタンス用に作成された提案のリストなど)が表示されます。

  4. 省略可: 提案のリストをフィルタするには、 [フィルタ] バーをクリックして、フィルタ条件を入力します。たとえば、承認待ちのプロポーザルのみ、または正常に完了したプロポーザルのみを表示するようにリストをフィルタできます。

gcloud

  • kms single-tenant-hsm proposal list メソッドを使用して、既存の提案のリストを表示します。

    gcloud kms single-tenant-hsm proposal list --location=LOCATION \
        --singletenanthsminstance=INSTANCE_ID

    次のように置き換えます。

    • LOCATION: シングルテナント Cloud HSM インスタンスを表示するロケーション。
    • INSTANCE_ID: 提案を表示する単一テナント Cloud HSM インスタンスの識別子。

インスタンスを更新する

インスタンスを更新して最新の状態に保つことで、計画外のダウンタイムを回避できます。このオペレーションにはクォーラム認証が必要です。提案が承認されると、オペレーションが完了するまでに約 15 ~ 30 分かかります。

インスタンスを更新すると、disableDate は更新時から 730 日に設定されます。

  1. refresh_sthi オペレーション タイプを使用して、インスタンスを更新する提案を作成します。この手順には、Cloud KMS 単一テナント HSM Proposer ロールが必要です。

        gcloud kms single-tenant-hsm proposal create INSTANCE_ID \
            --location LOCATION \
            --single-tenant-hsm-instance-proposal-id PROPOSAL_ID \
            --operation-type refresh_sthi
        

    次のように置き換えます。

    • INSTANCE_ID: インスタンスの識別子。
    • LOCATION: インスタンスを作成したロケーション。
    • PROPOSAL_ID: この提案に使用する固有識別子(例: refresh_instance)。
  2. 提案のステータスを表示し、状態が PENDING になるまで待ちます。

      gcloud kms single-tenant-hsm proposal describe PROPOSAL_ID \
          --single_tenant_hsm_instance INSTANCE_ID \
          --location LOCATION
      

    次のように置き換えます。

    • INSTANCE_ID: インスタンスの識別子。
    • PROPOSAL_ID は提案の識別子です(例: refresh_instance)。
    • LOCATION: インスタンスを作成したロケーション。

    ステータスが PENDING の場合、チャレンジに署名できます。

  3. 提案からチャレンジを取得します。

      gcloud kms single-tenant-hsm proposal describe PROPOSAL_ID \
          --single_tenant_hsm_instance INSTANCE_ID \
          --location LOCATION \
          --format="json[](quorumParameters.challenges)"
      

    このコマンドは、JSON 形式のチャレンジの配列を返します。

  4. 前の手順で返されたチャレンジごとに、basenc --base64url -d を使用してチャレンジをデコードし、秘密鍵で署名します。

      echo CHALLENGE_N | basenc --base64url -d > decoded-challenge-N.txt
      openssl dgst -sign PRIVATE_KEY_N -out signed-challenge-N.txt decoded-challenge-N.txt
      

    次のように置き換えます。

    • N: チャレンジの番号(最初のチャレンジの場合は 1、2 番目のチャレンジの場合は 2 など)。
    • CHALLENGE_N: 前のステップの出力のチャレンジ番号 N の内容。
    • PRIVATE_KEY_N: 秘密鍵番号 N のパス(例: 最初のチャレンジの場合は rsaprivate1.pem)。
  5. 署名済みのチャレンジをアップロードして、提案を承認します。1 つのコマンドでアップロードすることも、複数のコマンドでアップロードすることもできます。この手順には、Cloud KMS 単一テナント HSM Quorum Member ロールが必要です。

      gcloud kms single-tenant-hsm proposal approve PROPOSAL_ID \
          --location LOCATION \
          --single_tenant_hsm_instance INSTANCE_ID \
          --quorum-challenge-replies="SIGNED_QUORUM_CHALLENGE_LIST"
      

    SIGNED_QUORUM_CHALLENGE_LIST を、チャレンジの JSON 形式の配列に置き換えます。各リスト項目は、署名付きチャレンジのパスと対応する公開鍵のパスを含むタプルです。たとえば、[('signed-challenge-1.txt','rsapub1.pem'), ('signed-challenge-2.txt','rsapub2.pem')] を使用して、1 つのコマンドで最初の 2 つの署名付きチャレンジを送信します。

    必要な数の署名付きチャレンジをアップロードすると、提案の状態が APPROVED に更新されます。

  6. 提案を実行します。この手順には Cloud KMS 単一テナント HSM Executor ロールが必要です。提案の作成後 24 時間以内に完了する必要があります。

        gcloud kms single-tenant-hsm proposal execute  PROPOSAL_ID \
        --single_tenant_hsm_instance INSTANCE_ID --location LOCATION
        

    オペレーションが完了すると、インスタンスは `ACTIVE` 状態のままになり、disableDate は更新時から 730 日後に設定されます。

クォーラム メンバーを追加する

インスタンスにクォーラム メンバーを追加できます。このオペレーションにはクォーラム認証が必要です。提案が承認されると、オペレーションが完了するまでに約 15 ~ 30 分かかります。

  1. 新しいクォーラム メンバーの新しい RSA-2048 鍵ペアを生成します。物理トークンで RSA-2048 鍵ペアを作成する際の組織の標準に沿って操作します。

    秘密鍵は安全に保管してください。提案を承認する際に必要になります。公開鍵は手元に保管しておきます。新しいクォーラム メンバーを Single-tenant Cloud HSM インスタンスに追加する際に必要になります。

  2. add_quorum_member オペレーションを使用して、インスタンスにクォーラム メンバーを追加する提案を作成します。この手順には、Cloud KMS 単一テナント HSM Proposer ロールが必要です。

        gcloud kms single-tenant-hsm proposal create INSTANCE_ID \
            --location LOCATION \
            --single-tenant-hsm-instance-proposal-id PROPOSAL_ID \
            --operation-type add_quorum_member \
            --two_factor_public_key_pem PATH_TO_PUBLIC_KEY
        

    次のように置き換えます。

    • INSTANCE_ID: インスタンスの識別子。
    • LOCATION: インスタンスを作成したロケーション。
    • PROPOSAL_ID: この提案に使用する一意の識別子(例: add_quorum_member)。
    • PATH_TO_PUBLIC_KEY: 新しい公開鍵のパス(例: rsapub4.pem)。
  3. 提案のステータスを表示し、状態が PENDING になるまで待ちます。

      gcloud kms single-tenant-hsm proposal describe PROPOSAL_ID \
          --single_tenant_hsm_instance INSTANCE_ID \
          --location LOCATION
      

    次のように置き換えます。

    • INSTANCE_ID: インスタンスの識別子。
    • PROPOSAL_ID は提案の識別子です(例: add_quorum_member)。
    • LOCATION: インスタンスを作成したロケーション。

    ステータスが PENDING の場合、チャレンジに署名できます。

  4. 提案からチャレンジを取得します。新しいクォーラム メンバーを追加するには、既存のメンバーのクォーラムからの署名付きチャレンジと、新しい鍵を使用した新しいメンバーからの署名付きチャレンジが必要です。

      gcloud kms single-tenant-hsm proposal describe PROPOSAL_ID \
          --single_tenant_hsm_instance INSTANCE_ID \
          --location LOCATION \
          --format="json[](requiredActionQuorumParameters.requiredChallenges,requiredActionQuorumParameters.quorumChallenges)"
      

    このコマンドは、JSON 形式のチャレンジの配列を返します。requiredActionQuorumParameters.requiredChallenges フィールドには、登録する新しい鍵のチャレンジが含まれます。requiredActionQuorumParameters.quorumChallenges フィールドには、既存の鍵のクォーラムのチャレンジが含まれています。requiredActionQuorumParameters オブジェクト内のすべてのチャレンジに署名する必要があります。

  5. 前の手順で返されたチャレンジごとに、basenc --base64url -d を使用してチャレンジをデコードし、秘密鍵で署名します。

      echo CHALLENGE_N | basenc --base64url -d > decoded-challenge-N.txt
      openssl dgst -sign PRIVATE_KEY_N -out signed-challenge-N.txt decoded-challenge-N.txt
      

    次のように置き換えます。

    • N: チャレンジの番号(最初のチャレンジの場合は 1、2 番目のチャレンジの場合は 2 など)。
    • CHALLENGE_N: 前のステップの出力のチャレンジ番号 N の内容。
    • PRIVATE_KEY_N: 秘密鍵番号 N のパス(例: 最初のチャレンジの場合は rsaprivate1.pem)。
  6. 署名済みのチャレンジをアップロードして、提案を承認します。1 つのコマンドでアップロードすることも、複数のコマンドでアップロードすることもできます。この手順には、Cloud KMS 単一テナント HSM Quorum Member ロールが必要です。

      gcloud kms single-tenant-hsm proposal approve PROPOSAL_ID \
          --location LOCATION \
          --single_tenant_hsm_instance INSTANCE_ID \
          --quorum-challenge-replies="SIGNED_QUORUM_CHALLENGE_LIST" \
          --required-challenge-replies="SIGNED_REQUIRED_CHALLENGE_LIST"
      

    次のように置き換えます。

    • SIGNED_QUORUM_CHALLENGE_LIST: 登録済みの秘密鍵を使用して署名されたチャレンジの JSON 形式の配列。各リスト項目は、署名されたチャレンジへのパスと対応する公開鍵へのパスを含むタプルです。たとえば、[('signed-challenge-1.txt','rsapub1.pem'), ('signed-challenge-2.txt','rsapub2.pem')] は、1 つのコマンドで最初の 2 つの署名済みチャレンジを送信します。
    • SIGNED_REQUIRED_CHALLENGE_LIST: 新しい秘密鍵を使用して署名されたチャレンジを含む JSON 形式の配列。リスト項目は、署名されたチャレンジへのパスと対応する公開鍵へのパスを含むタプルのみです(例: [('signed-challenge-newkey.txt','rsapub-newkey.pem')])。

    必要な数の署名付きチャレンジをアップロードすると、提案の状態が APPROVED に更新されます。

  7. 提案を実行します。この手順には Cloud KMS 単一テナント HSM Executor ロールが必要です。提案の作成後 24 時間以内に完了する必要があります。

        gcloud kms single-tenant-hsm proposal execute  PROPOSAL_ID \
        --single_tenant_hsm_instance INSTANCE_ID --location LOCATION
        

    オペレーションが完了すると、新しいクォーラム メンバーはチャレンジに参加して提案を承認できます。追加した公開鍵が、インスタンスの詳細の公開鍵のリストに含まれるようになりました。

クォーラム メンバーを削除する

必要なクォーラム サイズよりも多くのクォーラム メンバーがある場合は、インスタンスからクォーラム メンバーを削除できます。このオペレーションにはクォーラム認証が必要です。提案が承認されると、オペレーションが完了するまでに約 15 ~ 30 分かかります。

  1. remove_quorum_member オペレーションを使用して、クォーラム メンバーをインスタンスから削除する提案を作成します。この手順には、Cloud KMS 単一テナント HSM Proposer ロールが必要です。

        gcloud kms single-tenant-hsm proposal create INSTANCE_ID \
            --location LOCATION \
            --single-tenant-hsm-instance-proposal-id PROPOSAL_ID \
            --operation-type remove_quorum_member \
            --two_factor_public_key_pem PATH_TO_PUBLIC_KEY
        

    次のように置き換えます。

    • INSTANCE_ID: インスタンスの識別子。
    • LOCATION: インスタンスを作成したロケーション。
    • PROPOSAL_ID: この提案に使用する固有識別子(例: remove_quorum_member)。
    • PATH_TO_PUBLIC_KEY: インスタンスから削除する公開鍵のパス(例: rsapub3.pem)。オペレーションが完了すると、対応する秘密鍵を使用して提案を承認できなくなります。
  2. 提案のステータスを表示し、状態が PENDING になるまで待ちます。

      gcloud kms single-tenant-hsm proposal describe PROPOSAL_ID \
          --single_tenant_hsm_instance INSTANCE_ID \
          --location LOCATION
      

    次のように置き換えます。

    • INSTANCE_ID: インスタンスの識別子。
    • PROPOSAL_ID は提案の識別子です(例: remove_quorum_member)。
    • LOCATION: インスタンスを作成したロケーション。

    ステータスが PENDING の場合、チャレンジに署名できます。

  3. 提案からチャレンジを取得します。

      gcloud kms single-tenant-hsm proposal describe PROPOSAL_ID \
          --single_tenant_hsm_instance INSTANCE_ID \
          --location LOCATION \
          --format="json[](quorumParameters.challenges)"
      

    このコマンドは、JSON 形式のチャレンジの配列を返します。

  4. 前の手順で返されたチャレンジごとに、basenc --base64url -d を使用してチャレンジをデコードし、秘密鍵で署名します。

      echo CHALLENGE_N | basenc --base64url -d > decoded-challenge-N.txt
      openssl dgst -sign PRIVATE_KEY_N -out signed-challenge-N.txt decoded-challenge-N.txt
      

    次のように置き換えます。

    • N: チャレンジの番号(最初のチャレンジの場合は 1、2 番目のチャレンジの場合は 2 など)。
    • CHALLENGE_N: 前のステップの出力のチャレンジ番号 N の内容。
    • PRIVATE_KEY_N: 秘密鍵番号 N のパス(例: 最初のチャレンジの場合は rsaprivate1.pem)。
  5. 署名済みのチャレンジをアップロードして、提案を承認します。1 つのコマンドでアップロードすることも、複数のコマンドでアップロードすることもできます。この手順には、Cloud KMS 単一テナント HSM Quorum Member ロールが必要です。

      gcloud kms single-tenant-hsm proposal approve PROPOSAL_ID \
          --location LOCATION \
          --single_tenant_hsm_instance INSTANCE_ID \
          --quorum-challenge-replies="SIGNED_QUORUM_CHALLENGE_LIST"
      

    SIGNED_QUORUM_CHALLENGE_LIST を、チャレンジの JSON 形式の配列に置き換えます。各リスト項目は、署名付きチャレンジのパスと対応する公開鍵のパスを含むタプルです。たとえば、[('signed-challenge-1.txt','rsapub1.pem'), ('signed-challenge-2.txt','rsapub2.pem')] を使用して、1 つのコマンドで最初の 2 つの署名付きチャレンジを送信します。

    必要な数の署名付きチャレンジをアップロードすると、提案の状態が APPROVED に更新されます。

  6. 提案を実行します。この手順には Cloud KMS 単一テナント HSM Executor ロールが必要です。提案の作成後 24 時間以内に完了する必要があります。

        gcloud kms single-tenant-hsm proposal execute  PROPOSAL_ID \
        --single_tenant_hsm_instance INSTANCE_ID --location LOCATION
        

    オペレーションが完了すると、削除されたクォーラム メンバーは、提案を承認するためのチャレンジに参加できなくなります。削除した公開鍵は、インスタンスの詳細の公開鍵のリストに含まれなくなります。

インスタンスを無効にする

インスタンスを無効にすると、そのインスタンスのすべての鍵へのアクセスが一時的にブロックされます。このオペレーションにはクォーラム認証が必要です。提案が承認されると、オペレーションの完了に約 15 ~ 30 分かかります。

インスタンスが無効になっている間、そのインスタンスに保存されている鍵は引き続き ACTIVE として表示されますが、使用できません。無効なインスタンスの鍵を使用して暗号オペレーションを実行しようとすると、エラーが発生します。

  1. disable_sthi オペレーション タイプを使用して、インスタンスを無効にする提案を作成します。この手順には、Cloud KMS 単一テナント HSM Proposer ロールが必要です。

        gcloud kms single-tenant-hsm proposal create INSTANCE_ID \
            --location LOCATION \
            --single-tenant-hsm-instance-proposal-id PROPOSAL_ID \
            --operation-type disable_sthi
        

    次のように置き換えます。

    • INSTANCE_ID: インスタンスの識別子。
    • LOCATION: インスタンスを作成したロケーション。
    • PROPOSAL_ID: この提案に使用する一意の識別子(例: disable_instance)。
  2. 提案のステータスを表示し、状態が PENDING になるまで待ちます。

      gcloud kms single-tenant-hsm proposal describe PROPOSAL_ID \
          --single_tenant_hsm_instance INSTANCE_ID \
          --location LOCATION
      

    次のように置き換えます。

    • INSTANCE_ID: インスタンスの識別子。
    • 提案の識別子(例: disable_instance)。PROPOSAL_ID
    • LOCATION: インスタンスを作成したロケーション。

    ステータスが PENDING の場合、チャレンジに署名できます。

  3. 提案からチャレンジを取得します。

      gcloud kms single-tenant-hsm proposal describe PROPOSAL_ID \
          --single_tenant_hsm_instance INSTANCE_ID \
          --location LOCATION \
          --format="json[](quorumParameters.challenges)"
      

    このコマンドは、JSON 形式のチャレンジの配列を返します。

  4. 前の手順で返されたチャレンジごとに、basenc --base64url -d を使用してチャレンジをデコードし、秘密鍵で署名します。

      echo CHALLENGE_N | basenc --base64url -d > decoded-challenge-N.txt
      openssl dgst -sign PRIVATE_KEY_N -out signed-challenge-N.txt decoded-challenge-N.txt
      

    次のように置き換えます。

    • N: チャレンジの番号(最初のチャレンジの場合は 1、2 番目のチャレンジの場合は 2 など)。
    • CHALLENGE_N: 前のステップの出力のチャレンジ番号 N の内容。
    • PRIVATE_KEY_N: 秘密鍵番号 N のパス(例: 最初のチャレンジの場合は rsaprivate1.pem)。
  5. 署名済みのチャレンジをアップロードして、提案を承認します。1 つのコマンドでアップロードすることも、複数のコマンドでアップロードすることもできます。この手順には、Cloud KMS 単一テナント HSM Quorum Member ロールが必要です。

      gcloud kms single-tenant-hsm proposal approve PROPOSAL_ID \
          --location LOCATION \
          --single_tenant_hsm_instance INSTANCE_ID \
          --quorum-challenge-replies="SIGNED_QUORUM_CHALLENGE_LIST"
      

    SIGNED_QUORUM_CHALLENGE_LIST を、チャレンジの JSON 形式の配列に置き換えます。各リスト項目は、署名付きチャレンジのパスと対応する公開鍵のパスを含むタプルです。たとえば、[('signed-challenge-1.txt','rsapub1.pem'), ('signed-challenge-2.txt','rsapub2.pem')] を使用して、1 つのコマンドで最初の 2 つの署名付きチャレンジを送信します。

    必要な数の署名付きチャレンジをアップロードすると、提案の状態が APPROVED に更新されます。

  6. 提案を実行します。この手順には Cloud KMS 単一テナント HSM Executor ロールが必要です。提案の作成後 24 時間以内に完了する必要があります。

        gcloud kms single-tenant-hsm proposal execute  PROPOSAL_ID \
        --single_tenant_hsm_instance INSTANCE_ID --location LOCATION
        

    オペレーションが完了すると、インスタンスは DISABLED 状態のままになり、再度有効にするまで使用できません。

インスタンスを有効にする

DISABLED インスタンスを再度有効にして、インスタンスとその鍵へのアクセス権を復元できます。このオペレーションにはクォーラム認証が必要です。提案が承認されると、オペレーションが完了するまでに約 15 ~ 30 分かかります。

  1. enable_sthi オペレーション タイプを使用してインスタンスを有効にする提案を作成します。この手順には、Cloud KMS 単一テナント HSM Proposer ロールが必要です。

        gcloud kms single-tenant-hsm proposal create INSTANCE_ID \
            --location LOCATION \
            --single-tenant-hsm-instance-proposal-id PROPOSAL_ID \
            --operation-type enable_sthi
        

    次のように置き換えます。

    • INSTANCE_ID: インスタンスの識別子。
    • LOCATION: インスタンスを作成したロケーション。
    • PROPOSAL_ID: この提案に使用する一意の識別子(例: enable_instance)。
  2. 提案のステータスを表示し、状態が PENDING になるまで待ちます。

      gcloud kms single-tenant-hsm proposal describe PROPOSAL_ID \
          --single_tenant_hsm_instance INSTANCE_ID \
          --location LOCATION
      

    次のように置き換えます。

    • INSTANCE_ID: インスタンスの識別子。
    • PROPOSAL_ID は提案の識別子です(例: enable_instance)。
    • LOCATION: インスタンスを作成したロケーション。

    ステータスが PENDING の場合、チャレンジに署名できます。

  3. 提案からチャレンジを取得します。

      gcloud kms single-tenant-hsm proposal describe PROPOSAL_ID \
          --single_tenant_hsm_instance INSTANCE_ID \
          --location LOCATION \
          --format="json[](quorumParameters.challenges)"
      

    このコマンドは、JSON 形式のチャレンジの配列を返します。

  4. 前の手順で返されたチャレンジごとに、basenc --base64url -d を使用してチャレンジをデコードし、秘密鍵で署名します。

      echo CHALLENGE_N | basenc --base64url -d > decoded-challenge-N.txt
      openssl dgst -sign PRIVATE_KEY_N -out signed-challenge-N.txt decoded-challenge-N.txt
      

    次のように置き換えます。

    • N: チャレンジの番号(最初のチャレンジの場合は 1、2 番目のチャレンジの場合は 2 など)。
    • CHALLENGE_N: 前のステップの出力のチャレンジ番号 N の内容。
    • PRIVATE_KEY_N: 秘密鍵番号 N のパス(例: 最初のチャレンジの場合は rsaprivate1.pem)。
  5. 署名済みのチャレンジをアップロードして、提案を承認します。1 つのコマンドでアップロードすることも、複数のコマンドでアップロードすることもできます。この手順には、Cloud KMS 単一テナント HSM Quorum Member ロールが必要です。

      gcloud kms single-tenant-hsm proposal approve PROPOSAL_ID \
          --location LOCATION \
          --single_tenant_hsm_instance INSTANCE_ID \
          --quorum-challenge-replies="SIGNED_QUORUM_CHALLENGE_LIST"
      

    SIGNED_QUORUM_CHALLENGE_LIST を、チャレンジの JSON 形式の配列に置き換えます。各リスト項目は、署名付きチャレンジのパスと対応する公開鍵のパスを含むタプルです。たとえば、[('signed-challenge-1.txt','rsapub1.pem'), ('signed-challenge-2.txt','rsapub2.pem')] を使用して、1 つのコマンドで最初の 2 つの署名付きチャレンジを送信します。

    必要な数の署名付きチャレンジをアップロードすると、提案の状態が APPROVED に更新されます。

  6. 提案を実行します。この手順には Cloud KMS 単一テナント HSM Executor ロールが必要です。提案の作成後 24 時間以内に完了する必要があります。

        gcloud kms single-tenant-hsm proposal execute  PROPOSAL_ID \
        --single_tenant_hsm_instance INSTANCE_ID --location LOCATION
        

    オペレーションが完了すると、インスタンスは `ACTIVE` 状態に戻り、disableDate は更新時から 730 日後に設定されます。

インスタンスの削除

インスタンスを削除すると、インスタンスとその鍵が完全に破棄されます。このオペレーションにはクォーラム認証が必要です。提案が承認されると、オペレーションの完了に約 15 ~ 30 分かかります。

インスタンスを削除すると、そのインスタンスに保存されている鍵は引き続き ACTIVE として表示されますが、使用できません。削除されたインスタンスの鍵を使用して暗号オペレーションを実行しようとすると、エラーが発生します。

  1. delete_sthi オペレーション タイプを使用して、インスタンスを削除する提案を作成します。この手順には、Cloud KMS 単一テナント HSM Proposer ロールが必要です。

        gcloud kms single-tenant-hsm proposal create INSTANCE_ID \
            --location LOCATION \
            --single-tenant-hsm-instance-proposal-id PROPOSAL_ID \
            --operation-type delete_sthi
        

    次のように置き換えます。

    • INSTANCE_ID: 削除するインスタンスの識別子。
    • LOCATION: インスタンスを作成したロケーション。
    • PROPOSAL_ID: この提案に使用する一意の識別子(例: delete_instance)。
  2. 提案のステータスを表示し、状態が PENDING になるまで待ちます。

      gcloud kms single-tenant-hsm proposal describe PROPOSAL_ID \
          --single_tenant_hsm_instance INSTANCE_ID \
          --location LOCATION
      

    次のように置き換えます。

    • INSTANCE_ID: インスタンスの識別子。
    • PROPOSAL_ID は提案の識別子です(例: delete_instance)。
    • LOCATION: インスタンスを作成したロケーション。

    ステータスが PENDING の場合、チャレンジに署名できます。

  3. 提案からチャレンジを取得します。

      gcloud kms single-tenant-hsm proposal describe PROPOSAL_ID \
          --single_tenant_hsm_instance INSTANCE_ID \
          --location LOCATION \
          --format="json[](quorumParameters.challenges)"
      

    このコマンドは、JSON 形式のチャレンジの配列を返します。

  4. 前の手順で返されたチャレンジごとに、basenc --base64url -d を使用してチャレンジをデコードし、秘密鍵で署名します。

      echo CHALLENGE_N | basenc --base64url -d > decoded-challenge-N.txt
      openssl dgst -sign PRIVATE_KEY_N -out signed-challenge-N.txt decoded-challenge-N.txt
      

    次のように置き換えます。

    • N: チャレンジの番号(最初のチャレンジの場合は 1、2 番目のチャレンジの場合は 2 など)。
    • CHALLENGE_N: 前のステップの出力のチャレンジ番号 N の内容。
    • PRIVATE_KEY_N: 秘密鍵番号 N のパス(例: 最初のチャレンジの場合は rsaprivate1.pem)。
  5. 署名済みのチャレンジをアップロードして、提案を承認します。1 つのコマンドでアップロードすることも、複数のコマンドでアップロードすることもできます。この手順には、Cloud KMS 単一テナント HSM Quorum Member ロールが必要です。

      gcloud kms single-tenant-hsm proposal approve PROPOSAL_ID \
          --location LOCATION \
          --single_tenant_hsm_instance INSTANCE_ID \
          --quorum-challenge-replies="SIGNED_QUORUM_CHALLENGE_LIST"
      

    SIGNED_QUORUM_CHALLENGE_LIST を、チャレンジの JSON 形式の配列に置き換えます。各リスト項目は、署名付きチャレンジのパスと対応する公開鍵のパスを含むタプルです。たとえば、[('signed-challenge-1.txt','rsapub1.pem'), ('signed-challenge-2.txt','rsapub2.pem')] を使用して、1 つのコマンドで最初の 2 つの署名付きチャレンジを送信します。

    必要な数の署名付きチャレンジをアップロードすると、提案の状態が APPROVED に更新されます。

  6. インスタンスを削除し、このインスタンスで作成された鍵を使用して暗号化されたすべてのデータを暗号シュレディングしてから、提案を実行することを確認します。この手順には Cloud KMS 単一テナント HSM Executor ロールが必要です。提案の作成後 24 時間以内に完了する必要があります。

    警告: 次のコマンドは元に戻せません。データが完全に失われる可能性があります。Google は、削除されたインスタンスの鍵の復元をサポートできません。
        gcloud kms single-tenant-hsm proposal execute  PROPOSAL_ID \
        --single_tenant_hsm_instance INSTANCE_ID --location LOCATION
        

    オペレーションが完了すると、インスタンスが削除されます。

提案を削除する

提案を承認または実行しない場合は、提案の有効期限が切れる前に削除できます。保留中の提案を削除すると、その提案を承認できなくなり、新しい提案を作成できるようになります。承認済みの提案を削除すると、オペレーションを実行できなくなります。

  • proposal delete コマンドを使用して提案を削除します。これには、Cloud KMS 単一テナント HSM Proposer ロールが必要です。

        gcloud kms single-tenant-hsm proposal delete PROPOSAL_ID \
            --location LOCATION \
            --single_tenant_hsm_instance INSTANCE_ID
        

    次のように置き換えます。

    • INSTANCE_ID: インスタンスの識別子。
    • LOCATION: インスタンスを作成したロケーション。
    • PROPOSAL_ID: 削除する提案の固有識別子(例: proposal_to_delete)。

次のステップ