Dubbel kryptering för vilande data i Azure HDInsight

I den här artikeln beskrivs metoder för kryptering av vilande data i Azure HDInsight-kluster. Vilande datakryptering avser kryptering på hanterade diskar (datadiskar, OS-diskar och tillfälliga diskar) som är anslutna till virtuella HDInsight-klusterdatorer.

Det här dokumentet behandlar inte data som lagras i ditt Azure Storage-konto. Dina kluster kan ha ett eller flera anslutna Azure Storage-konton där krypteringsnycklarna också kan vara Microsoft-hanterade eller kundhanterade, men krypteringstjänsten är annorlunda. Mer information om Azure Storage-kryptering finns i Azure Storage-kryptering för vilande data.

Introduktion

Det finns tre huvudsakliga hanterade diskroller i Azure: datadisken, OS-disken och den tillfälliga disken. Mer information om olika typer av hanterade diskar finns i Introduktion till Hanterade Azure-diskar.

HDInsight stöder flera typer av kryptering i två olika lager:

  • Kryptering på serversidan (SSE) – SSE utförs av lagringstjänsten. I HDInsight används SSE för att kryptera OS-diskar och datadiskar. Den är aktiverad som standard. SSE är en layer 1-krypteringstjänst.
  • Kryptering på värden med hjälp av plattformshanterad nyckel – Ungefär som SSE utförs den här typen av kryptering av lagringstjänsten. Det är dock bara för tillfälliga diskar och är inte aktiverat som standard. Kryptering på värden är också en layer 1-krypteringstjänst.
  • Kryptering i vila med kundhanterad nyckel – Den här typen av kryptering kan användas på data och tillfälliga diskar. Den är inte aktiverad som standard och kräver att kunden anger sin egen nyckel via Azure-nyckelvalvet. Kryptering i vila är en layer 2-krypteringstjänst.

Dessa typer sammanfattas i följande tabell.

Klustertyp OS-disk (hanterad disk) Datadisk (hanterad disk) Temporär datadisk (lokal SSD)
Kafka, HBase med accelererade skrivningar Layer1: SSE-kryptering som standard Layer1: SSE Encryption som standard, Layer2: Valfri kryptering i vila med CMK Layer1: Valfri kryptering på värden med PMK, Layer2: Valfri kryptering i vila med CMK
Alla andra kluster (Spark, Interactive, Hadoop, HBase utan accelererade skrivningar) Layer1: SSE-kryptering som standard Ej tillämpligt Layer1: Valfri kryptering på värden med PMK, Layer2: Valfri kryptering i vila med CMK

Kryptering i vila med kundhanterade nycklar

Kundhanterad nyckelkryptering är en process i ett steg som hanteras när klustret skapas utan extra kostnad. Allt du behöver göra är att auktorisera en hanterad identitet med Azure Key Vault och lägga till krypteringsnyckeln när du skapar klustret.

Både datadiskar och tillfälliga diskar på varje nod i klustret krypteras med en symmetrisk datakrypteringsnyckel (DEK). DEK skyddas med nyckelkrypteringsnyckeln (KEK) från ditt nyckelvalv. Krypterings- och dekrypteringsprocesserna hanteras helt av Azure HDInsight.

För OS-diskar som är anslutna till de virtuella klusterdatorerna är endast ett krypteringslager (PMK) tillgängligt. Vi rekommenderar att kunderna undviker att kopiera känsliga data till OS-diskar om det krävs en CMK-kryptering för deras scenarier.

Om nyckelvalvsbrandväggen är aktiverad i nyckelvalvet där diskkrypteringsnyckeln lagras måste de regionala IP-adresserna för HDInsight-resursprovidern för den region där klustret ska distribueras läggas till i konfigurationen av nyckelvalvets brandvägg. Detta är nödvändigt eftersom HDInsight inte är en betrodd Azure Key Vault-tjänst.

