Encriptação dupla do Azure HDInsight para dados inativos

Este artigo discute métodos para criptografia de dados em repouso em clusters do Azure HDInsight. A criptografia de dados em repouso refere-se à criptografia em discos gerenciados (discos de dados, discos de sistema operacional e discos temporários) conectados a máquinas virtuais de cluster HDInsight.

Este documento não aborda os dados armazenados na sua conta de Armazenamento do Azure. Seus clusters podem ter uma ou mais contas de Armazenamento do Azure anexadas onde as chaves de criptografia também podem ser gerenciadas pela Microsoft ou pelo cliente, mas o serviço de criptografia é diferente. Para obter mais informações sobre a criptografia do Armazenamento do Azure, consulte Criptografia do Armazenamento do Azure para dados em repouso.

Introdução

Há três funções principais de disco gerenciado no Azure: o disco de dados, o disco do sistema operacional e o disco temporário. Para obter mais informações sobre diferentes tipos de discos gerenciados, consulte Introdução aos discos gerenciados do Azure.

O HDInsight suporta vários tipos de criptografia em duas camadas diferentes:

  • Criptografia do lado do servidor (SSE) - SSE é realizada pelo serviço de armazenamento. No HDInsight, o SSE é usado para criptografar discos do sistema operacional e discos de dados. Ele é ativado por padrão. SSE é um serviço de criptografia de camada 1.
  • Criptografia no host usando chave gerenciada pela plataforma - Semelhante ao SSE, esse tipo de criptografia é executado pelo serviço de armazenamento. No entanto, é apenas para discos temporários e não está habilitado por padrão. A criptografia no host também é um serviço de criptografia de camada 1.
  • Criptografia em repouso usando chave gerenciada pelo cliente - Este tipo de criptografia pode ser usado em dados e discos temporários. Ele não está habilitado por padrão e exige que o cliente forneça sua própria chave por meio do cofre de chaves do Azure. A criptografia em repouso é um serviço de criptografia de camada 2.

Esses tipos são resumidos na tabela a seguir.

Tipo de cluster Disco do SO (Managed disk) Disco de dados (disco gerenciado) Disco de dados temporário (SSD local)
Kafka, HBase com Accelerated escreve Layer1: Criptografia SSE por padrão Layer1: Criptografia SSE por padrão, Layer2: Criptografia opcional em repouso usando CMK Layer1: Criptografia opcional no host usando PMK, Layer2: Criptografia opcional em repouso usando CMK
Todos os outros clusters (Spark, Interactive, Hadoop, HBase sem gravações aceleradas) Layer1: Criptografia SSE por padrão N/A Layer1: Criptografia opcional no host usando PMK, Layer2: Criptografia opcional em repouso usando CMK

Criptografia em repouso usando chaves gerenciadas pelo cliente

A criptografia de chave gerenciada pelo cliente é um processo de uma etapa manipulado durante a criação do cluster sem custo adicional. Tudo o que você precisa fazer é autorizar uma identidade gerenciada com o Cofre de Chaves do Azure e adicionar a chave de criptografia ao criar seu cluster.

Os discos de dados e os discos temporários em cada nó do cluster são criptografados com uma DEK (Chave de Criptografia de Dados) simétrica. O DEK é protegido usando a chave de criptografia de chave (KEK) do seu cofre de chaves. Os processos de criptografia e descriptografia são tratados inteiramente pelo Azure HDInsight.

Para discos de sistema operacional conectados às VMs de cluster, apenas uma camada de criptografia (PMK) está disponível. É recomendável que os clientes evitem copiar dados confidenciais para discos do sistema operacional se tiver uma criptografia CMK necessária para seus cenários.

Se o firewall do cofre de chaves estiver habilitado no cofre de chaves onde a chave de criptografia de disco está armazenada, os endereços IP do Provedor de Recursos regional do HDInsight para a região onde o cluster será implantado deverão ser adicionados à configuração do firewall do cofre de chaves. Isso é necessário porque o HDInsight não é um serviço confiável de cofre de chaves do Azure.

Você pode usar o portal do Azure ou a CLI do Azure para girar com segurança as chaves no cofre de chaves. Quando uma chave gira, o cluster HDInsight começa a usar a nova chave em poucos minutos. Habilite os recursos de proteção de chave Soft Delete para proteger contra cenários de ransomware e exclusão acidental. Não há suporte para cofres de chaves sem esse recurso de proteção.

Introdução às chaves gerenciadas pelo cliente

Para criar um cluster HDInsight habilitado para chave gerenciada pelo cliente, passaremos pelas seguintes etapas:

  1. Criar identidades gerenciadas para recursos do Azure
  2. Criar Azure Key Vault
  3. Criar chave
  4. Criar política de acesso
  5. Criar cluster HDInsight com chave gerenciada pelo cliente habilitada
  6. Rotação da chave de encriptação

