Criptografia dupla do Azure HDInsight para dados inativos

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

Este documento não aborda dados armazenados em sua conta de Armazenamento do Azure. Seus clusters podem ter uma ou mais contas do Armazenamento do Azure anexadas em que 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, confira Criptografia do serviço de Armazenamento do Azure para dados inativos.

Introdução

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

O HDInsight oferece suporte a vários tipos de criptografia em duas camadas diferentes:

  • SSE (Criptografia do Serviço de Armazenamento) – Executada pelo serviço de armazenamento. No HDInsight, a SSE é usada para criptografar discos do sistema operacional e discos de dados. Ele é habilitador por padrão. A SSE é um serviço de criptografia de camada 1.
  • Criptografia no host usando chave gerenciada por plataforma – Semelhante à SSE, esse tipo de criptografia é executado pelo serviço de armazenamento. No entanto, esse serviço é apenas para discos temporários e não é 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 – Esse tipo de criptografia pode ser usado em discos de dados e temporários. Ele não é habilitado por padrão e exige que o cliente forneça sua própria chave por meio do Azure Key Vault. A criptografia em repouso é um serviço de criptografia de camada 2.

Esses tipos estão resumidos na tabela a seguir.

Tipo de cluster Disco do sistema operacional (disco gerenciado) Disco de dados (disco gerenciado) Disco de dados temporários (SSD local)
Kafka, HBase com gravações aceleradas Layer1: criptografia SSE por padrão Layer1: criptografia SSE por padrão, Layer2: criptografia opcional em repouso usando o CMK Layer1: criptografia opcional no host usando PMK, Layer2: criptografia opcional em repouso usando o CMK
Todos os outros clusters (Spark, interativo, Hadoop, HBase sem gravações aceleradas) Layer1: criptografia SSE por padrão N/D Layer1: criptografia opcional no host usando PMK, Layer2: criptografia opcional em repouso usando o CMK

Criptografia em repouso usando chaves gerenciadas pelo cliente

A criptografia com chave gerenciada pelo cliente é um processo de uma etapa realizado durante a criação do cluster sem nenhum custo adicional. Tudo o que você precisa fazer é autorizar uma identidade gerenciada com o Azure Key Vault e adicionar a chave de criptografia ao criar o 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). A DEK é protegida usando a KEK (Chave de Criptografia de Chave) do seu cofre de chaves. Os processos de criptografia e descriptografia são realizados inteiramente pelo Azure HDInsight.

Para discos do sistema operacional anexados às VMs do 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 em que a chave de criptografia de disco estiver armazenada, os endereços IP do provedor de recursos regionais do HDInsight para a região em que o cluster será implantado deverão ser adicionados à configuração dele. Isso é necessário porque o HDInsight não é um serviço confiável do Azure Key Vault.

Você pode usar o portal do Azure ou a CLI do Azure para gorar as chaves com segurança no cofre de chaves. Quando uma chave é girada, o cluster do HDInsight começa a usar a nova chave em questão de minutos. Habilite os recursos de proteção de chave de Exclusão reversível 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.

Começar a usar chaves gerenciadas pelo cliente

Para criar um cluster do HDInsight habilitado para chave gerenciada pelo cliente, percorreremos as seguintes etapas:

  1. Criar identidades gerenciadas para os recursos do Azure
  2. Criar Azure Key Vault
  3. Chave Create
  4. Criar política de acesso
  5. Criar cluster do HDInsight com a chave gerenciada pelo cliente habilitada
  6. Girando a chave de criptografia

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

Criar identidades gerenciadas para os recursos do Azure

Crie uma identidade gerenciada atribuída pelo usuário para se autenticar no Key Vault.

Consulte Criar uma identidade gerenciada atribuída pelo usuário para 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 a ID do recurso de identidade gerenciada para quando você a adicionar à política de acesso do Key Vault.

Criar Azure Key Vault

Criar um cofre de chaves. Consulte Criar Azure Key Vault para obter etapas específicas.

O HDInsight é compatível apenas com o Azure Key Vault. Se você tiver seu próprio cofre de chaves, poderá importar suas chaves para o Azure Key Vault. Lembre-se de que o cofre de chaves deve ter a Exclusão temporária habilitada. Para obter mais informações sobre como importar as chaves existentes, visite Sobre chaves, segredos e certificados.

Chave Create

  1. Em seu novo cofre de chaves, navegue até configurações>Chaves>+ Gerar/Importar.

    Generate a new key in Azure Key Vault.

  2. Forneça um nome e, em seguida, selecione Criar. Mantenha o Tipo de chave padrão do RSA.

    generates key name.

  3. Ao retornar para a página Chaves, selecione a que você 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 a criptografia do cluster do HDInsight, é necessário fornecer o URI dela. Copie o Identificador de chave e salve-o em algum local até que esteja pronto para criar o cluster.

    get key identifier.