Du kan använda Azure-portalen eller Azure CLI för att rotera nycklarna i nyckelvalvet på ett säkert sätt. När en nyckel roterar börjar HDInsight-klustret använda den nya nyckeln inom några minuter. Aktivera nyckelskyddsfunktionerna för mjuk borttagning för att skydda mot utpressningstrojanscenarier och oavsiktlig borttagning. Nyckelvalv utan den här skyddsfunktionen stöds inte.

Kom igång med kundhanterade nycklar

För att skapa ett kundhanterat nyckelaktiverat HDInsight-kluster går vi igenom följande steg:

  1. Skapa hanterade identiteter för Azure-resurser
  2. Skapa Azure Key Vault
  3. Skapa nyckel
  4. Skapa åtkomstprincip
  5. Skapa HDInsight-kluster med kundhanterad nyckel aktiverad
  6. Rotera krypteringsnyckeln

Varje steg beskrivs i något av följande avsnitt i detalj.

Skapa hanterade identiteter för Azure-resurser

Skapa en användartilldelad hanterad identitet för att autentisera till Key Vault.

Se Skapa en användartilldelad hanterad identitet för specifika steg. Mer information om hur hanterade identiteter fungerar i Azure HDInsight finns i Hanterade identiteter i Azure HDInsight. Se till att spara resurs-ID:t för hanterad identitet när du lägger till det i Key Vault-åtkomstprincipen.

Skapa Azure Key Vault

Skapa ett nyckelvalv. Se Skapa Azure Key Vault för specifika steg.

HDInsight stöder endast Azure Key Vault. Om du har ett eget nyckelvalv kan du importera dina nycklar till Azure Key Vault. Kom ihåg att nyckelvalvet måste ha Mjuk borttagning aktiverat. Mer information om hur du importerar befintliga nycklar finns i Om nycklar, hemligheter och certifikat.

Skapa nyckel

  1. Gå till Inställningar> Keys>+ Generate/Import från ditt nya nyckelvalv.

    Generate a new key in Azure Key Vault.

  2. Ange ett namn och välj sedan Skapa. Behåll standardnyckeltypenför RSA.

    generates key name.

  3. När du återgår till sidan Nycklar väljer du den nyckel som du skapade.

    key vault key list.

  4. Välj den version som ska öppnas på sidan Nyckelversion . När du använder din egen nyckel för HDInsight-klusterkryptering måste du ange nyckel-URI:n. Kopiera nyckelidentifieraren och spara den någonstans tills du är redo att skapa klustret.

    get key identifier.

Skapa åtkomstprincip

  1. Från ditt nya nyckelvalv går du till Inställningar> Åtkomstprinciper>+ Lägg till åtkomstprincip.

    Create new Azure Key Vault access policy.

  2. På sidan Lägg till åtkomstprincip anger du följande information:

    Property beskrivning
    Nyckelbehörigheter Välj Hämta, Packa upp nyckel och Radbryt nyckel.
    Hemliga behörigheter Välj Hämta, Ange och Ta bort.
    Välj huvudkonto Välj den användartilldelade hanterade identiteten som du skapade tidigare.

    Set Select Principal for Azure Key Vault access policy.

  3. Markera Lägg till.

  4. Välj Spara.

    Save Azure Key Vault access policy.

Skapa kluster med kundhanterad nyckeldiskkryptering

Nu är du redo att skapa ett nytt HDInsight-kluster. Kundhanterade nycklar kan bara tillämpas på nya kluster när klustret skapas. Kryptering kan inte tas bort från kundhanterade nyckelkluster och kundhanterade nycklar kan inte läggas till i befintliga kluster.

Från och med november 2020-versionen stöder HDInsight skapandet av kluster med både versionslösa och versionslösa nyckel-URI:er. Om du skapar klustret med en versionslös nyckel-URI försöker HDInsight-klustret utföra automatisk nyckelrotation när nyckeln uppdateras i Azure Key Vault. Om du skapar klustret med en versionsnyckel-URI måste du utföra en manuell nyckelrotation enligt beskrivningen i Rotera krypteringsnyckeln.

