创建和管理单租户 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 single-tenant HSM Proposer (cloudkms.hsmSingleTenantProposer)
    • 批准提案: Cloud KMS Single-Tenant HSM Quorum Member (cloudkms.hsmSingleTenantQuorumMember)
    • 执行提案: Cloud KMS single-tenant HSM Executor (cloudkms.hsmSingleTenantExecutor)
    • 创建密钥: Cloud KMS single-tenant HSM Key Creator (roles/cloudkms.hsmSingleTenantKeyCreator)

    如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限

    您也可以通过自定义角色或其他预定义角色来获取所需的权限。

  6. 为每个法定人数成员生成一个用于双重身份验证 (2FA) 的 RSA-2048 密钥对。建议您为控制密钥使用实体令牌。请遵循您组织的标准,在实体令牌上创建 RSA-2048 密钥对。

    为便于演示,本指南使用 OpenSSL 创建了三个由软件支持的 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 single-tenant HSM Proposer 角色的实例管理员完成。

  1. 设置默认项目。

    gcloud config set project PROJECT_ID
    

    PROJECT_ID 替换为您的项目标识符。

  2. 创建单租户 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。以后可以添加其他密钥,但需要获得法定人数的批准。您必须至少比所需法定人数多一名法定人数成员,才能在丢失控制密钥后进行恢复。
    • 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_two_factor_auth_keys 操作注册双重身份验证密钥。 此步骤需要 Cloud KMS Single-Tenant HSM Proposer 角色。 与大多数提案不同,register_two_factor_auth_keys 提案需要来自所有法定人数成员的签名质询。

        gcloud kms single-tenant-hsm proposal create INSTANCE_ID 
    --single-tenant-hsm-instance-proposal-id PROPOSAL_ID
    --location LOCATION
    --operation-type register_two_factor_auth_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 表示第二个挑战,依此类推。
    • CHALLENGE_N:上一步输出中挑战编号 N 的内容。
    • PRIVATE_KEY_N:私钥编号 N 的路径,例如,对于第一个挑战,该值为 rsaprivate1.pem
  5. 上传已签名的质询,批准提案。您可以通过一个命令或多个命令上传这些文件。此步骤需要 Cloud KMS single-tenant 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')] 可在一个命令中提交前两个签名挑战。

    上传所需数量的签名质询后,提案状态会更新为 APPROVED

  6. 提案获得批准后,使用 execute 命令完成 register_two_factor_auth_keys 操作。 此步骤需要 Cloud KMS Single-Tenant 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_single_tenant_hsm_instance 操作,否则您的实例将被停用。

查看实例

