Partager via


Tutoriel : Sauvegarde et restauration

Microsoft Azure Cloud HSM vous permet de sauvegarder et de restaurer votre HSM cloud, en conservant toutes les clés, versions, attributs, balises et attributions de rôles.

Important

Lorsque vous créez une sauvegarde HSM Cloud Azure, elle est protégée par une clé dérivée du HSM. Microsoft n’a pas de visibilité ni d’accès à la clé dérivée protégeant vos sauvegardes. Azure Cloud HSM ne prend pas en charge la restauration d’une sauvegarde sur son HSM source ou tout HSM cloud déjà activé. Pour restaurer, utilisez un autre HSM cloud non activé dans n’importe quelle région préférée. Sinon, l’opération de restauration échoue, rendant le HSM cloud de destination non fonctionnelle.

Conditions préalables

Les prérequis suivants sont nécessaires pour les opérations de sauvegarde et de restauration HSM Cloud Azure.

  • Identité de service managée configurée pour la source et la destination Azure Cloud HSM.
  • Stockage Blob Azure avec contrôle d’accès en fonction du rôle (RBAC) (Contributeur de données de Stockage Blob).
  • La ressource de destination HSM cloud Azure doit être dans l’état NotActivated.

Les configurations suivantes ne sont pas prises en charge pour la sauvegarde et la restauration avec azure Cloud HSM.

  • Les jetons SAS pour conteneurs de stockage ne sont pas pris en charge.

Appliquer une msi à HSM cloud et créer un compte de stockage pour les sauvegardes HSM

Création d’une identité de service managé

Créez une identité de service managé affectée par l’utilisateur dans votre groupe de ressources Azure Cloud HSM existant. Dans cet exemple guidé, nous utilisons CHSM-MSI et CHSM-SERVER-RG, le nom du groupe de ressources référencé dans l’exemple de guide d’intégration du HSM cloud Azure.

# 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

Appliquer MSI à un HSM cloud source et de destination

Pour les opérations de sauvegarde et de restauration HSM cloud Azure, une identité de service managée (MSI) doit être appliquée à vos ressources HSM cloud source et de destination. Chaque cluster HSM cloud ne peut avoir qu’une seule MSI. Vous pouvez utiliser la même MSI pour la source et la destination ou utiliser des MSIs différentes pour chacun d’eux. Dans cet exemple guidé, nous appliquons la même MSI aux ressources HSM cloud source et de destination.

# 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

Créer un compte de stockage dans votre réseau virtuel privé pour les sauvegardes HSM cloud

Configurez l’infrastructure de stockage pour les opérations de sauvegarde HSM cloud Azure en définissant et en configurant un compte de stockage et un conteneur d’objets blob associé au sein d’un réseau virtuel privé. Commencez par définir l’ID d’abonnement et en spécifiant les paramètres du compte de stockage, notamment l’emplacement, la référence SKU et le type. Le processus inclut la création d’un groupe de ressources, l’établissement du compte de stockage avec des règles réseau pour restreindre l’accès à un réseau virtuel désigné et améliorer la sécurité via un point de terminaison privé. Un point de terminaison privé est configuré pour un accès sécurisé et le rôle « Contributeur aux données blob de stockage » est affecté à une identité spécifiée pour garantir les autorisations appropriées pour les tâches de sauvegarde. Dans cet exemple, nous créons un groupe de ressources nommé CHSM-BACKUP-RG, un compte de stockage appelé chsmbackup00 et un conteneur d’objets blob nommé chsmbackupcontainer00, avec un accès en lecture/écriture accordé pour la source et la destination.

Important

Le rôle RBAC minimal requis est Contributeur de données de Stockage Blob. Les comptes de stockage public sont accessibles via l’Internet public. Placez donc votre compte de stockage derrière un réseau virtuel privé pour renforcer la sécurité.

# 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

Désactiver l’accès à la clé partagée via le paramètre du portail

Désactivez l’accès à la clé partagée pour améliorer la sécurité. Pour ce faire, accédez à votre compte de stockage Azure, sélectionnez Configuration des paramètres >> , puis définissez « Autoriser l’accès à la clé du compte de stockage » sur « Désactivé ».

Sauvegarde HSM cloud Azure

Lancer la sauvegarde HSM cloud depuis l’appareil HSM source

Démarrez une sauvegarde pour votre HSM Cloud Azure source en envoyant une requête POST avec l’URI du conteneur de stockage au point de terminaison de l’API de sauvegarde. Surveillez la progression de la sauvegarde en envoyant une requête GET à l’URL dans les en-têtes de réponse. Le script récupère et affiche l’état du travail de sauvegarde et l’ID de sauvegarde unique de la réponse, confirmant que la sauvegarde a démarré et suivi sa progression.

# 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

Sortie attendue : $backupStatus retourne « Réussi » et $backupID affiche l’ID de sauvegarde correspondant pour la sauvegarde que vous avez lancée.

Restauration HSM cloud Azure

Lancer la restauration du HSM cloud vers le HSM de destination

Démarrez une opération de restauration pour le HSM cloud Azure de destination en fournissant les propriétés de restauration nécessaires, y compris l’URI du conteneur de stockage et l’ID de sauvegarde. Le script crée l’URI approprié pour le point de terminaison de l’API de restauration et envoie une requête POST pour lancer la restauration. Pour surveiller la progression de la restauration, envoyez une requête GET à l’emplacement spécifié dans les en-têtes de réponse et récupérez l’état du travail de restauration pour confirmer son achèvement.

$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

Sortie attendue : $jobStatus doit retourner « Réussi ».

Valider la restauration vers le HSM cloud de destination

Après un certain temps de traitement, l’opération de restauration doit indiquer « Réussi », et le HSM cloud de destination doit afficher l’état d’activation « Actif ». Lorsque vous vous connectez au HSM cloud de destination où vous avez effectué l’opération de restauration, l’exécution azcloudhsm_mgmt_util et l’exécution getClusterInfo doivent afficher les trois nœuds comme actifs et disponibles.

Important

Lors de la connexion à Azure Cloud HSM à partir de la machine virtuelle d’administration, mettez à jour les fichiers de configuration client et de gestion (azcloudhsm_resource.cfg) pour pointer vers le HSM cloud de destination approprié où la restauration a été effectuée.

  1. Pour démarrer azcloudhsm_mgmt_util, exécutez :

    Linux

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

    Windows

    cd azcloudhsm_mgmt_util 
    .\azcloudhsm_mgmt_util.exe .\azcloudhsm_resource.cfg
    
  2. À l’intérieur de l’utilitaire de gestion, le prompt devient cloudmgmt. Pour répertorier les informations du cluster, exécutez :

    getClusterInfo  
    

    Sortie attendue :getClusterInfo doit confirmer que les trois nœuds sont désormais disponibles pour votre cluster HSM Cloud Azure.

  3. Quittez l’utilitaire de gestion, puis lancez l’utilitaire Azure Cloud HSM (azcloudhsm_util). Connectez-vous en tant que CU et exécutez la commande findKey.

    Important

    Les descripteurs de clé peuvent changer, car ils sont dynamiques ; toutefois, les ID de clé ne changent pas.

    Linux

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

    Windows

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

Étapes suivantes