Ручное резервное копирование и восстановление ключей защиты состояния гостей для доверенного запуска локальных виртуальных машин Azure, включенных с помощью Azure Arc

Область применения: гиперконвергентные развертывания локальной среды Azure

В этой статье описывается, как вручную создавать резервные копии и восстанавливать ключи защиты гостевого состояния для локальных виртуальных машин Azure с доверительным запуском, использующих Azure Arc.

  • Для локальной версии Azure 2505 и более поздних версий: резервное копирование и восстановление ключей защиты состояния гостевой виртуальной машины Azure в и из папки файловой системы.

  • Для локальных выпусков Azure до 2505: выполняйте резервное копирование и восстановление ключей защиты состояния гостевых виртуальных машин Azure, перенося их в хранилище ключей в другом локальном экземпляре Azure.

Этот раздел относится к локальному выпуску Azure 2505 и более поздних версий.

Для резервного копирования ключи защиты гостевого состояния виртуальной машины копируются из локального хранилища ключей локального экземпляра Azure в папку, которая периодически выполняет резервное копирование. Ключи защиты гостевой виртуальной машины, хранящиеся в этой папке, находятся в зашифрованной форме.

Для восстановления ключи защиты гостевого состояния виртуальной машины восстанавливаются из папки, содержащей копию резервной копии в хранилище ключей локального экземпляра Azure, где необходимо восстановить виртуальные машины.

Резервное копирование ключей

Приведенные ниже действия включают копирование ключей защиты состояния гостевой виртуальной машины из локального хранилища ключей вашего локального экземпляра Azure в папку, резервные копии которой выполняются периодически.

  1. На защищенном компьютере с помощью PowerShell 7 создайте ключ упаковки размером 2048:

    $rsa = [System.Security.Cryptography.RSA]::Create(2048) 
    
    $privateKeyPem = $rsa.ExportPkcs8PrivateKeyPem() 
    
    $privateKeyPem | Out-File -FilePath .\private.pem 
    
    $publicKeyPem = $rsa.ExportRSAPublicKeyPem() 
    
    $publicKeyPem | Out-File -FilePath .\public.pem 
    
  2. Запишите ключ упаковки, так как он понадобится позднее.

  3. Скопируйте файл .\public.pem на локальный экземпляр Azure.

  4. Скопируйте ключи защиты ВМ из локального хранилища ключей экземпляра Azure в папку, резервное копирование которой выполняется периодически.

    1. Скачайте сценарий TvmBackupUtils.psm1 с GitHub на локальный экземпляр Azure. Примечание. Этот скрипт является примером, который можно адаптировать для конкретных потребностей.

    2. Выполните следующее:

      import-module .\TvmBackupUtils.psm1 -force
      
      Backup-TVMKeys -WrappingKeyPath <path to public.pem> -BackupRootPath <path to backup root folder where the timestamped backup folder is stored>
      

      Ниже приведен пример выходных данных после выполнения этой команды:

      Backing up TVM Vault keys to .\<backup root folder>\20250722192116
      Backing up key 7fb16fe7-00a0-476f-92b3-ccb98fd9525a to AES folder
      Backing up key AzureStackTvmAKRootKey to RSA folder
      
  5. Обратите внимание на папку резервной копии с отметкой времени, созданную в корневой папке резервных копий. Это необходимо позже во время восстановления. Например, папка резервного копирования с именем "2025-06-12-20-53-55" с форматом "гггг-ММ-dd-HH-mm-ss".

Восстановление ключей

