Шифрование данных в Базе данных Azure для MySQL с помощью Azure CLI

ОБЛАСТЬ ПРИМЕНЕНИЯ: База данных Azure для MySQL — отдельный сервер

Важно!

База данных Azure для MySQL один сервер находится на пути выхода на пенсию. Настоятельно рекомендуется выполнить обновление до База данных Azure для MySQL гибкого сервера. Дополнительные сведения о миграции на гибкий сервер База данных Azure для MySQL см. в статье "Что происходит с одним сервером База данных Azure для MySQL?"

Узнайте, как использовать Azure CLI, чтобы настроить шифрование данных в Базе данных Azure для MySQL и управлять им.

Необходимые условия для Azure CLI

  • Подписка Azure и права администратора для нее.

  • Создайте хранилище ключей и ключ, который будет использоваться для ключа, управляемого клиентом. Также включите в хранилище ключей защиту от очистки и обратимое удаление.

    az keyvault create -g <resource_group> -n <vault_name> --enable-soft-delete true --enable-purge-protection true
    
  • В созданном хранилище Azure Key Vault создайте ключ, который будет использоваться для шифрования данных Базы данных Azure для MySQL.

    az keyvault key create --name <key_name> -p software --vault-name <vault_name>
    
  • Чтобы использовать существующее хранилище ключей, оно должно иметь следующие свойства для использования в качестве ключа, управляемого клиентом:

    • обратимое удаление;

      az resource update --id $(az keyvault show --name \ <key_vault_name> -o tsv | awk '{print $1}') --set \ properties.enableSoftDelete=true
      
    • Защита от очистки

      az keyvault update --name <key_vault_name> --resource-group <resource_group_name>  --enable-purge-protection true
      
    • Заданный период удержания — 90 дней

      az keyvault update --name <key_vault_name> --resource-group <resource_group_name>  --retention-days 90
    
  • Чтобы использовать ключ в качестве управляемого клиентом, он должен иметь следующие атрибуты:

    • без даты окончания срока действия;
    • не отключено;
    • Выполните операции get, wrap и unwrap
    • Для атрибута "recoverylevel" задано значение Восстанавливаемый (для этого требуется включить обратимое удаление с периодом удержания 90 дней)
    • Защита от очистки включена

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

az keyvault key show --vault-name <key_vault_name> -n <key_name>
  • У Базы данных Azure для MySQL отдельный сервер должен быть общего назначения или ценовой категории с оптимизацией для операций в памяти, а хранилище — категории общего назначения версии 2. Прежде чем продолжить, ознакомьтесь с ограничениями шифрования данных с помощью ключей, управляемых клиентом.

Задайте правильные разрешения для операций с ключами.

  1. Существует два способа получения управляемого удостоверения для Базы данных Azure для MySQL.

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

    az mysql server create --name -g <resource_group> --location <locations> --storage-size size>  -u <user>-p <pwd> --backup-retention <7> --sku-name <sku name> -geo-redundant-backup <Enabled/Disabled>  --assign-identity
    

    Обновление существующей Базы данных Azure для сервера MySQL, чтобы получить управляемое удостоверение.

    az mysql server update --name  <server name>  -g <resource_group> --assign-identity
    
  2. Задайте Разрешения ключей (Get, Wrap, Unwrap) для параметра Субъект — это имя сервера MySQL.

    az keyvault set-policy --name -g <resource_group> --key-permissions get unwrapKey wrapKey --object-id <principal id of the server>
    

Настройка шифрования данных в Базе данных Azure для MySQL

  1. Включите шифрование данных для Базы данных Azure для MySQL с помощью ключа, созданного в Azure Key Vault.

    az mysql server key create –name  <server name>  -g <resource_group> --kid <key url>
    

    URL-адрес ключа: https://YourVaultName.vault.azure.net/keys/YourKeyName/01234567890123456789012345678901>

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

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

Создание восстановленного сервера или сервера-реплики

Повторная проверка шифрования данных на восстановленном сервере

  • Присвоение удостоверения для сервера-реплики
az mysql server update --name  <server name>  -g <resoure_group> --assign-identity
  • Получение существующего ключа, который должен использоваться для восстановленного сервера или сервера-реплики
az mysql server key list --name  '<server_name>'  -g '<resource_group_name>'
  • Задание политики для нового удостоверения для восстановленного сервера или сервера-реплики
az keyvault set-policy --name <keyvault> -g <resoure_group> --key-permissions get unwrapKey wrapKey --object-id <principl id of the server returned by the step 1>
  • Повторная проверка восстановленного сервера или сервера-реплики с помощью ключа шифрования