För kluster som skapats före november 2020-versionen måste du utföra nyckelrotation manuellt med hjälp av den versionshanterade nyckel-URI:n.

VM-typer som stöder diskkryptering

Storlek vCPU Minne: GiB
Standard_D4a_v4 4 16
Standard_D8a_v4 8 32
Standard_D16a_v4 16 64
Standard_D32a_v4 32 128
Standard_D48a_v4 48 192
Standard_D64a_v4 64 256
Standard_D96a_v4 96 384
Standard_E64is_v3 64 432
Standard_E20s_V3 20 160
Standard_E2s_V3 2 16
Standard_E2a_v4 2 16
Standard_E4a_v4 4 32
Standard_E8a_v4 8 64
Standard_E16a_v4 16 128
Standard_E20a_v4 20 160
Standard_E32a_v4 32 256
Standard_E48a_v4 48 384
Standard_E64a_v4 64 512
Standard_E96a_v4 96 672
Standard_DS3_v2 4 14
Standard_DS4_v2 8 28
Standard_DS5_v2 16 56
Standard_DS12_v2 4 28
Standard_DS13_v2 8 56
Standard_DS14_v2 16 112

Med hjälp av Azure-portalen

När klustret skapas kan du antingen använda en versionsnyckel eller en versionslös nyckel på följande sätt:

  • Version – När klustret skapas anger du den fullständiga nyckelidentifieraren, inklusive nyckelversionen. Exempel: https://contoso-kv.vault.azure.net/keys/myClusterKey/46ab702136bc4b229f8b10e8c2997fa4
  • Versionslös – Ange endast nyckelidentifieraren när klustret skapas. Exempel: https://contoso-kv.vault.azure.net/keys/myClusterKey

Du måste också tilldela den hanterade identiteten till klustret.

Create new cluster.

Använda Azure CLI

I följande exempel visas hur du använder Azure CLI för att skapa ett nytt Apache Spark-kluster med diskkryptering aktiverat. Mer information finns i Azure CLI az hdinsight create. Parametern encryption-key-version är valfri.

az hdinsight create -t spark -g MyResourceGroup -n MyCluster \
-p "HttpPassword1234!" --workernode-data-disks-per-node 2 \
--storage-account MyStorageAccount \
--encryption-key-name SparkClusterKey \
--encryption-key-version 00000000000000000000000000000000 \
--encryption-vault-uri https://MyKeyVault.vault.azure.net \
--assign-identity MyMSI

Använda Azure Resource Manager-mallar

I följande exempel visas hur du använder en Azure Resource Manager-mall för att skapa ett nytt Apache Spark-kluster med diskkryptering aktiverat. Mer information finns i Vad är ARM-mallar?. Egenskapen diskEncryptionKeyVersion resource manager-mall är valfri.

I det här exemplet används PowerShell för att anropa mallen.

$templateFile = "azuredeploy.json"
$ResourceGroupName = "MyResourceGroup"
$clusterName = "MyCluster"
$password = ConvertTo-SecureString 'HttpPassword1234!' -AsPlainText -Force
$diskEncryptionVaultUri = "https://MyKeyVault.vault.azure.net"
$diskEncryptionKeyName = "SparkClusterKey"
$diskEncryptionKeyVersion = "00000000000000000000000000000000"
$managedIdentityName = "MyMSI"

New-AzResourceGroupDeployment `
  -Name mySpark `
  -TemplateFile $templateFile `
  -ResourceGroupName $ResourceGroupName `
  -clusterName $clusterName `
  -clusterLoginPassword $password `