Cada etapa é explicada em detalhes em uma das seções a seguir.

Criar identidades gerenciadas para recursos do Azure

Crie uma identidade gerenciada atribuída pelo usuário para autenticar no Cofre da Chave.

Consulte Criar uma identidade gerenciada atribuída pelo usuário para obter etapas específicas. Para obter mais informações sobre como as identidades gerenciadas funcionam no Azure HDInsight, consulte Identidades gerenciadas no Azure HDInsight. Certifique-se de salvar o ID do recurso de identidade gerenciado para quando adicioná-lo à política de acesso ao Cofre da Chave.

Criar Azure Key Vault

Criar um cofre de chaves. Consulte Criar Cofre de Chaves do Azure para obter etapas específicas.

O HDInsight suporta apenas o Azure Key Vault. Se tiver o seu próprio cofre de chaves, pode importar as suas chaves para o Azure Key Vault. Lembre-se de que o cofre de chaves deve ter a exclusão suave ativada. Para obter mais informações sobre como importar chaves existentes, visite Sobre chaves, segredos e certificados.

Criar chave

  1. A partir do seu novo cofre de chaves>, navegue até Teclas de Configurações>+ Gerar/Importar.

    Generate a new key in Azure Key Vault.

  2. Forneça um nome e selecione Criar. Mantenha o tipo de chave padrão do RSA.

    generates key name.

  3. Quando regressar à página Chaves , selecione a chave que criou.

    key vault key list.

  4. Selecione a versão para abrir a página Versão da chave. Ao usar sua própria chave para criptografia de cluster HDInsight, você precisa fornecer o URI da chave. Copie o identificador de chave e salve-o em algum lugar até estar pronto para criar seu cluster.

    get key identifier.

Criar política de acesso

  1. No seu novo cofre de chaves, navegue até Configurações>Políticas de acesso>+ Adicionar política de acesso.

    Create new Azure Key Vault access policy.

  2. Na página Adicionar política de acesso, forneça as seguintes informações:

    Property Description
    Permissões de chave Selecione Obter, Desembrulhar Chave e Chave de Encapsulamento.
    Permissões de Segredos Selecione Obter, Definir e Excluir.
    Selecionar principal Selecione a identidade gerenciada atribuída pelo usuário que você criou anteriormente.

    Set Select Principal for Azure Key Vault access policy.

  3. Selecione Adicionar.

  4. Selecione Guardar.

    Save Azure Key Vault access policy.

Criar cluster com criptografia de disco de chave gerenciada pelo cliente

Agora você está pronto para criar um novo cluster HDInsight. As chaves gerenciadas pelo cliente só podem ser aplicadas a novos clusters durante a criação do cluster. A criptografia não pode ser removida dos clusters de chaves gerenciados pelo cliente e as chaves gerenciadas pelo cliente não podem ser adicionadas aos clusters existentes.

A partir da versão de novembro de 2020, o HDInsight oferece suporte à criação de clusters usando URIs de chave versionados e sem versão. Se você criar o cluster com um URI de chave sem versão, o cluster HDInsight tentará executar a rotação automática de chaves quando a chave for atualizada no Cofre de Chaves do Azure. Se você criar o cluster com um URI de chave versionada, terá que executar uma rotação manual de chaves, conforme discutido em Girando a chave de criptografia.

Para clusters criados antes da versão de novembro de 2020, você terá que executar a rotação de chaves manualmente usando o URI de chave versionada.

Tipos de VM que suportam criptografia de disco

Tamanho vCPU Memória: 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

Utilizar o portal do Azure

Durante a criação do cluster, você pode usar uma chave versionada ou uma chave sem versão da seguinte maneira:

  • Versionado - Durante a criação do cluster, forneça o identificador de chave completo, incluindo a versão da chave. Por exemplo, https://contoso-kv.vault.azure.net/keys/myClusterKey/46ab702136bc4b229f8b10e8c2997fa4.
  • Sem versão - Durante a criação do cluster, forneça apenas o identificador de chave. Por exemplo, https://contoso-kv.vault.azure.net/keys/myClusterKey.

Você também precisa atribuir a identidade gerenciada ao cluster.

Create new cluster.

Utilizar a CLI do Azure

O exemplo a seguir mostra como usar a CLI do Azure para criar um novo cluster Apache Spark com a criptografia de disco habilitada. Para obter mais informações, consulte Azure CLI az hdinsight create. O parâmetro encryption-key-version é opcional.

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

Utilizar modelos do Azure Resource Manager

O exemplo a seguir mostra como usar um modelo do Azure Resource Manager para criar um novo cluster Apache Spark com criptografia de disco habilitada. Para obter mais informações, consulte O que são modelos ARM?. A propriedade diskEncryptionKeyVersion do modelo do gerenciador de recursos é opcional.

