Двойное шифрование Azure HDInsight для неактивных данных

В этой статье обсуждаются методы шифрования неактивных данных в кластерах Azure HDInsight. Шифрование неактивных данных означает шифрование на управляемых дисках (дисках данных, дисках ОС и временных дисках), подключенных к виртуальным машинам кластера HDInsight.

В этом документе не рассматриваются данные, хранящиеся в вашей учетной записи службы хранилища Azure. Кластеры могут иметь одну или несколько подключенных учетных записей службы хранилища Azure, в которых ключи шифрования также могут управляться корпорацией Майкрософт или клиентом, но служба шифрования отличается. Дополнительные сведения о шифровании в службе хранилища Azure см. в статье Шифрование службы хранилища Azure для неактивных данных.

Введение

В Azure есть три основные роли управляемых дисков: диск данных, диск операционной системы и временный диск. Дополнительные сведения о различных типах управляемых дисков см. в статье Введение в управляемые диски Azure.

HDInsight поддерживает несколько типов шифрования на двух разных уровнях:

  • Шифрование на стороне сервера (SSE), которое выполняет служба хранилища. В HDInsight SSE используется для шифрования дисков ОС и дисков данных. Он включен по умолчанию. SSE — это служба шифрования уровня 1.
  • Шифрование на узле с помощью ключа, управляемого платформой — аналогично SSE, этот тип шифрования выполняется службой хранилища. Однако он предназначен только для временных дисков и не включен по умолчанию. Шифрование на узле также является службой шифрования уровня 1.
  • Шифрование неактивных данных с помощью управляемого клиентом ключа. Этот тип шифрования можно использовать на временных дисках. Он не включен по умолчанию и требует, чтобы клиент предоставил собственный ключ посредством хранилища ключей Azure. Шифрование неактивных данных является службой шифрования уровня 2.

Эти типы вкратце описаны в таблице ниже.

Тип кластера Диск ОС (управляемый диск) Диск данных (управляемый диск) Диск временных данных (локальный SSD)
Kafka, HBase с ускоренной записью Уровень 1. Шифрование SSE по умолчанию Уровень 1. Шифрование SSE по умолчанию. Уровень 2. Дополнительное шифрование неактивных данных с помощью CMK Уровень 1. Дополнительное шифрование на узле с помощью PMK. Уровень 2. Дополнительное шифрование неактивных данных помощью CMK
Все остальные кластеры (Spark, Interactive, Hadoop, HBase без ускоренной записи) Уровень 1. Шифрование SSE по умолчанию Н/П Уровень 1. Дополнительное шифрование на узле с помощью PMK. Уровень 2. Дополнительное шифрование неактивных данных помощью CMK

Шифрование неактивных данных с помощью управляемых клиентом ключей

Шифрование с помощью управляемых клиентом ключей — это процедура из одного этапа, выполняемая во время создания кластера без дополнительных затрат. Вам нужно всего лишь авторизовать управляемое удостоверение в Azure Key Vault и добавить ключ шифрования при создании кластера.

Как диски данных, так и временные диски на каждом узле кластера шифруются с помощью симметричного ключа шифрования данных (DEK). Ключ DEK защищен с помощью ключа шифрования ключей (KEK) из вашего хранилища ключей. Процессы шифрования и расшифровки полностью обрабатываются Azure HDInsight.

Для дисков ОС, подключенных к виртуальным машинам кластера, доступен только один уровень шифрования (PMK). Пользователям рекомендуется избегать копирования конфиденциальных данных на диски ОС, если для их сценариев требуется шифрование CMK.

Если брандмауэр хранилища ключей включен в хранилище ключей, где хранится ключ шифрования диска, IP-адреса регионального поставщика ресурсов HDInsight для региона, в котором будет развернут кластер, необходимо добавить в конфигурацию брандмауэра хранилища ключей. Это необходимо, поскольку HDInsight не является доверенной службой хранилища ключей Azure.

Для безопасной смены ключей в хранилище ключей можно использовать портал Azure или Azure CLI. При смене ключа кластер HDInsight начинает использовать новый ключ в течение нескольких минут. Включите функцию защиты ключей Обратимое удаление для защиты от программ-шантажистов или случайного удаления. Хранилища ключей без этой функции защиты не поддерживаются.

Начало работы с ключами, управляемыми клиентом

Чтобы создать кластер HDInsight с ключом, управляемым клиентом, выполните следующие действия.

  1. Создание управляемых удостоверений для ресурсов Azure
  2. Создание хранилища Azure Key Vault
  3. Создать ключ
  4. Создание политики доступа
  5. Создание кластера HDInsight с включенным ключом, управляемым клиентом
  6. Ротация ключа шифрования

