Freigeben über


Lernprogramm: Sicherung und Wiederherstellung

Mit Microsoft Azure Cloud HSM können Sie Ihre Cloud HSM sichern und wiederherstellen, wobei alle Schlüssel, Versionen, Attribute, Tags und Rollenzuweisungen beibehalten werden.

Wichtig

Wenn Sie eine Azure Cloud HSM-Sicherung erstellen, wird sie durch einen schlüssel geschützt, der innerhalb des HSM abgeleitet ist. Microsoft verfügt nicht über Sichtbarkeit oder Zugriff auf den abgeleiteten Schlüssel, der Ihre Sicherungen schützt. Azure Cloud HSM unterstützt das Wiederherstellen einer Sicherung auf deren Quell-HSM oder Cloud HSM, die bereits aktiviert ist. Verwenden Sie zum Wiederherstellen eine andere nicht aktivierte Cloud HSM in einer beliebigen bevorzugten Region. Andernfalls schlägt der Wiederherstellungsvorgang fehl, wodurch die Zielcloud HSM nicht funktional gerendert wird.

Voraussetzungen

Die folgenden Voraussetzungen unterstützen Azure Cloud HSM-Sicherungs- und Wiederherstellungsvorgänge.

  • Verwaltete Dienstidentität, die für Azure Cloud HSM-Quelle und -Ziel konfiguriert ist.
  • Azure Blob Storage mit RBAC (Storage Blob Data Contributor).
  • Die Azure Cloud HSM-Zielressource muss sich im Status "NotActivated" befinden.

Die folgenden Konfigurationen werden für die Sicherung und Wiederherstellung mit Azure Cloud HSM nicht unterstützt.

  • Speichercontainer-SAS-Token werden nicht unterstützt.

Anwenden einer MSI-Datei auf Cloud HSM und Erstellen eines Speicherkontos für HSM-Sicherungen

Erstellen einer verwalteten Dienstidentität

Erstellen Sie eine neue vom Benutzer zugewiesene verwaltete Dienstidentität in Ihrer vorhandenen Azure Cloud HSM-Ressourcengruppe. In diesem geführten Beispiel verwenden wir CHSM-MSI und CHSM-SERVER-RG, den Ressourcengruppennamen, auf den im Beispiel für das Azure Cloud HSM-Onboarding verwiesen wird.

# Define parameters for the new managed service identity (MSI)
$identity = @{
    Location          = "<RegionName>"                                         
    ResourceName      = "<MSIName>"                                         
    ResourceGroupName = "<ResourceGroupName>"
    SubscriptionID    = "<SubscriptionID>"     
}

# Create a new user-assigned managed service identity (MSI) in the specified resource group and location
New-AzUserAssignedIdentity -Name $identity.ResourceName -ResourceGroupName $identity.ResourceGroupName -Location $identity.Location

Anwenden von MSI auf Quell- und Ziel-Cloud-HSM

Für Azure Cloud HSM-Sicherungs- und Wiederherstellungsvorgänge muss eine verwaltete Dienstidentität (MANAGED Service Identity, MSI) sowohl auf Ihre Quell- als auch die Ziel-Cloud HSM-Ressourcen angewendet werden. Jeder Cloud HSM-Cluster kann nur über eine MSI-Datei verfügen. Sie können entweder die gleiche MSI-Datei sowohl für die Quelle als auch für das Ziel verwenden oder für jedes unterschiedliche MSIs verwenden. In diesem geführten Beispiel wenden wir dasselbe MSI sowohl auf die Quell- als auch die Ziel-Cloud HSM-Ressourcen an.

# Define the source Cloud HSM parameters
$sourceCloudHSM = @{
    Location          = "<RegionName>"                              
    Sku               = @{ "family" = "B"; "Name" = "Standard_B1" } 
    ResourceName      = "<SourceCloudHSMName>"                
    ResourceType      = "microsoft.hardwaresecuritymodules/cloudHsmClusters" 
    ResourceGroupName = "<SourceResourceGroupName>"             
    Force             = $true                                    
}

# Define the destination Cloud HSM parameters
$destinationCloudHSM = @{
    Location          = "<RegionName>"                              
    Sku               = @{ "family" = "B"; "Name" = "Standard_B1" } 
    ResourceName      = "<DestinationCloudHSMName>"            
    ResourceType      = "microsoft.hardwaresecuritymodules/cloudHsmClusters" 
    ResourceGroupName = "<DestinationResourceGroupName>"             
    Force             = $true                                    
}

