次の方法で共有


チュートリアル: バックアップと復元

Microsoft Azure Cloud HSM を使用すると、すべてのキー、バージョン、属性、タグ、ロールの割り当てを保持して、Cloud HSM のバックアップと復元を行うことができます。

重要

Azure Cloud HSM バックアップを作成すると、HSM 内で派生したキーによって保護されます。 Microsoft には、バックアップを保護する派生キーの可視性やアクセス権がありません。 Azure Cloud HSM では、ソース HSM または既にアクティブ化されているクラウド HSM へのバックアップの復元はサポートされていません。 復元するには、任意の優先リージョンで別の非アクティブ化された Cloud HSM を使用します。 それ以外の場合、復元操作は失敗し、移行先の Cloud HSM が機能しません。

前提条件

次の前提条件では、Azure Cloud HSM のバックアップと復元の操作がサポートされています。

  • Azure Cloud HSM のソースと宛先用に構成されたマネージド サービス ID。
  • RBAC を使用した Azure Blob Storage (Storage BLOB データ共同作成者)。
  • Azure Cloud HSM 変換先リソースは NotActivated 状態である必要があります。

次の構成は、Azure Cloud HSM でのバックアップと復元ではサポートされていません。

  • ストレージ コンテナー SAS トークンはサポートされていません。

MSI を Cloud HSM に適用し、HSM バックアップ用のストレージ アカウントを作成する

マネージド サービス ID の作成

既存の Azure Cloud HSM リソース グループに、新しいユーザー割り当てマネージド サービス ID を作成します。 このガイド付き例では、azure Cloud HSM オンボード ガイドの例で参照されているリソース グループ名である CHSM-MSI と CHSM-SERVER-RG を使用します。

# 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

ソースと宛先の Cloud HSM に MSI を適用する

Azure Cloud HSM のバックアップと復元の操作では、マネージド サービス ID (MSI) を移行元と移行先の両方の Cloud HSM リソースに適用する必要があります。 各 Cloud HSM クラスターに含めることができる MSI は 1 つだけです。 ソースと宛先の両方に同じ MSI を使用することも、それぞれに異なる MSI を使用することもできます。 このガイド付き例では、移行元と移行先の両方の Cloud HSM リソースに同じ MSI を適用します。

# 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

Cloud HSM バックアップ用のプライベート VNET にストレージ アカウントを作成する

プライベート仮想ネットワーク内でストレージ アカウントと関連する BLOB コンテナーを定義して構成することで、Azure Cloud HSM バックアップ操作のストレージ インフラストラクチャを設定します。 まず、サブスクリプション ID を定義し、ストレージ アカウントのパラメーター (場所、SKU、種類など) を指定します。 このプロセスには、新しいリソース グループの作成、指定された仮想ネットワークへのアクセスを制限するためのネットワーク 規則を使用したストレージ アカウントの確立、プライベート エンドポイントによるセキュリティの強化が含まれます。 セキュリティで保護されたアクセス用にプライベート エンドポイントが設定され、バックアップ タスクに対する適切なアクセス許可を確保するために、"ストレージ BLOB データ共同作成者" ロールが指定された ID に割り当てられます。 この例では、CHSM-BACKUP-RG という名前の新しいリソース グループ、chsmbackup00 というストレージ アカウント、および chsmbackupcontainer00 という名前の BLOB コンテナーを作成し、ソースと宛先の両方に対して読み取り/書き込みアクセスを許可します。

重要

必要な最小限の RBAC ロールは、 ストレージ BLOB データ共同作成者です。 パブリック ストレージ アカウントにはパブリック インターネット経由でアクセスできるため、セキュリティを強化するために、ストレージ アカウントをプライベート VNET の背後に配置します。

# 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

ポータル設定を使用して共有キーアクセスを無効にする

セキュリティを強化するには、共有キーのアクセスを無効にします。 これを行うには、Azure ストレージ アカウントに移動し、[設定] >> [構成] を選択し、[ストレージ アカウント キーのアクセスを許可する] を [無効] に設定します。

Azure Cloud HSM のバックアップ

ソース HSM から Cloud HSM バックアップを開始する

ストレージ コンテナー URI を含む POST 要求をバックアップ API エンドポイントに送信して、ソースの Azure Cloud HSM のバックアップを開始します。 応答ヘッダーの URL に GET 要求を送信して、バックアップの進行状況を監視します。 このスクリプトは、バックアップ ジョブの状態と一意のバックアップ ID を応答から取得して表示し、バックアップが開始されたことを確認し、その進行状況を追跡します。

# 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

予期される出力: $backupStatus は "Succeeded" を返し、 $backupID には開始したバックアップの対応するバックアップ ID が表示されます。

Azure Cloud HSM の復元

移行先 HSM への Cloud HSM の復元を開始する

ストレージ コンテナーの URI やバックアップ ID など、必要な復元プロパティを指定して、移行先の Azure Cloud HSM の復元操作を開始します。 このスクリプトは、復元 API エンドポイントの正しい URI を作成し、復元を開始するための POST 要求を送信します。 復元の進行状況を監視するには、応答ヘッダーで指定された場所に GET 要求を送信し、復元ジョブの状態を取得して完了を確認します。

$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

予期される出力: $jobStatusは "Succeeded" を返す必要があります。

移行先の Cloud HSM への復元を検証する

処理時間が経過すると、復元操作は "成功" と表示され、Destination Cloud HSM にはアクティブ化の状態が "アクティブ" と表示されます。復元操作を実行した Destination Cloud HSM に接続すると、 azcloudhsm_mgmt_util を実行し、 getClusterInfo を実行すると、3 つのノードすべてがアクティブで使用可能と表示されます。

重要

管理 VM から Azure Cloud HSM に接続する場合は、クライアント構成ファイルと管理構成ファイル (azcloudhsm_resource.cfg) の両方を更新して、復元が実行された適切な宛先 Cloud HSM を指し示します。

  1. 次のコマンドを実行して、 azcloudhsm_mgmt_util を開始します。

    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. 管理ユーティリティ内では、プロンプトが cloudmgmtになります。 クラスター情報を一覧表示するには、次のコマンドを実行します。

    getClusterInfo  
    

    予期される出力:getClusterInfo は、3 つのノードすべてが Azure Cloud HSM クラスターで使用できるようになったことを確認する必要があります。

  3. 管理ユーティリティを終了し、Azure Cloud HSM ユーティリティ (azcloudhsm_util) を起動します。 CU としてサインインし、 findKey コマンドを実行します。

    重要

    キー ハンドルは動的であるため、変更される可能性があります。ただし、キー ID は変更されません。

    Linux

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

    Windows

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

次のステップ