Каждый шаг подробно описан в одном из следующих разделов.

Создание управляемых удостоверений для ресурсов Azure

Создайте управляемое удостоверение, назначенное пользователем, для проверки подлинности в Key Vault.

Конкретные шаги см. в статье Создание управляемого удостоверения, назначаемого пользователем. Дополнительные сведения о работе управляемых удостоверений в Azure HDInsight см. в статье Управляемые удостоверения в Azure HDInsight. Не забудьте сохранить идентификатор ресурса управляемого удостоверения для его добавления в политику доступа Key Vault.

Создание хранилища Azure Key Vault

Создайте хранилище ключей. Конкретные шаги см. в разделе Создание Azure Key Vault.

HDInsight поддерживает только Azure Key Vault. Если у вас есть собственное хранилище ключей, вы можете импортировать ключи в Azure Key Vault. Помните, что для хранилища ключей должно быть включено обратимое удаление. Дополнительные сведения об импорте существующих ключей см. в статье Сведения о ключах, секретах и сертификатах.

Создать ключ

  1. В новом хранилище ключей перейдите к разделу Параметры>Ключи>+ Создать/импортировать.

    Generate a new key in Azure Key Vault.

  2. Укажите имя, а затем нажмите Создать. Оставьте Тип ключаRSA по умолчанию.

    generates key name.

  3. Когда вы вернетесь на страницу Ключи, выберите созданный ключ.

    key vault key list.

  4. Выберите версию, чтобы открыть страницу Версия ключа. При использовании собственного ключа для шифрования кластера HDInsight необходимо предоставить URI ключа. Скопируйте идентификатор ключа и сохраните его, пока не будете готовы к созданию кластера.

    get key identifier.

Создание политики доступа

  1. В новом хранилище ключей перейдите к разделу Параметры>Политики доступа>+ Добавить политику доступа.

    Create new Azure Key Vault access policy.

  2. На странице Добавление политики доступа укажите следующие сведения:

    Свойство Description
    Разрешения ключей Выберите Получение, Распаковка ключа и Упаковка ключа.
    Разрешения секретов Выберите Получение, Установкаи Удаление.
    Выбор субъекта Выберите назначаемое пользователем управляемое удостоверение, созданное ранее.

    Set Select Principal for Azure Key Vault access policy.

  3. Выберите Добавить.

  4. Выберите Сохранить.

    Save Azure Key Vault access policy.

Создание кластера с ключом шифрования диска, управляемым клиентом

Теперь можно создать кластер HDInsight. Ключи, управляемые клиентом, могут применяться только к новым кластерам во время создания кластера. Шифрование нельзя удалить из кластеров с ключами, управляемыми клиентами, и такие ключи нельзя добавить в существующие кластеры.

Начиная с выпуска от ноября 2020 г., HDInsight поддерживает создание кластеров с помощью универсальных кодов ресурсов (URI) ключей с контролем версий и без него. При создании кластера с помощью URI ключа без контроля версий кластер HDInsight попытается выполнить автоматическую ротацию ключа при обновлении ключа в Azure Key Vault. При создании кластера с помощью URI ключа с контролем версией необходимо выполнить ручную ротацию ключа, как описано в разделе Ротация ключа шифрования.

Для кластеров, созданных до выпуска от ноября 2020 г., необходимо вручную выполнить ротацию ключа с помощью URI ключа с контролем версий.

Типы виртуальных машин, поддерживающие шифрование дисков

Размер Виртуальные ЦП Память, ГиБ
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

Использование портала Azure

Во время создания кластера можно либо использовать ключ с контролем версий, либо ключ без контроля версий, следующим образом:

  • С контролем версий — во время создания кластера укажите полный Идентификатор ключа, включая версию ключа. Например, https://contoso-kv.vault.azure.net/keys/myClusterKey/46ab702136bc4b229f8b10e8c2997fa4.
  • Без контроля версий — во время создания кластера укажите только Идентификатор ключа. Например, https://contoso-kv.vault.azure.net/keys/myClusterKey.

Кроме того, необходимо назначить кластеру управляемое удостоверение.

Create new cluster.

Использование Azure CLI

В следующем примере показано, как использовать Azure CLI для создания нового кластера Apache Spark с включенным шифрованием дисков. Подробные сведения см. в разделе Azure CLI: az hdinsight create. Параметр encryption-key-version является необязательным.

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

Использование шаблонов Azure Resource Manager

В следующем примере показано, как использовать шаблон Azure Resource Manager для создания нового кластера Apache Spark с включенным шифрованием дисков. Дополнительные сведения см. в разделе Что такое шаблоны ARM?. Свойство diskEncryptionKeyVersion шаблона диспетчера ресурсов является необязательным.