` -sshPassword $password `
  -diskEncryptionVaultUri $diskEncryptionVaultUri `
  -diskEncryptionKeyName $diskEncryptionKeyName `
  -diskEncryptionKeyVersion $diskEncryptionKeyVersion `
  -managedIdentityName $managedIdentityName

Innehållet i resurshanteringsmallen: azuredeploy.json

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "0.9.0.0",
  "parameters": {
    "clusterName": {
      "type": "string",
      "metadata": {
        "description": "The name of the HDInsight cluster to create."
      }
    },
    "clusterLoginUserName": {
      "type": "string",
      "defaultValue": "admin",
      "metadata": {
        "description": "These credentials can be used to submit jobs to the cluster and to log into cluster dashboards."
      }
    },
    "clusterLoginPassword": {
      "type": "securestring",
      "metadata": {
        "description": "The password must be at least 10 characters in length and must contain at least one digit, one non-alphanumeric character, and one upper or lower case letter."
      }
    },
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]",
      "metadata": {
        "description": "The location where all azure resources will be deployed."
      }
    },
    "sshUserName": {
      "type": "string",
      "defaultValue": "sshuser",
      "metadata": {
        "description": "These credentials can be used to remotely access the cluster."
      }
    },
    "sshPassword": {
      "type": "securestring",
      "metadata": {
        "description": "The password must be at least 10 characters in length and must contain at least one digit, one non-alphanumeric character, and one upper or lower case letter."
      }
    },
    "headNodeSize": {
      "type": "string",
      "defaultValue": "Standard_D12_v2",
      "metadata": {
        "description": "The VM size of the head nodes."
      }
    },
    "workerNodeSize": {
      "type": "string",
      "defaultValue": "Standard_D13_v2",
      "metadata": {
        "description": "The VM size of the worker nodes."
      }
    },
    "diskEncryptionVaultUri": {
      "type": "string",
      "metadata": {
        "description": "The Key Vault DNSname."
      }
    },
    "diskEncryptionKeyName": {
      "type": "string",
      "metadata": {
        "description": "The Key Vault key name."
      }
    },
    "diskEncryptionKeyVersion": {
      "type": "string",
      "metadata": {
        "description": "The Key Vault key version for the selected key."
      }
    },
    "managedIdentityName": {
      "type": "string",
      "metadata": {
        "description": "The user-assigned managed identity."
      }
    }
  },
  "variables": {
    "defaultStorageAccount": {
      "name": "[uniqueString(resourceGroup().id)]",
      "type": "Standard_LRS"
    }
  },
  "resources": [
    {
      "type": "Microsoft.Storage/storageAccounts",
      "name": "[variables('defaultStorageAccount').name]",
      "location": "[parameters('location')]",
      "apiVersion": "2019-06-01",
      "sku": {
        "name": "[variables('defaultStorageAccount').type]"
      },
      "kind": "Storage",
      "properties": {}
    },
    {
      "apiVersion": "2018-06-01-preview",
      "name": "[parameters('clusterName')]",
      "type": "Microsoft.HDInsight/clusters",
      "location": "[parameters('location')]",
      "properties": {
        "clusterVersion": "3.6",
        "osType": "Linux",
        "tier": "standard",
        "clusterDefinition": {
          "kind": "spark",
          "componentVersion": {
            "Spark": "2.3"
          },
          "configurations": {
            "gateway": {
              "restAuthCredential.isEnabled": true,
              "restAuthCredential.username": "[parameters('clusterLoginUserName')]",
              "restAuthCredential.password": "[parameters('clusterLoginPassword')]"
            }
          }
        },
        "storageProfile": {
          "storageaccounts": [
            {
              "name": "[replace(replace(reference(resourceId('Microsoft.Storage/storageAccounts', variables('defaultStorageAccount').name), '2019-06-01').primaryEndpoints.blob,'https://',''),'/','')]",
              "isDefault": true,
              "container": "[parameters('clusterName')]",
              "key": "[listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('defaultStorageAccount').name), '2019-06-01').keys[0].value]"
            }
          ]
        },
        "computeProfile": {
          "roles": [
            {
              "name": "headnode",
              "minInstanceCount": 1,
              "targetInstanceCount": 2,
              "hardwareProfile": {
                "vmSize": "[parameters('headNodeSize')]"
              },
              "osProfile": {
                "linuxOperatingSystemProfile": {
                  "username": "[parameters('sshUserName')]",
                  "password": "[parameters('sshPassword')]"
                },
              },
            },
            {
              "name": "workernode",
              "targetInstanceCount": 1,
              "hardwareProfile": {
                "vmSize": "[parameters('workerNodeSize')]"
              },
              "osProfile": {
                "linuxOperatingSystemProfile": {
                  "username": "[parameters('sshUserName')]",
                  "password": "[parameters('sshPassword')]"
                },
              },
            }
          ]
        },
        "minSupportedTlsVersion": "1.2",
        "diskEncryptionProperties": {
          "vaultUri": "[parameters('diskEncryptionVaultUri')]",
          "keyName": "[parameters('diskEncryptionKeyName')]",
          "keyVersion": "[parameters('diskEncryptionKeyVersion')]",
          "msiResourceId": "[resourceID('Microsoft.ManagedIdentity/userAssignedIdentities/', parameters('managedIdentityName'))]"
        }
      },
      "identity": {
        "type": "UserAssigned",
        "userAssignedIdentities": {
          "[resourceID('Microsoft.ManagedIdentity/userAssignedIdentities/', parameters('managedIdentityName'))]": {}
        }
      }
    }
  ]
}

Rotera krypteringsnyckeln

Du kan ändra de krypteringsnycklar som används i ditt kluster som körs med hjälp av Azure-portalen eller Azure CLI. För den här åtgärden måste klustret ha åtkomst till både den aktuella nyckeln och den avsedda nya nyckeln, annars misslyckas rotationsnyckelåtgärden. För kluster som skapats efter november 2020-versionen kan du välja om du vill att den nya nyckeln ska ha en version eller inte. För kluster som skapades före november 2020-versionen måste du använda en versionsnyckel när du roterar krypteringsnyckeln.

Med hjälp av Azure-portalen

Om du vill rotera nyckeln behöver du URI:n för basnyckelvalvet. När du har gjort det går du till avsnittet egenskaper för HDInsight-kluster i portalen och klickar på Ändra nyckel under URL för diskkrypteringsnyckel. Ange i den nya nyckel-URL:en och skicka för att rotera nyckeln.

rotate disk encryption key.

Använda Azure CLI

I följande exempel visas hur du roterar diskkrypteringsnyckeln för ett befintligt HDInsight-kluster. Mer information finns i Azure CLI az hdinsight rotate-disk-encryption-key.

az hdinsight rotate-disk-encryption-key \
--encryption-key-name SparkClusterKey \
--encryption-key-version 00000000000000000000000000000000 \
--encryption-vault-uri https://MyKeyVault.vault.azure.net \
--name MyCluster \
--resource-group MyResourceGroup

Vanliga frågor och svar om kundhanterad nyckelkryptering

Hur kommer HDInsight-klustret åt mitt nyckelvalv?

HDInsight kommer åt din Azure Key Vault-instans med hjälp av den hanterade identitet som du associerar med HDInsight-klustret. Den här hanterade identiteten kan skapas före eller under skapandet av klustret. Du måste också ge den hanterade identiteten åtkomst till nyckelvalvet där nyckeln lagras.

Är den här funktionen tillgänglig för alla kluster i HDInsight?

Kundhanterad nyckelkryptering är tillgänglig för alla klustertyper utom Spark 2.1 och 2.2.

Kan jag använda flera nycklar för att kryptera olika diskar eller mappar?

Nej, alla hanterade diskar och resursdiskar krypteras med samma nyckel.

Vad händer om klustret förlorar åtkomsten till nyckelvalvet eller nyckeln?

Om klustret förlorar åtkomsten till nyckeln visas varningar i Apache Ambari-portalen. I det här tillståndet misslyckas åtgärden Ändra nyckel . När nyckelåtkomsten har återställts försvinner Ambari-varningar och åtgärder som nyckelrotation kan utföras.

key access Ambari alert.

Hur återställer jag klustret om nycklarna tas bort?

Eftersom endast "Mjuk borttagning"-aktiverade nycklar stöds bör klustret återfå åtkomsten till nycklarna om nycklarna återställs i nyckelvalvet. Information om hur du återställer en Azure Key Vault-nyckel finns i Undo-AzKeyVaultKeyRemoval eller az-keyvault-key-recover.

Kommer de nya noderna att stödja kundhanterade nycklar sömlöst om ett kluster skalas upp?

Ja. Klustret behöver åtkomst till nyckeln i nyckelvalvet under uppskalningen. Samma nyckel används för att kryptera både hanterade diskar och resursdiskar i klustret.

Är kundhanterade nycklar tillgängliga på min plats?

Kundhanterade HDInsight-nycklar är tillgängliga i alla offentliga moln och nationella moln.

Kryptering på värden med plattformshanterade nycklar

Aktivera i Azure-portalen

Kryptering på värden kan aktiveras när klustret skapas i Azure-portalen.

Kommentar

När kryptering på värden är aktiverat kan du inte lägga till program i HDInsight-klustret från Azure Marketplace.

Enable encryption at host.

Det här alternativet aktiverar kryptering på värden för virtuella HDInsight-datorer med hjälp av PMK. Kryptering på värden stöds endast på vissa VM-SKU:er i begränsade regioner och HDInsight stöder följande nodkonfiguration och SKU:er.

Information om rätt VM-storlek för ditt HDInsight-kluster finns i Välja rätt VM-storlek för ditt Azure HDInsight-kluster. Standard-VM SKU:n för Zookeeper-noden när kryptering på värden är aktiverad är DS2V2.

Aktivera med PowerShell

Följande kodfragment visar hur du kan skapa ett nytt Azure HDInsight-kluster som har kryptering på värden aktiverat med hjälp av PowerShell. Den använder parametern -EncryptionAtHost $true för att aktivera funktionen.

$storageAccountResourceGroupName = "Group"
$storageAccountName = "yourstorageacct001"
$storageAccountKey = Get-AzStorageAccountKey `
    -ResourceGroupName $storageAccountResourceGroupName `
    -Name $storageAccountName | %{ $_.Key1 }
$storageContainer = "container002"
# Cluster configuration info
$location = "East US 2"
$clusterResourceGroupName = "Group"
$clusterName = "your-hadoop-002"
$clusterCreds = Get-Credential
# If the cluster's resource group doesn't exist yet, run:
# New-AzResourceGroup -Name $clusterResourceGroupName -Location $location
# Create the cluster
New-AzHDInsightCluster `
    -ClusterType Hadoop `
    -ClusterSizeInNodes 4 `
    -ResourceGroupName $clusterResourceGroupName `
    -ClusterName $clusterName `
    -HttpCredential $clusterCreds `
    -Location $location `
    -DefaultStorageAccountName "$storageAccountName.blob.core.contoso.net" `
    -DefaultStorageAccountKey $storageAccountKey `
    -DefaultStorageContainer $storageContainer `
    -SshCredential $clusterCreds `
    -EncryptionAtHost $true `

Aktivera med Azure CLI

Följande kodfragment visar hur du kan skapa ett nytt Azure HDInsight-kluster som har kryptering på värden aktiverat med hjälp av Azure CLI. Den använder parametern --encryption-at-host true för att aktivera funktionen.

az hdinsight create -t spark -g MyResourceGroup -n MyCluster \\
-p "yourpass" \\
--storage-account MyStorageAccount --encryption-at-host true

Nästa steg