# Define the Cloud HSM MSI patch payload
$chsmMSIPatch = '{
    "Sku": {
        "Family": "B",
        "Name": "Standard_B1"
    },
    "Location": "<RegionName>",    
    "Identity": {
        "type": "UserAssigned",
        "userAssignedIdentities": {
            "/subscriptions/<SubscriptionID>/resourcegroups/<ResourceGroupName>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<MSIName>": {}
        }
    }
}'

# Construct the source URI
$sourceURI = "/subscriptions/$($identity.SubscriptionID)/resourceGroups/$($sourceCloudHSM.ResourceGroupName)/providers/Microsoft.HardwareSecurityModules/cloudHsmClusters/$($sourceCloudHSM.ResourceName)?api-version=2024-06-30-preview"

# Construct the destination URI
$destinationURI = "/subscriptions/$($identity.SubscriptionID)/resourceGroups/$($destinationCloudHSM.ResourceGroupName)/providers/Microsoft.HardwareSecurityModules/cloudHsmClusters/$($destinationCloudHSM.ResourceName)?api-version=2024-06-30-preview"

# Invoke REST method to update the source Cloud HSM with MSI patch
Invoke-AzRestMethod -Path $sourceURI -Method Put -Payload $chsmMSIPatch

# Invoke REST method to update the destination Cloud HSM with MSI patch
Invoke-AzRestMethod -Path $destinationURI -Method Put -Payload $chsmMSIPatch

Erstellen eines Speicherkontos in Ihrem privaten VNET für Cloud HSM-Sicherungen

Richten Sie die Speicherinfrastruktur für Azure Cloud HSM-Sicherungsvorgänge ein, indem Sie ein Speicherkonto und einen zugeordneten BLOB-Container in einem privaten virtuellen Netzwerk definieren und konfigurieren. Definieren Sie zunächst die Abonnement-ID, und geben Sie die Speicherkontoparameter an, einschließlich Standort, SKU und Typ. Der Prozess umfasst das Erstellen einer neuen Ressourcengruppe, das Einrichten des Speicherkontos mit Netzwerkregeln, um den Zugriff auf ein bestimmtes virtuelles Netzwerk einzuschränken und die Sicherheit über einen privaten Endpunkt zu verbessern. Ein privater Endpunkt ist für den sicheren Zugriff eingerichtet, und die Rolle "Storage Blob Data Contributor" wird einer bestimmten Identität zugewiesen, um geeignete Berechtigungen für Sicherungsaufgaben sicherzustellen. In diesem Beispiel erstellen wir eine neue Ressourcengruppe namens "CHSM-BACKUP-RG", ein Speicherkonto namens "chsmbackup00" und einen BLOB-Container mit dem Namen "chsmbackupcontainer000" mit Lese-/Schreibzugriff, der sowohl für Die Quelle als auch für das Ziel gewährt wurde.

Wichtig

Die minimale RBAC-Rolle ist Storage Blob Data Contributor. Auf öffentliche Speicherkonten kann über das öffentliche Internet zugegriffen werden. Platzieren Sie daher Ihr Speicherkonto hinter einem privaten VNET, um die Sicherheit zu erhöhen.

# Define the subscription ID
$subscriptionId = "<SubscriptionID>"

# Define storage account parameters
$storageAccount = @{
    Location          = "<RegionName>"                    
    ResourceGroupName = "<BackupResourceGroupName>" 
    AccountName       = "<ResourceName>"      # Name for the storage account
    SkuName           = "<StorageAccountSKU>"     # Storage account SKU (example: Standard_LRS)
    Kind              = "<StorageAccountType>"       #Type of storage account (example: StorageV2)
}

# Define the blob container parameters
$container = @{
    ResourceGroupName  = $storageAccount.ResourceGroupName # Resource group name where the storage account is located
    StorageAccountName = $storageAccount.AccountName      # Name of the storage account
    ContainerName      = "<StorageContainerName>"              # Name for the blob container
}

# Define the private endpoint parameters
# Storage accounts are publicly accessible, its recommended to put it behind a private VNET
$privateEndpoint = @{
    Name              = "<PrivateEndpointName>"
    VnetName          = "<ExistingVNetName>"  # Name of the existing VNet
    SubnetName        = "<ExistingSubnetName>"  # Name of the existing subnet within the VNet
    ResourceGroupName = "<ResourceGroupName>" # Resource group for private VNet and subnet (example: CHSM-CLIENT-RG)
}

# Define the role assignment parameters
$roleAssignment = @{
    RoleDefinitionName = "Storage Blob Data Contributor"  # Minimum RBAC role required
    PrincipalId        = "<PrincipalId>"  # The ID of the managed identity or user to assign the role to
    Scope              = "/subscriptions/$($subscriptionId)/resourceGroups/$($storageAccount.ResourceGroupName)/providers/Microsoft.Storage/storageAccounts/$($storageAccount.AccountName)"
}

