Compartir a través de


Tutorial: Copia de seguridad y restauración

Microsoft Azure Cloud HSM le permite realizar copias de seguridad y restaurar el HSM en la nube, conservando todas las claves, versiones, atributos, etiquetas y asignaciones de roles.

Importante

Al crear una copia de seguridad de HSM en la nube de Azure, está protegida por una clave derivada del HSM. Microsoft no tiene visibilidad ni acceso a la clave derivada que protege las copias de seguridad. Azure Cloud HSM no admite la restauración de una copia de seguridad en su HSM de origen ni en ningún HSM en la nube que ya esté activado. Para restaurarlo, use otro HSM en la nube no activado en cualquier región preferida. De lo contrario, se produce un error en la operación de restauración, lo que representa el HSM en la nube de destino no funcional.

Prerrequisitos

Los siguientes requisitos previos admiten las operaciones de copia de seguridad y restauración de Azure Cloud HSM.

  • Identidad de servicio administrada configurada para el origen y el destino de HSM en la nube de Azure.
  • Azure Blob Storage con RBAC (Colaborador de datos de blob de almacenamiento).
  • El recurso de destino de Azure Cloud HSM debe estar en estado NotActivated.

No se admiten las siguientes configuraciones para la copia de seguridad y restauración con Azure Cloud HSM.

  • No se admiten tokens SAS de contenedor de almacenamiento.

Aplicar un MSI a HSM en la nube y crear una cuenta de almacenamiento para copias de seguridad de HSM

Creación de una identidad de servicio administrada

Cree una identidad de servicio administrada asignada por el usuario en el grupo de recursos de Azure Cloud HSM existente. En este ejemplo guiado, usamos CHSM-MSI y CHSM-SERVER-RG, el nombre del grupo de recursos al que se hace referencia en el ejemplo de la guía de incorporación de HSM en la nube de 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

Aplicación de MSI al HSM en la nube de origen y destino

En el caso de las operaciones de copia de seguridad y restauración de Azure Cloud HSM, se debe aplicar una identidad de servicio administrada (MSI) a los recursos de HSM en la nube de origen y destino. Cada clúster de HSM en la nube solo puede tener un MSI. Puede usar la misma MSI para el origen y el destino o usar diferentes MSIs para cada uno. En este ejemplo guiado, aplicamos la misma MSI a los recursos HSM en la nube de origen y destino.

# 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

Creación de una cuenta de almacenamiento en la red virtual privada para copias de seguridad de HSM en la nube

Configure la infraestructura de almacenamiento para las operaciones de copia de seguridad de HSM en la nube de Azure definiendo y configurando una cuenta de almacenamiento y un contenedor de blobs asociado dentro de una red virtual privada. Comience definiendo el identificador de suscripción y especificando los parámetros de la cuenta de almacenamiento, incluida la ubicación, la SKU y el tipo. El proceso incluye la creación de un nuevo grupo de recursos, el establecimiento de la cuenta de almacenamiento con reglas de red para restringir el acceso a una red virtual designada y mejorar la seguridad a través de un punto de conexión privado. Se configura un punto de conexión privado para el acceso seguro y el rol "Colaborador de datos de Storage Blob" se asigna a una identidad especificada para garantizar los permisos adecuados para las tareas de copia de seguridad. En este ejemplo, se crea un nuevo grupo de recursos denominado CHSM-BACKUP-RG, una cuenta de almacenamiento denominada chsmbackup00 y un contenedor de blobs denominado chsmbackupcontainer00, con acceso de lectura y escritura concedido para origen y destino.

Importante

El rol de RBAC mínimo necesario es Colaborador de datos de blob de almacenamiento. Las cuentas de almacenamiento público son accesibles a través de la red pública de Internet, por lo que coloca la cuenta de almacenamiento detrás de una red virtual privada para mejorar la seguridad.

# 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

Deshabilitación del acceso a claves compartidas a través de la configuración del portal

Deshabilite el acceso a claves compartidas para mejorar la seguridad. Para ello, vaya a la cuenta de Azure Storage, seleccione Configuración >> y establezca "Permitir el acceso a la clave de la cuenta de almacenamiento" en "Deshabilitado".

Copia de seguridad de HSM en la nube de Azure

Iniciar la copia de seguridad del Cloud HSM desde el HSM de origen

Inicie una copia de seguridad del HSM de origen en la nube de Azure mediante el envío de una solicitud POST con el URI del contenedor de almacenamiento al endpoint de la API de copias de seguridad. Supervise el progreso de la copia de seguridad mediante el envío de una solicitud GET a la dirección URL en los encabezados de respuesta. El script recupera y muestra el estado del trabajo de copia de seguridad y el identificador de copia de seguridad único de la respuesta, lo que confirma que la copia de seguridad se ha iniciado y realiza el seguimiento de su progreso.

# 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

Salida esperada: $backupStatus devuelve "Correcto" y $backupID muestra el identificador de copia de seguridad correspondiente para la copia de seguridad que inició.

Restauración de HSM en la nube de Azure

Iniciar la restauración de HSM en la nube al HSM de destino

Inicie una operación de restauración para el HSM en la nube de Azure de destino proporcionando las propiedades de restauración necesarias, incluido el URI del contenedor de almacenamiento y el identificador de copia de seguridad. El script crea el URI correcto para el punto de conexión de la API de restauración y envía una solicitud POST para iniciar la restauración. Para supervisar el progreso de la restauración, envíe una solicitud GET a la ubicación especificada en los encabezados de respuesta y recupere el estado del trabajo de restauración para confirmar su finalización.

$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

Salida esperada: $jobStatus debe devolver "Succeeded".

Validar la restauración en HSM en la nube de destino

Después de un tiempo de procesamiento, la operación de restauración debe indicar "Correcto" y el HSM de la nube de destino debe mostrar un estado de activación de "Activo". Al conectarse al HSM en la nube de destino donde realizó la operación de restauración, la ejecución azcloudhsm_mgmt_util y la ejecución getClusterInfo deben mostrar los tres nodos como activos y disponibles.

Importante

Al conectarse a Azure Cloud HSM desde la máquina virtual de administración, actualice los archivos de configuración de cliente y administración (azcloudhsm_resource.cfg) para que apunten al HSM en la nube de destino correcto donde se realizó la restauración.

  1. Inicie el azcloudhsm_mgmt_util ejecutando:

    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. Dentro de la utilidad de administración, el símbolo del sistema se convierte en cloudmgmt. Para enumerar la información del clúster, ejecute:

    getClusterInfo  
    

    Salida esperada:getClusterInfo debe confirmar que los tres nodos ahora están disponibles para el clúster de Azure Cloud HSM.

  3. Salga de la utilidad de administración y, a continuación, inicie la utilidad HSM en la nube de Azure (azcloudhsm_util). Inicie sesión como CU y ejecute el findKey comando .

    Importante

    Los identificadores de clave pueden cambiar porque son dinámicos; sin embargo, los identificadores de clave no cambian.

    Linux

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

    Windows

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

Pasos siguientes