az mysql server key create –name  <server name> -g <resource_group> --kid <key url>

Дополнительные возможности для ключа, используемого для Базы данных Azure для MySQL

Получение используемого ключа

az mysql server key show --name  <server name>  -g <resource_group> --kid <key url>

URL-адрес ключа: https://YourVaultName.vault.azure.net/keys/YourKeyName/01234567890123456789012345678901>

Получение списка используемых ключей

az mysql server key list --name  <server name>  -g <resource_group>

Удаление используемого ключа

az mysql server key delete -g <resource_group> --kid <key url>

Использование шаблона Azure Resource Manager для включения шифрования данных

Наряду с порталом Azure шифрование данных можно также включить на сервере Базы данных Azure для MySQL с помощью шаблонов Azure Resource Manager для новых и существующих серверов.

Для нового сервера

Используйте один из предварительно созданных шаблонов Azure Resource Manager для подготовки сервера с включенным шифрованием данных: пример с шифрованием данных.

Этот шаблон Azure Resource Manager создает сервер Базы данных Azure для MySQL и использует переданные параметры KeyVault и Key в качестве параметров для включения шифрования данных на сервере.

Для существующего сервера

Вы также можете использовать шаблоны Azure Resource Manager, чтобы включить шифрование данных на существующих серверах Базы данных Azure для MySQL.

  • Передайте скопированный ранее идентификатор ресурса ключа Azure Key Vault в свойство Uri в объекте "properties".

  • Используйте 2020-01-01-preview в качестве версии API.

{
  "$schema": "http://schema.management.azure.com/schemas/2014-04-01-preview/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "location": {
      "type": "string"
    },
    "serverName": {
      "type": "string"
    },
    "keyVaultName": {
      "type": "string",
      "metadata": {
        "description": "Key vault name where the key to use is stored"
      }
    },
    "keyVaultResourceGroupName": {
      "type": "string",
      "metadata": {
        "description": "Key vault resource group name where it is stored"
      }
    },
    "keyName": {
      "type": "string",
      "metadata": {
        "description": "Key name in the key vault to use as encryption protector"
      }
    },
    "keyVersion": {
      "type": "string",
      "metadata": {
        "description": "Version of the key in the key vault to use as encryption protector"
      }
    }
  },
  "variables": {
    "serverKeyName": "[concat(parameters('keyVaultName'), '_', parameters('keyName'), '_', parameters('keyVersion'))]"
  },
  "resources": [
    {
      "type": "Microsoft.DBforMySQL/servers",
      "apiVersion": "2017-12-01",
      "kind": "",
      "location": "[parameters('location')]",
      "identity": {
        "type": "SystemAssigned"
      },
      "name": "[parameters('serverName')]",
      "properties": {
      }
    },
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2019-05-01",
      "name": "addAccessPolicy",
      "resourceGroup": "[parameters('keyVaultResourceGroupName')]",
      "dependsOn": [
        "[resourceId('Microsoft.DBforMySQL/servers', parameters('serverName'))]"
      ],
      "properties": {
        "mode": "Incremental",
        "template": {
          "$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
          "contentVersion": "1.0.0.0",
          "resources": [
            {
              "type": "Microsoft.KeyVault/vaults/accessPolicies",
              "name": "[concat(parameters('keyVaultName'), '/add')]",
              "apiVersion": "2018-02-14-preview",
              "properties": {
                "accessPolicies": [
                  {
                    "tenantId": "[subscription().tenantId]",
                    "objectId": "[reference(resourceId('Microsoft.DBforMySQL/servers/', parameters('serverName')), '2017-12-01', 'Full').identity.principalId]",
                    "permissions": {
                      "keys": [
                        "get",
                        "wrapKey",
                        "unwrapKey"
                      ]
                    }
                  }
                ]
              }
            }
          ]
        }
      }
    },
    {
      "name": "[concat(parameters('serverName'), '/', variables('serverKeyName'))]",
      "type": "Microsoft.DBforMySQL/servers/keys",
      "apiVersion": "2020-01-01-preview",
      "dependsOn": [
        "addAccessPolicy",
        "[resourceId('Microsoft.DBforMySQL/servers', parameters('serverName'))]"
      ],
      "properties": {
        "serverKeyType": "AzureKeyVault",
        "uri": "[concat(reference(resourceId(parameters('keyVaultResourceGroupName'), 'Microsoft.KeyVault/vaults/', parameters('keyVaultName')), '2018-02-14-preview', 'Full').properties.vaultUri, 'keys/', parameters('keyName'), '/', parameters('keyVersion'))]"
      }
    }
  ]
}

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