# Create a new resource group with the specified name and location
New-AzResourceGroup -Name $storageAccount.ResourceGroupName -Location $storageAccount.Location -Force

# Create a new storage account in the specified resource group and location
# This command sets up the storage account needed for backup operations
New-AzStorageAccount -ResourceGroupName $storageAccount.ResourceGroupName `
    -Name $storageAccount.AccountName `
    -Location $storageAccount.Location `
    -SkuName $storageAccount.SkuName `
    -Kind $storageAccount.Kind

# Retrieve the storage account key
$storageAccountKey = (Get-AzStorageAccountKey -ResourceGroupName $storageAccount.ResourceGroupName -Name $storageAccount.AccountName)[0].Value

# Create the storage context
$storageAccountContext = New-AzStorageContext -StorageAccountName $storageAccount.AccountName -StorageAccountKey $storageAccountKey

# Create the blob container in the storage account
New-AzStorageContainer -Name $container.ContainerName -Context $storageAccountContext

# Retrieve the virtual network and subnet object
$vnet = Get-AzVirtualNetwork -ResourceGroupName $privateEndpoint.ResourceGroupName -Name $privateEndpoint.VnetName
$subnet = $vnet.Subnets | Where-Object { $_.Name -eq $privateEndpoint.SubnetName }

# Create the private endpoint for the storage account in the existing VNet
New-AzPrivateEndpoint -ResourceGroupName $storageAccount.ResourceGroupName `
    -Name $privateEndpoint.Name `
    -Location $storageAccount.Location `
    -PrivateLinkServiceConnection @(
        @{
            Name = "$($storageAccount.AccountName)-connection"
            PrivateLinkServiceConnectionState = @{
                Status = "Approved"
                Description = "Private Endpoint Connection"
            }
            PrivateLinkServiceId = "/subscriptions/$subscriptionId/resourceGroups/$($storageAccount.ResourceGroupName)/providers/Microsoft.Storage/storageAccounts/$($storageAccount.AccountName)"
            GroupIds = @("blob")  # Add this parameter with the required group ID
        }
    ) `
    -Subnet $subnet 

# Assign 'Storage Blob Data Contributor' role to the specified identity
New-AzRoleAssignment -RoleDefinitionName $roleAssignment.RoleDefinitionName `
    -PrincipalId $roleAssignment.PrincipalId `
    -Scope $roleAssignment.Scope

Deaktivieren des Zugriffs auf gemeinsam genutzte Schlüssel über die Portaleinstellung

Deaktivieren Sie den Zugriff auf gemeinsam genutzte Schlüssel, um die Sicherheit zu verbessern. Navigieren Sie dazu zu Ihrem Azure Storage-Konto, wählen Sie "Einstellungskonfiguration >> " aus, und legen Sie "Zugriff auf den Speicherkontoschlüssel zulassen" auf "Deaktiviert" fest.

Azure Cloud HSM Backup

Starten der Cloud HSM-Sicherung vom Quell-HSM

Starten Sie eine Sicherung für Ihre Quell-Azure Cloud HSM, indem Sie eine POST-Anforderung mit dem Speichercontainer-URI an den Sicherungs-API-Endpunkt senden. Überwachen Sie den Fortschritt der Sicherung, indem Sie eine GET-Anforderung an die URL in den Antwortheadern senden. Das Skript ruft den Status des Sicherungsauftrags und die eindeutige Sicherungs-ID aus der Antwort ab und zeigt sie an, dass die Sicherung gestartet wurde, und den Fortschritt nachverfolgt.

# Define backup properties, including the URI for the Azure Storage Blob container
$backupProperties = ConvertTo-Json @{
    azureStorageBlobContainerUri = "https://$($container.StorageAccountName).blob.core.windows.net/$($container.ContainerName)"
}

# Construct the URI for the backup operation using the provided parameters
$backupUri = "/subscriptions/$($identity.SubscriptionID)/resourceGroups/$($sourceCloudHSM.ResourceGroupName)/providers/Microsoft.HardwareSecurityModules/cloudHsmClusters/$($sourceCloudHSM.ResourceName)/backup?api-version=2024-06-30-preview"

# Initiate the backup operation by sending a POST request with the backup properties
$response = Invoke-AzRestMethod -Path $backupUri -Method Post -Payload $backupProperties

# Check the backup job status to confirm it succeeded
$jobStatus = Invoke-AzRestMethod -Method 'GET' -Uri $response.Headers.Location
$backupStatus = (ConvertFrom-Json $jobStatus.Content).properties.status

# Extract the backup ID from the job status response
$backupID = (ConvertFrom-Json $jobStatus.Content).properties.backupId