Criar política de acesso

  1. Em 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:

    Propriedade Descrição
    Permissões de chave Selecione Obter, Desencapsular chave e Encapsular chave.
    Permissões de segredo Selecione Obter, Definire Excluir.
    Selecionar entidade de segurança Selecione a identidade gerenciada atribuída pelo usuário criada anteriormente.

    Set Select Principal for Azure Key Vault access policy.

  3. Selecione Adicionar.

  4. Clique em Salvar.

    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 do HDInsight. Chaves gerenciadas pelo cliente podem ser aplicadas apenas a novos clusters durante a criação de clusters. A criptografia não pode ser removida dos clusters de chaves gerenciadas pelo cliente e esse tipo de chave não pode ser adicionada aos clusters existentes.

A partir da versão de novembro de 2020, o HDInsight oferece suporte à criação de clusters usando URIs de chave com ou sem versão. Se você criar o cluster com um URI de chave em versão sem suporte, o cluster do HDInsight tentará executar a rotação automática quando a chave for atualizada no seu Azure Key Vault. Se você criar o cluster com um URI de chave com controle de versão, será necessário girar a chave de forma manual, conforme discutido em Girando a chave de criptografia.

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

Tipos de VM que dão suporte à 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

Usando o portal do Azure

Durante a criação de clusters, você pode usar uma chave com ou sem versão da seguinte maneira:

  • Com controle de versão – 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 somente o Identificador da chave. Por exemplo, https://contoso-kv.vault.azure.net/keys/myClusterKey.

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

Create new cluster.

Usando a CLI do Azure

O exemplo a seguir mostra como usar CLI do Azure para criar um novo cluster do Apache Spark com a criptografia de disco habilitada. Para obter mais informações, confira CLI do Azure: 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

Usar modelos do Azure Resource Manager

O exemplo a seguir mostra como usar um modelo do Azure Resource Manager para criar um novo cluster do Apache Spark com a criptografia de disco habilitada. Para obter mais informações, confira O que são os modelos do ARM?. A propriedade de modelo do Resource Manager diskEncryptionKeyVersion é 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

Os conteúdos do modelo do Resource Manager, 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'))]": {}
        }
      }
    }
  ]
}

Girando a chave de criptografia

Você pode alterar as chaves de criptografia usadas no cluster em execução por meio do portal do Azure ou do CLI do Azure. Para essa 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á. Nos clusters criados após a versão de novembro de 2020, você pode escolher se quer 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 com controle de versão ao girar a chave de criptografia.

Usando o portal do Azure

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

rotate disk encryption key.

Usando a CLI do Azure

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

Como o cluster do 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 do HDInsight. Essa identidade gerenciada pode ser criada antes ou durante a criação do cluster. Você também precisa conceder o acesso de identidade gerenciada ao cofre de chaves em que 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 Spark 2.1 e 2.2.

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

Não, todos os discos gerenciados e discos de recursos são criptografados 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 exibidos no portal do Apache Ambari. Nesse estado, a operação de Alteração da chave falhará. Depois que o acesso à chave for restaurado, os avisos do Ambari desaparecerão e as operações, como a rotação de chaves, poderão ser executadas com êxito.

key access Ambari alert.

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

Já que somente as chaves habilitadas com "Exclusão Temporária" são compatíveis, se as chaves forem recuperadas no cofre de chaves, o cluster deverá obter o acesso às chaves novamente. Para recuperar uma chave de Azure Key Vault, consulte Undo-AzKeyVaultKeyRemoval ou az-keyvault-key-recover.

Se um cluster for escalado verticalmente, os novos nós oferecerão suporte a chaves gerenciadas pelo cliente diretamente?

Sim. O cluster precisa acessar a chave no cofre de chaves durante ao escalar verticalmente. As mesmas chaves são usadas para criptografar tanto os discos gerenciados quanto os 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 nuvens 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.

Observação

Quando a criptografia no host estiver habilitada, você não poderá adicionar aplicativos ao cluster do HDInsight a partir do Azure Marketplace.

Enable encryption at host.

Essa opção habilita a criptografia no host para discos de dados temporários de VMs do HDInsight usando o PMK. A criptografia no host só tem suporte em determinados SKUs de VM em regiões limitadas e o HDInsight oferece suporte à seguinte configuração de nó e SKUs.

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

Habilitar uso do PowerShell

O snippet de código a seguir mostra como você pode criar um novo cluster do Azure HDInsight que tem 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 `

Habilitar usando a CLI do Azure

O snippet de código a seguir mostra como você pode criar um novo cluster do Azure HDInsight que tem criptografia no host habilitada usando 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óximas etapas