Приведенные ниже действия включают восстановление ключей защиты гостевой виртуальной машины из папки, содержащей копию резервной копии в хранилище ключей локального экземпляра Azure, где необходимо восстановить виртуальные машины.

  1. Скопируйте файлы закрытого и открытого ключей для ключа-оболочки, созданного ранее, в локальный экземпляр Azure.

  2. Скопируйте папку резервной копии с меткой времени в локальный экземпляр Azure. Выберите папку в корневой папке резервного копирования с последней меткой времени, так как эта папка будет иметь последнюю копию. Не изменяйте папку резервного копирования.

  3. Импортируйте ключ упаковки, созданный ранее, в локальный экземпляр Azure:

    1. Скачайте сценарий TvmBackupUtils.psm1 с GitHub на локальный экземпляр Azure. Примечание. Этот скрипт является примером, который можно адаптировать для конкретных потребностей.

    2. Выполните следующие команды.

      Note

      Обязательно создайте уникальное имя для WrappingKeyName. В противном случае это приводит к сбою во время импорта:

      Import-Module .\TvmBackupUtils.psm1 -force 
      
      Import-TvmWrappingKeyFromPem -KeyName <WrappingKeyName> -PublicKeyPath <path to public.pem> -PrivateKeyPath <path to private.pem> -KeySize 2048
      

      Ниже приведен пример выходных данных:

      Generating import JSON for key <WrappingKeyName> at temporary location C:\Users\HCIDeploymentUser\AppData\Local\Temp\tmpD383.tmp... 
      Importing key <WrappingKeyName> into the vault...
      Key <WrappingKeyName> successfully imported into the vault.
      Temporary file C:\Users\HCIDeploymentUser\AppData\Local\Temp\tmpD383.tmp has been cleaned up.
      
  4. Выполните этот шаг, только если вы восстанавливаете виртуальную машину в том же локальном экземпляре Azure, где виртуальная машина находилась до сбоя. Удалите следующее AzureStackTvmAKRootKey.

    Remove-MocKey -name  AzureStackTvmAKRootKey -group AzureStackHostAttestation -keyvaultName AzureStackTvmKeyVault
    
  5. Восстановите ключи из резервной копии:

    Import-TVMKeys -WrappingKeyName <WrappingKeyName> -BackupPath <path to timestamped backup folder>
    

    Ниже приведен пример выходных данных:

    Importing TVM  keys from .\<backup root folder>\20250722192116\
    
    Importing key 7fb16fe7-00a0-476f-92b3-ccb98fd9525a with size 256 from AES folder path = .\<backup root folder>\20250722192116\AES\7fb16fe7-00a0-476f-92b3-ccb98fd9525a_256.json
    
    Importing key AzureStackTvmAKRootKey with size 4096 from RSA folder path = .\<backup root folder>\20250722192116\RSA\AzureStackTvmAKRootKey_4096.json
    

    Если локальное хранилище ключей локального экземпляра Azure уже имеет ключ защиты гостевой виртуальной машины с тем же именем или уже имеет AzureStackTvmAKRootKeyзначение, вы получите ошибку InvalidVersion для этого ключа. Это можно игнорировать, так как ключ уже находится в хранилище ключей.

    Ниже приведен пример выходных данных, показывающих эту ошибку:

    Importing TVM  keys from .\<backup root folder>\20250722192116\
    Importing key 7fb16fe7-00a0-476f-92b3-ccb98fd9525a with size 256 from AES folder path = .\<backup root folder>\20250722192116\AES\7fb16fe7-00a0-476f-92b3-ccb98fd9525a_256.json
    Import-TVMKeys : Error Importing Key: C:\Program Files\AksHci\mocctl.exe --cloudFqdn
    s-cluster.v.masd.stbtest.microsoft.com  security keyvault key import --group "AzureStackHostAttestation" --key-size
    "256" --vault-name "AzureStackTvmKeyVault" --key-type "AES" --key-file-path
    ".\<backup root folder>\20250722192116\AES\7fb16fe7-00a0-476f-92b3-ccb98fd9525a_256.json" --name
    "7fb16fe7-00a0-476f-92b3-ccb98fd9525a" --wrapping-key-name "WrappingKey" System.Collections.Hashtable.generic_non_zero
    1 [Error: Keys Import failed:  Type[Key] Vault[AzureStackTvmKeyVault] Name[7fb16fe7-00a0-476f-92b3-ccb98fd9525a]:
    InvalidVersion]
    + CategoryInfo          : NotSpecified: (:) [Write-Error], WriteErrorException
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException,Import-TVMKeys
    
    Importing key AzureStackTvmAKRootKey with size 4096 from RSA folder path = .\<backup root folder>\20250722192116\RSA\AzureStackTvmAKRootKey_4096.json
    Import-TVMKeys : Error Importing Key: C:\Program Files\AksHci\mocctl.exe --cloudFqdn
    s-cluster.v.masd.stbtest.microsoft.com  security keyvault key import --group "AzureStackHostAttestation" --key-size
    "4096" --vault-name "AzureStackTvmKeyVault" --key-type "RSA" --key-file-path
    ".\<backup root folder>\20250722192116\RSA\AzureStackTvmAKRootKey_4096.json" --name "AzureStackTvmAKRootKey"
    --wrapping-key-name "WrappingKey" System.Collections.Hashtable.generic_non_zero 1 [Error: Keys Import failed:
    Type[Key] Vault[AzureStackTvmKeyVault] Name[AzureStackTvmAKRootKey]: InvalidVersion]
    + CategoryInfo          : NotSpecified: (:) [Write-Error], WriteErrorException
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException,Import-TVMKeys
    
  6. Очистка файлов и ключей:

    1. Удалите оба файла public.pem и private.pem из локального экземпляра Azure.

      Important

      Удалите ключ-оболочку из хранилища ключей локального экземпляра Azure с помощью Remove-MocKey. Это помогает избежать конфликтов позже.

      Remove-MocKey -name WrappingKeyName -group AzureStackHostAttestation -keyvaultName AzureStackTvmKeyVault
      

Дальнейшие шаги