В этом примере для вызова шаблона используется PowerShell.

$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

Содержимое шаблона управления ресурсами, 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'))]": {}
        }
      }
    }
  ]
}

Ротация ключа шифрования

Ключи шифрования, используемые в работающем кластере, можно изменить с помощью портала Azure или Azure CLI. Для выполнения этой операции кластер должен иметь доступ как к текущему ключу, так и к новому ключу, в противном случае операция ротации ключа завершится ошибкой. Для кластеров, созданных после выпуска за ноябрь 2020 г., можно выбрать, требуется ли новый ключ иметь версию или нет. Для кластеров, созданных до выпуска от ноября 2020, при ротации ключа шифрования необходимо использовать ключ с версией.

Использование портала Azure

Для ротации ключа требуется универсальный код ресурса (URI) основного хранилища ключей. После этого перейдите в раздел свойств кластера HDInsight на портале и нажмите кнопку Изменить ключ в разделе URL-адрес ключа шифрования диска. Введите новый URL-адрес ключа и отправьте его, чтобы выполнить ротацию ключа.

rotate disk encryption key.

Использование Azure CLI

В следующем примере показано, как выполнить ротацию ключа шифрования диска для существующего кластера HDInsight. Дополнительные сведения см. в разделе 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

Вопросы и ответы по шифрованию на базе управляемых клиентом ключей

Как кластер HDInsight получает доступ к хранилищу ключей?

HDInsight обращается к вашему экземпляру Azure Key Vault, используя управляемое удостоверение, которое вы связываете с кластером HDInsight. Это управляемое удостоверение можно создать до или во время создания кластера. Вам также потребуется предоставить управляемому удостоверению доступ к хранилищу ключей, где хранится ключ.

Эта функция доступна для всех кластеров в HDInsight?

Шифрование с ключом, управляемым клиентом, доступно для всех типов кластеров, кроме Spark 2.1 и 2.2.

Можно ли использовать несколько ключей для шифрования разных дисков или папок?

Нет, все управляемые диски и диски ресурсов в кластере шифруются с помощью одного ключа.

Что произойдет, если кластер потеряет доступ к хранилищу ключей или ключу?

Если кластер потеряет доступ к ключу, на портале Apache Ambari появятся предупреждения. В этом состоянии операция Изменить ключ завершится ошибкой. После восстановления доступа к ключам предупреждения Ambari исчезнут, а такие операции, как ротация ключа, можно будет успешно выполнить.

key access Ambari alert.

Как восстановить кластер, если ключи удалены?

Поскольку поддерживаются только ключи с включенной функцией "Обратимое удаление", после восстановления ключей в хранилище ключей кластер снова сможет получить к ним доступ. Чтобы восстановить ключ Azure Key Vault, см. раздел Undo-AzKeyVaultKeyRemoval или az-keyvault-key-recover.

При масштабировании кластера будут ли новые узлы беспрепятственно поддерживать ключи, управляемые клиентом?

Да. Кластеру требуется доступ к ключу в хранилище ключей во время масштабирования. Тот же ключ используется для шифрования управляемых дисков и дисков ресурсов в кластере.

Доступны ли ключи, управляемые клиентом, в моем расположении?

Ключи HDInsight, управляемые клиентом, доступны во всех общедоступных облаках и национальных облаках.

Шифрование на узле с использованием ключей, управляемых платформой

Включение на портале Azure

Шифрование на узле можно включить во время создания кластера на портале Azure.

Примечание.

Если шифрование на узле включено, вы не сможете добавлять приложения в кластер HDInsight из Azure Marketplace.

Enable encryption at host.

Этот параметр включает шифрование на узле с помощью PMK для временных дисков с данными виртуальных машин HDInsight. Шифрование на узле поддерживается только для определенных SKU виртуальных машин в некоторых регионах, и HDInsight поддерживает следующие конфигурации узлов и SKU.

Сведения о правильном размере виртуальной машины для кластера HDInsight см. в статье Выбор правильного размера виртуальной машины для кластера Azure HDInsight. Номер SKU виртуальной машины по умолчанию для узла Zookeeper при включенном шифровании на узле — DS2V2.

Включение с помощью PowerShell

В следующем фрагменте кода показано, как можно создать новый кластер Azure HDInsight с шифрованием на узле с помощью PowerShell. Для включения этой функции используется параметр -EncryptionAtHost $true.

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

Включение мониторинга с помощью Azure CLI

В следующем фрагменте кода показано, как можно создать новый кластер Azure HDInsight с шифрованием на узле с помощью Azure CLI. Для включения этой функции используется параметр --encryption-at-host true.

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

Следующие шаги