# Output the backup status and backup ID
$backupStatus
$backupID

Erwartete Ausgabe: $backupStatus Gibt "Erfolgreich" zurück und $backupID zeigt die entsprechende Sicherungs-ID für die von Ihnen initiierte Sicherung an.

Azure Cloud HSM-Wiederherstellung

Initiieren Sie die Wiederherstellung von Cloud HSM zum Ziel-HSM.

Starten Sie einen Wiederherstellungsvorgang für das Ziel Azure Cloud HSM, indem Sie die erforderlichen Wiederherstellungseigenschaften bereitstellen, einschließlich des Speichercontainer-URI und der Sicherungs-ID. Das Skript erstellt den richtigen URI für den Wiederherstellungs-API-Endpunkt und sendet eine POST-Anforderung, um die Wiederherstellung zu initiieren. Um den Wiederherstellungsfortschritt zu überwachen, senden Sie eine GET-Anforderung an den Speicherort, der in den Antwortheadern angegeben ist, und rufen Sie den Status des Wiederherstellungsjobs ab, um den Abschluss zu bestätigen.

$restoreProperties = ConvertTo-Json @{
    "azureStorageBlobContainerUri" = "https://$($container.StorageAccountName).blob.core.windows.net/$($container.ContainerName)"
    "backupId" = "$($backupID)"
}

# Set the URI for the restore API endpoint using the subscription ID, resource group, and destination server details
$restoreUri = "/subscriptions/$($identity.SubscriptionID)/resourceGroups/$($destinationCloudHSM.ResourceGroupName)/providers/Microsoft.HardwareSecurityModules/cloudHsmClusters/$($destinationCloudHSM.ResourceName)/restore?api-version=2024-06-30-preview"

# Initiate the restore operation by sending a POST request to the restore API endpoint with the defined properties
$response = Invoke-AzRestMethod -Path $restoreUri -Method Post -Payload $restoreProperties 

# Check the status of the restore job by sending a GET request to the location provided in the response headers
$jobStatus = Invoke-AzRestMethod -Method 'GET' -Uri $response.Headers.Location

# Extract and display the status of the restore job
(ConvertFrom-Json $jobStatus.Content).properties.status

Erwartete Ausgabe: $jobStatus sollte "Erfolgreich" zurückgeben.

Überprüfung der Wiederherstellung zum Ziel-Cloud-HSM

Nach einiger Verarbeitungszeit sollte der Wiederherstellungsvorgang als "Erfolgreich" angezeigt werden, und das Zielcloud-HSM sollte den Aktivierungsstatus "Aktiv" anzeigen. Wenn Sie sich mit dem Zielcloud-HSM verbinden, auf dem Sie den Wiederherstellungsvorgang durchgeführt haben, sollten azcloudhsm_mgmt_util und getClusterInfo zeigen, dass alle drei Knoten als aktiv und verfügbar angezeigt werden.

Wichtig

Aktualisieren Sie beim Herstellen einer Verbindung mit Azure Cloud HSM von der Administrator-VM sowohl die Client- als auch die Verwaltungskonfigurationsdateien (azcloudhsm_resource.cfg) so, dass sie auf das richtige Ziel cloud HSM verweisen, in dem die Wiederherstellung ausgeführt wurde.

  1. Starten Sie azcloudhsm_mgmt_util durch Ausführen von:

    Linux

    cd /usr/local/bin/AzureCloudHSM-ClientSDK-* 
    sudo ./azcloudhsm_mgmt_util ./azcloudhsm_resource.cfg
    

    Fenster

    cd azcloudhsm_mgmt_util 
    .\azcloudhsm_mgmt_util.exe .\azcloudhsm_resource.cfg
    
  2. Innerhalb des Verwaltungsprogramms wird die Eingabeaufforderung cloudmgmt. Führen Sie Folgendes aus, um die Clusterinformationen auflisten zu können:

    getClusterInfo  
    

    Erwartete Ausgabe:getClusterInfo sollte bestätigen, dass alle drei Knoten jetzt für Ihren Azure Cloud HSM-Cluster verfügbar sind.

  3. Beenden Sie das Verwaltungsprogramm, und starten Sie dann das Azure Cloud HSM Utility (azcloudhsm_util). Melden Sie sich als CU an, und führen Sie den findKey Befehl aus.

    Wichtig

    Tastenziehpunkte können sich ändern, da sie dynamisch sind; Schlüssel-IDs werden jedoch nicht geändert.

    Linux

    ./azcloudhsm_util  
    loginHSM -u CU -s cu1 -p user1234
    findKey
    

    Fenster

    azcloudhsm_util.exe
    loginHSM -u CU -s cu1 -p user1234  
    findKey
    

Nächste Schritte