拥有以下任一角色的用户可以查看单租户 Cloud HSM 实例及其状态的列表:

  • Cloud KMS Single-Tenant HSM Proposer
  • Cloud KMS Single-Tenant HSM Quorum Member
  • Cloud KMS Single-Tenant HSM Executor
  • Cloud KMS Viewer
  • 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. 可选:如需查看或下载与法定人数成员当前的两步验证 (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 状态时,您可以创建和使用密钥。您可以在与有效的单租户 Cloud HSM 实例位于同一位置的任何密钥环上创建单租户 Cloud HSM 密钥。

创建单租户 Cloud HSM 密钥除了需要 Cloud KMS Admin 角色之外,还需要 Cloud KMS single-tenant HSM Key Creator 角色。

创建单租户 Cloud HSM 密钥后,使用这些密钥无需特殊权限。

创建密钥

创建单租户 Cloud HSM 密钥时,您必须指定要在其中创建该密钥的单租户 Cloud HSM 实例。否则,该过程与创建任何其他密钥类似。如需查看详细说明,请参阅创建密钥

导入密钥

将密钥材料导入到单租户 Cloud HSM 密钥时,您必须指定要存储该密钥材料的单租户 Cloud HSM 实例。否则,该流程与导入任何其他密钥类似。如需详细说明,请参阅将密钥版本导入 Cloud Key Management Service

使用密钥

创建密钥后,使用单租户 Cloud HSM 密钥与使用任何其他 Cloud HSM 密钥完全相同。您无需指定单租户 Cloud HSM 实例即可使用该密钥。

维护实例

预配实例后,您有责任维护该实例。您可以通过以下方式维护实例:为维护操作创建提案、获得法定人数的批准,然后执行已获批准的操作。一次只能有一个有效提案;如果您选择不继续执行某个提案,则必须删除有效提案或等到提案过期,才能提出其他操作提案。

您必须在 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:您要查看提案的 Single-tenant Cloud HSM 实例的标识符。

刷新实例

您可以刷新实例,使其保持最新状态,并有助于防止意外停机。此操作需要法定人数身份验证。提案获得批准后,该操作大约需要 15 到 30 分钟才能完成。

刷新实例时,disableDate 会设置为自刷新时起 120 天。

  1. 创建提案以使用 refresh_single_tenant_hsm_instance 操作类型刷新实例。此步骤需要 Cloud KMS Single-Tenant HSM Proposer 角色。

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

    替换以下内容:

    • 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 表示第二个挑战,依此类推。
    • CHALLENGE_N:上一步输出中挑战编号 N 的内容。
    • PRIVATE_KEY_N:私钥编号 N 的路径,例如,对于第一个挑战,该值为 rsaprivate1.pem
  5. 上传已签名的质询,批准提案。您可以通过一个命令或多个命令上传这些文件。此步骤需要 Cloud KMS single-tenant 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')] 可在一个命令中提交前两个签名挑战。

    上传所需数量的签名质询后,提案状态会更新为 APPROVED

  6. 执行提案。 此步骤需要 Cloud KMS Single-Tenant HSM Executor 角色,并且必须在提案创建后的 24 小时内完成。

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

    操作完成后,实例仍处于 `ACTIVE` 状态,并且 disableDate 会设置为自刷新时起 120 天。

添加仲裁成员

您可以向实例添加法定人数成员。此操作需要法定人数身份验证。提案获得批准后,该操作大约需要 15 到 30 分钟才能完成。

  1. 为新的法定人数成员生成新的 RSA-2048 密钥对。遵循组织关于在实体令牌上创建 RSA-2048 密钥对的标准。

    请妥善存储私钥;您需要使用它来批准提案。 请妥善保管公钥;您需要使用它将新的法定人数成员添加到单租户 Cloud HSM 实例。

  2. 使用 add_quorum_member 操作创建向实例添加法定人数成员的提案。此步骤需要 Cloud KMS Single-Tenant 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 表示第二个挑战,依此类推。
    • CHALLENGE_N:上一步输出中挑战编号 N 的内容。
    • PRIVATE_KEY_N:私钥编号 N 的路径,例如,对于第一个挑战,该值为 rsaprivate1.pem
  6. 上传已签名的质询,批准提案。您可以通过一个命令或多个命令上传这些文件。此步骤需要 Cloud KMS single-tenant 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')] 可在一个命令中提交前两个签名挑战。
    • SIGNED_REQUIRED_CHALLENGE_LIST:一个 JSON 格式的数组,其中包含使用新私钥签名的质询,该数组的唯一列表项是一个元组,其中包含签名质询的路径和相应公钥的路径,例如 [('signed-challenge-newkey.txt','rsapub-newkey.pem')]

    上传所需数量的签名质询后,提案状态会更新为 APPROVED

  7. 执行提案。 此步骤需要 Cloud KMS Single-Tenant 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 Single-Tenant 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 表示第二个挑战,依此类推。
    • CHALLENGE_N:上一步输出中挑战编号 N 的内容。
    • PRIVATE_KEY_N:私钥编号 N 的路径,例如,对于第一个挑战,该值为 rsaprivate1.pem
  5. 上传已签名的质询,批准提案。您可以通过一个命令或多个命令上传这些文件。此步骤需要 Cloud KMS single-tenant 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')] 可在一个命令中提交前两个签名挑战。

    上传所需数量的签名质询后,提案状态会更新为 APPROVED

  6. 执行提案。 此步骤需要 Cloud KMS Single-Tenant 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_single_tenant_hsm_instance 操作类型创建停用实例的提案。此步骤需要 Cloud KMS Single-Tenant HSM Proposer 角色。

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

    替换以下内容:

    • 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:实例的标识符。
    • PROPOSAL_ID 提案的标识符,例如 disable_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 表示第二个挑战,依此类推。
    • CHALLENGE_N:上一步输出中挑战编号 N 的内容。
    • PRIVATE_KEY_N:私钥编号 N 的路径,例如,对于第一个挑战,该值为 rsaprivate1.pem
  5. 上传已签名的质询,批准提案。您可以通过一个命令或多个命令上传这些文件。此步骤需要 Cloud KMS single-tenant 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')] 可在一个命令中提交前两个签名挑战。

    上传所需数量的签名质询后,提案状态会更新为 APPROVED

  6. 执行提案。 此步骤需要 Cloud KMS Single-Tenant 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_single_tenant_hsm_instance 操作类型启用实例。此步骤需要 Cloud KMS Single-Tenant HSM Proposer 角色。

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

    替换以下内容:

    • 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 表示第二个挑战,依此类推。
    • CHALLENGE_N:上一步输出中挑战编号 N 的内容。
    • PRIVATE_KEY_N:私钥编号 N 的路径,例如,对于第一个挑战,该值为 rsaprivate1.pem
  5. 上传已签名的质询,批准提案。您可以通过一个命令或多个命令上传这些文件。此步骤需要 Cloud KMS single-tenant 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')] 可在一个命令中提交前两个签名挑战。

    上传所需数量的签名质询后,提案状态会更新为 APPROVED

  6. 执行提案。 此步骤需要 Cloud KMS Single-Tenant HSM Executor 角色,并且必须在提案创建后的 24 小时内完成。

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

    操作完成后,实例会返回到“有效”状态,并且 disableDate 会设置为自刷新时起 120 天。

删除实例

您可以删除实例,以永久销毁该实例及其密钥。此操作需要法定人数身份验证。提案获得批准后,该操作大约需要 15 到 30 分钟才能完成。

删除实例后,存储在该实例中的密钥仍会显示为 ACTIVE,但无法使用。尝试使用已删除实例中的密钥执行加密操作会导致错误。

  1. 使用 delete_single_tenant_hsm_instance 操作类型创建删除实例的提案。此步骤需要 Cloud KMS Single-Tenant HSM Proposer 角色。

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

    替换以下内容:

    • 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 表示第二个挑战,依此类推。
    • CHALLENGE_N:上一步输出中挑战编号 N 的内容。
    • PRIVATE_KEY_N:私钥编号 N 的路径,例如,对于第一个挑战,该值为 rsaprivate1.pem
  5. 上传已签名的质询,批准提案。您可以通过一个命令或多个命令上传这些文件。此步骤需要 Cloud KMS single-tenant 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')] 可在一个命令中提交前两个签名挑战。

    上传所需数量的签名质询后,提案状态会更新为 APPROVED

  6. 确保您要继续删除实例并销毁使用在此实例中创建的密钥加密的所有数据,然后执行提案。 此步骤需要 Cloud KMS Single-Tenant 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 Single-Tenant 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

后续步骤