Este exemplo usa o PowerShell para chamar o modelo.

$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

O conteúdo do modelo de gerenciamento de recursos, 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'))]": {}
        }
      }
    }
  ]
}

Rotação da chave de encriptação

Você pode alterar as chaves de criptografia usadas em seu cluster em execução, usando o portal do Azure ou a CLI do Azure. Para esta operação, o cluster deve ter acesso à chave atual e à nova chave pretendida, caso contrário, a operação de rotação de chave falhará. Para clusters criados após a versão de novembro de 2020, você pode escolher se deseja que sua nova chave tenha uma versão ou não. Para clusters criados antes da versão de novembro de 2020, você deve usar uma chave versionada ao girar a chave de criptografia.

Utilizar o portal do Azure

Para girar a chave, você precisa do URI do cofre da chave base. Depois de fazer isso, vá para a seção de propriedades do cluster HDInsight no portal e clique em Alterar chave em URL da chave de criptografia de disco. Digite o novo url da chave e envie para girar a chave.

rotate disk encryption key.

Utilizar a CLI do Azure

O exemplo a seguir mostra como girar a chave de criptografia de disco para um cluster HDInsight existente. Para obter mais informações, consulte 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

Perguntas frequentes sobre criptografia de chave gerenciada pelo cliente

Como o cluster HDInsight acessa meu cofre de chaves?

O HDInsight acessa sua instância do Azure Key Vault usando a identidade gerenciada que você associa ao cluster HDInsight. Essa identidade gerenciada pode ser criada antes ou durante a criação do cluster. Você também precisa conceder à identidade gerenciada acesso ao cofre de chaves onde a chave está armazenada.

Esse recurso está disponível para todos os clusters no HDInsight?

A criptografia de chave gerenciada pelo cliente está disponível para todos os tipos de cluster, exceto o Spark 2.1 e 2.2.

Posso usar várias chaves para criptografar discos ou pastas diferentes?

Não, todos os discos geridos e discos de recursos são encriptados pela mesma chave.

O que acontece se o cluster perder o acesso ao cofre de chaves ou à chave?

Se o cluster perder o acesso à chave, os avisos serão mostrados no portal Apache Ambari. Nesse estado, a operação Change Key falhará. Assim que o acesso à chave for restaurado, os avisos do Ambari desaparecerão e operações como a rotação de chaves poderão ser executadas com êxito.

key access Ambari alert.

Como posso recuperar o cluster se as chaves forem excluídas?

Como apenas as chaves habilitadas para "Exclusão Suave" são suportadas, se as chaves forem recuperadas no cofre de chaves, o cluster deverá recuperar o acesso às chaves. Para recuperar uma chave do Azure Key Vault, consulte Undo-AzKeyVaultKeyRemoval ou az-keyvault-key-recover.

Se um cluster for ampliado, os novos nós suportarão chaves gerenciadas pelo cliente perfeitamente?

Sim. O cluster precisa de acesso à chave no cofre de chaves durante o aumento de escala. A mesma chave é usada para criptografar discos gerenciados e discos de recursos no cluster.

As chaves gerenciadas pelo cliente estão disponíveis no meu local?

As chaves gerenciadas pelo cliente do HDInsight estão disponíveis em todas as nuvens públicas e nacionais.

Criptografia no host usando chaves gerenciadas pela plataforma

Habilitar no portal do Azure

A criptografia no host pode ser habilitada durante a criação do cluster no portal do Azure.

Nota

Quando a criptografia no host está habilitada, você não pode adicionar aplicativos ao cluster HDInsight do mercado do Azure.

Enable encryption at host.

Essa opção habilita a criptografia no host para discos de dados temporários de VMs HDInsight usando PMK. A criptografia no host só é suportada em determinadas SKUs de VM em regiões limitadas e o HDInsight suporta a seguinte configuração de nó e SKUs.

Para entender o tamanho certo da VM para seu cluster HDInsight, consulte Selecionando o tamanho certo da VM para seu cluster do Azure HDInsight. O SKU de VM padrão para o nó Zookeeper quando a criptografia no host estiver habilitada será DS2V2.

Ativar através do PowerShell

O trecho de código a seguir mostra como você pode criar um novo cluster do Azure HDInsight que tenha a criptografia no host habilitada usando o PowerShell. Ele usa o parâmetro -EncryptionAtHost $true para habilitar o recurso.

$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 `

Ativar através do CLI do Azure

O trecho de código a seguir mostra como você pode criar um novo cluster do Azure HDInsight que tenha a criptografia no host habilitada, usando a CLI do Azure. Ele usa o parâmetro --encryption-at-host true para habilitar o recurso.

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

Próximos passos