Migration von VMs mit vTPM

Ronny Böttcher

Microsoft-Systemadministrator seit 2007 und seit 2021 als IT-Consultant bei Bechtle in Deutschland am Standort Mannheim; alle bisherigen Stationen siehe bei "Über mich". In seiner Freizeit bei der Feuerwehr und Modellbahner, zudem gerne am Kochen/Grillen - oder am Essen 😁

3 Antworten

  1. Volker sagt:

    Wow, das sieht in der Tat nach einer heftigen Bastelei aus.
    Mal sehen ob ich das im Sommer nach meinem Urlaub mal irgendwo nachbauen kann.
    Herzlichen Dank

  2. Volker sagt:

    So bekommt man die Kisten zum Laufen, vielen Dank erst mal dafür.
    Aber nehmen wir an, die Vertrauenswürdigkeit des ursprünglichen Zertifikats läuft dann irgendwann später ab.
    Die Box, der das ursprüngliche Zertifikat gehört ist dekomissioniert.
    Wie übertrage ich den vTPM Inhalt in ein neues vTPM, das möglichst von meinem neuen Hypervisor gebaut wurde?

    • Hallo Volker,

      vielen Dank für deinen Kommentar.
      Das ist korrekt, nach Ablauf des Zertifikats wäre die VM dann nicht mehr nutzbar. Hier ging es erstmal nur um einen Wechsel auf einem Test-Host mit Test-VMs, die keine lange Lebenszeit hätten. Möchte man diesen Prozess für einen Produktive-HyperV abbilden, wo die VMs durchaus länger als das Zertifikat sein können, müsste man wesentlich mehr durchführen. Hier wäre es dann ratsam mittels PowerShell den sog. „KeyProtector“ zu exportieren und auf dem Ziel-System wieder zu importieren.

      Hier mal ein Beispiel, bei dem eine neue Shielded-VM erstellt wird, anschließend exportiert (inkl. KP) und importiert:

      # ================================
      # Shielded VM Lab Toolkit (Standalone ohne HGS)
      # ================================

      function Show-Menu {
      Clear-Host
      Write-Host "🛡️ Shielded VM Testlab Menu" -ForegroundColor Cyan
      Write-Host "1. Neue vTPM-VM erstellen"
      Write-Host "2. KeyProtector exportieren"
      Write-Host "3. VM exportieren"
      Write-Host "4. VM + KeyProtector importieren"
      Write-Host "5. Beenden"
      }

      function Create-ShieldedVM {
      $VMName = Read-Host "Name der neuen VM"
      $VMPath = "C:\HyperV\ShieldedVMs\$VMName"
      $VHDPath = "$VMPath\$VMName.vhdx"
      $ISOPath = Read-Host "Pfad zur Installations-ISO"
      $SwitchName = Read-Host "Name des virtuellen Switch (z. B. 'Default Switch')"

      New-Item -ItemType Directory -Path $VMPath -Force | Out-Null
      New-VHD -Path $VHDPath -SizeBytes 60GB -Dynamic
      New-VM -Name $VMName -MemoryStartupBytes 4GB -Generation 2 -VHDPath $VHDPath -Path $VMPath -SwitchName $SwitchName
      Set-VMFirmware -VMName $VMName -EnableSecureBoot On
      Set-VMKeyProtector -VMName $VMName -NewLocalKeyProtector
      Enable-VMTPM -VMName $VMName
      Set-VMDvdDrive -VMName $VMName -Path $ISOPath
      Set-VM -Name $VMName -AutomaticStartAction StartIfRunning
      Start-VM -Name $VMName

      Write-Host "✅ VM '$VMName' wurde erstellt und gestartet." -ForegroundColor Green
      Pause
      }

      function Export-KeyProtector {
      $VMName = Read-Host "Name der VM für Export"
      $ExportPath = "C:\ExportedKeys\$VMName"
      New-Item -Path $ExportPath -ItemType Directory -Force | Out-Null
      Export-VMKeyProtector -VMName $VMName -FilePath "$ExportPath\$VMName.keyprotector"
      Write-Host "🔐 KeyProtector exportiert nach: $ExportPath" -ForegroundColor Yellow
      Pause
      }

      function Export-VMFiles {
      $VMName = Read-Host "Name der zu exportierenden VM"
      $ExportPath = "C:\ExportedVMs\$VMName"
      Export-VM -Name $VMName -Path $ExportPath
      Write-Host "📦 VM exportiert nach: $ExportPath" -ForegroundColor Yellow
      Pause
      }

      function Import-VMAndKey {
      $VMPath = Read-Host "Pfad zur importierten VM (z. B. D:\ImportedVMs\TestShieldedVM)"
      $VMName = Read-Host "Name der importierten VM"
      $KeyFile = Read-Host "Pfad zum KeyProtector-File (.keyprotector)"

      Import-VM -Path $VMPath -Copy -GenerateNewId
      Import-VMKeyProtector -VMName $VMName -FilePath $KeyFile
      Enable-VMTPM -VMName $VMName

      Write-Host "✅ VM importiert und KeyProtector angewendet." -ForegroundColor Green
      Pause
      }
      do {
      Show-Menu
      $choice = Read-Host "Auswahl (1-5)"
      switch ($choice) {
      "1" { Create-ShieldedVM }
      "2" { Export-KeyProtector }
      "3" { Export-VMFiles }
      "4" { Import-VMAndKey }
      "5" { Write-Host "👋 Skript beendet. Viel Erfolg!" -ForegroundColor Cyan }
      default { Write-Host "Ungültige Eingabe." -ForegroundColor Red; Pause }
      }
      } while ($choice -ne "5")

      Alternativ kann über einen sog. „HGS – Host Guardian Service“ nachgedacht werden; dort werden dann die Hyper-V Systeme registriert und dieser verwaltet dann die KeyProtectors. Ich nehme mir das Thema mit dem HGS mal als Notiz mit und würde dazu noch einen Artikel verfassen. Vermutlich aber erst gegen Herbst, wenn die Tage wieder kürzer & kälter werden und man mehr drinnen verbringt, denn aktuell ist die Liste mit Themen recht lang.

      Viele Grüße
      Ronny

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre, wie deine Kommentardaten verarbeitet werden.

DSGVO Cookie Consent mit Real Cookie Banner