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

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

Предпосылки

Управляемые идентичности

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

Приложению можно предоставить два типа удостоверений:

  • Приложению назначается системно назначаемое управляемое удостоверение, которое удаляется при удалении приложения. Приложение может иметь только одно системно назначаемое управляемое удостоверение.
  • Управляемое удостоверение, назначаемое пользователем, — это автономный ресурс Azure, который можно назначить приложению. Приложение может иметь несколько управляемых удостоверений, назначаемых пользователями.

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

Создание хранилища ключей с защитой от удаления

  1. Войдите на портал Azure.
  2. В меню портала Azure или на домашней странице выберите "Создать ресурс".
  3. В поле поиска введите Key Vault.
  4. В списке результатов выберите Key Vault.
  5. В разделе Key Vault нажмите кнопку "Создать".
  6. В разделе "Создание хранилища ключей" укажите следующие сведения:
    • Подписка. Выберите нужную подписку.
    • Группа ресурсов: выберите "Создать" и введите имя, например demo-cmek-rg.
    • Имя: необходимо уникальное имя, например demo-keyvault-cmek.
    • Регион: выберите расположение, например восточная часть США.
    • Ценовая категория: выберите "Стандартный " из раскрывающегося списка.
    • Защита от очистки: выберите Включить защиту от очистки.
  7. Нажмите кнопку "Далее " и перейдите на вкладку "Политика доступа ".
    • Конфигурация доступа. Выберите управление доступом на основе ролей Azure.
    • Примите значения по умолчанию для всех остальных параметров.
  8. Выберите Review + create.
  9. Подтвердите правильность параметров и нажмите кнопку "Создать".

После успешного развертывания выберите "Перейти к ресурсу". На вкладке "Обзор" запишите следующие свойства:

  • Имя хранилища: в примере имя хранилища — demo-keyvault-cmek. Это имя используется для других шагов.
  • Универсальный код ресурса (URI) хранилища. В примере используется https://demo-keyvault-cmek.vault.azure.net/универсальный код ресурса (URI) хранилища.

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

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

  1. В поле поиска введите управляемые удостоверения.
  2. В разделе "Службы" выберите Managed Identities.
  3. Нажмите кнопку "Создать" и введите следующие значения на вкладке "Основные сведения".
    • Подписка. Выберите нужную подписку.
    • Группа ресурсов: выберите демонстрационную группу ресурсов cmek-rg , созданную на предыдущих шагах.
    • Регион: выберите регион, например восточная часть США.
    • Имя: Введите имя для вашего управляемого удостоверения, назначенного пользователем, например demokeyvaultmi.
  4. Выберите Review + create.
  5. После отображения прохождения проверки нажмите кнопку "Создать".

После успешного развертывания выберите "Перейти к ресурсу".

Создание назначений ролей

Вам необходимо создать два назначения ролей для хранилища ключей. Дополнительные сведения см. в статье "Назначение ролей Azure" с помощью портала Azure.

Предоставьте разрешение на ключ в хранилище ключей управляемому удостоверению

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

  1. Перейдите в хранилище ключей demo-cmek-keyvault.
  2. Выберите Управление доступом (IAM).
  3. Выберите Добавить>Добавить назначение ролей.
  4. Назначьте следующую роль:
    • Роль: пользователь шифрования криптослужбы Key Vault
    • Назначить доступ для: управляемой идентификации
    • Участник: demokeyvaultmi
  5. Выберите "Рецензирование" и "Назначить" , чтобы просмотреть параметры.
  6. Выберите "Проверить и назначить" , чтобы создать назначение роли.

Создание назначения ролей для учетной записи

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

  1. Назначьте следующую роль:
    • Роль: сотрудник по шифрованию Key Vault
    • Предоставление доступа: пользователь, группа или сервисный принципал
    • Участник: ваша учетная запись Microsoft Entra
  2. Выберите "Рецензирование" и "Назначить" , чтобы просмотреть параметры.
  3. Выберите "Проверить и назначить" , чтобы создать назначение роли.

Вы можете проверить назначения ролей для хранилища ключей в разделе Управление доступом (IAM)>Назначения ролей.

Создание ключа

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

  1. Перейдите в хранилище ключей , demo-cmek-keyvault.
  2. Выберите ключи.
  3. Выберите Создать/импортировать.
  4. На странице "Создание ключа" выберите следующие значения:
    • Параметры: генерация
    • Имя: demo-cmek-key
  5. Примите значения по умолчанию для других параметров.
  6. Нажмите кнопку "Создать".

Запишите имя ключа. Он используется при развертывании управляемого приложения.

Создайте пользовательское управляемое удостоверение для управляемого приложения

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

  1. В поле поиска введите Управляемые удостоверения.
  2. В разделе "Службы" выберите Managed Identities.
  3. Нажмите кнопку "Создать".
    • Подписка. Выберите нужную подписку.
    • Группа ресурсов: выберите демонстрационную группу ресурсов cmek-rg.
    • Регион: выберите регион, например восточная часть США.
    • Имя: Введите имя для управляемой идентификации, назначенной пользователем, например demomanagedappmi.
  4. Выберите Review + create.
  5. После отображения прохождения проверки нажмите кнопку "Создать".

После успешного развертывания выберите "Перейти к ресурсу".

Назначение разрешения роли управляемому удостоверению

Назначьте роль Managed Identity Operator управляемому удостоверению в контексте пользовательского управляемого удостоверения с именем demokeyvaultmi.

  1. Перейдите к назначаемому пользователем управляемому удостоверению с именем demokeyvaultmi.
  2. Выберите элемент управления доступом (IAM).
  3. Выберите Добавить>Добавить назначение ролей, чтобы открыть страницу "Добавление назначения ролей".
  4. Назначьте следующую роль.
    • Роль: оператор управляемого удостоверения
    • Предоставление доступа: управляемая идентификация
    • Участник: demomanagedappmi
  5. Выберите "Рецензирование" и "Назначить" , чтобы просмотреть параметры.
  6. Выберите "Проверить и назначить" , чтобы создать назначение роли.

Вы можете проверить назначение роли для demokeyvaultmi в назначениях ролей>.

Пример шаблона управляемого приложения

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

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

  1. Создайте файлcreatUIDefinition.json из примера в этой статье. Шаблон определяет элементы пользовательского интерфейса портала при развертывании управляемого приложения.
  2. Создайте шаблон Azure Resource Manager с именем mainTemplate.json, преобразовав Bicep-файл в этой статье в JSON. Шаблон определяет ресурсы для развертывания с помощью управляемого приложения.
  3. Создайте пакет .zip , содержащий необходимые файлы JSON: createUiDefinition.json и mainTemplate.json.
  4. Опубликуйте определение управляемого приложения, чтобы оно было доступно в каталоге служб. Дополнительные сведения см. в кратком руководстве по созданию и публикации определения управляемого приложения Azure.

Создание шаблона createUiDefinition.json

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

  1. Создайте новый файл в Visual Studio Code с именемcreatUIDefinition.json.
  2. Скопируйте и вставьте следующий код в файл.
  3. Сохраните файл.
{
  "$schema": "https://schema.management.azure.com/schemas/0.1.2-preview/CreateUIDefinition.MultiVm.json#",
  "handler": "Microsoft.Azure.CreateUIDef",
  "version": "0.1.2-preview",
  "parameters": {
    "basics": [],
    "steps": [
      {
        "name": "managedApplicationSetting",
        "label": "Application Settings",
        "subLabel": {
          "preValidation": "Configure your application settings and Managed Identity for the application",
          "postValidation": "Done"
        },
        "bladeTitle": "Application Settings - Config",
        "elements": [
          {
            "name": "appIdentity",
            "type": "Microsoft.ManagedIdentity.IdentitySelector",
            "label": "Managed Identity Configuration for the Application (Needs Managed Identity Operator permissions over KV Managed Identity).",
            "toolTip": {
              "systemAssignedIdentity": "Enable system assigned identity to grant the managed application access to additional existing resources.",
              "userAssignedIdentity": "Add user assigned identities to grant the managed application access to additional existing resources."
            },
            "defaultValue": {
              "systemAssignedIdentity": "Off"
            },
            "options": {
              "hideSystemAssignedIdentity": true,
              "hideUserAssignedIdentity": false,
              "readOnlySystemAssignedIdentity": true
            },
            "visible": true
          }
        ]
      },
      {
        "name": "configuration",
        "type": "Microsoft.Common.Section",
        "label": "Configuration",
        "elements": [
          {
            "name": "cmek",
            "type": "Microsoft.Common.Section",
            "label": "Customer Managed Encryption Key (CMEK)",
            "elements": [
              {
                "name": "cmekEnable",
                "type": "Microsoft.Common.CheckBox",
                "label": "Enable CMEK",
                "toolTip": "Enable to provide a CMEK",
                "constraints": {
                  "required": false
                }
              },
              {
                "name": "cmekKeyVaultUrl",
                "type": "Microsoft.Common.TextBox",
                "label": "Key Vault URL",
                "toolTip": "Specify the CMEK Key Vault URL",
                "defaultValue": "",
                "constraints": {
                  "required": "[steps('configuration').cmek.cmekEnable]",
                  "regex": ".*",
                  "validationMessage": "The value must not be empty."
                },
                "visible": "[steps('configuration').cmek.cmekEnable]"
              },
              {
                "name": "cmekKeyName",
                "type": "Microsoft.Common.TextBox",
                "label": "Key Name",
                "toolTip": "Specify the key name from your key vault.",
                "defaultValue": "",
                "constraints": {
                  "required": "[steps('configuration').cmek.cmekEnable]",
                  "regex": ".*",
                  "validationMessage": "The value must not be empty."
                },
                "visible": "[steps('configuration').cmek.cmekEnable]"
              },
              {
                "name": "cmekKeyIdentity",
                "type": "Microsoft.ManagedIdentity.IdentitySelector",
                "label": "Managed Identity Configuration for Key Vault Access",
                "toolTip": {
                  "systemAssignedIdentity": "Enable system assigned identity to grant the managed application access to additional existing resources.",
                  "userAssignedIdentity": "Add user assigned identities to grant the managed application access to additional existing resources."
                },
                "defaultValue": {
                  "systemAssignedIdentity": "Off"
                },
                "options": {
                  "hideSystemAssignedIdentity": true,
                  "hideUserAssignedIdentity": false,
                  "readOnlySystemAssignedIdentity": true
                },
                "visible": "[steps('configuration').cmek.cmekEnable]"
              }
            ],
            "visible": true
          }
        ]
      }
    ],
    "outputs": {
      "location": "[location()]",
      "managedIdentity": "[steps('managedApplicationSetting').appIdentity]",
      "cmekConfig": {
        "kvUrl": "[if(empty(steps('configuration').cmek.cmekKeyVaultUrl), '', steps('configuration').cmek.cmekKeyVaultUrl)]",
        "keyName": "[if(empty(steps('configuration').cmek.cmekKeyName), '', steps('configuration').cmek.cmekKeyName)]",
        "identityId": "[if(empty(steps('configuration').cmek.cmekKeyIdentity), '', steps('configuration').cmek.cmekKeyIdentity)]"
      }
    }
  }
}

Создание шаблона mainTemplate.json

Следующий файл Bicep — это исходный код для mainTemplate.json. Шаблон использует назначаемое пользователем управляемое удостоверение, определенное в файле createUiDefinition.json.

  1. Создайте файл в Visual Studio Code с именем mainTemplate.bicep.
  2. Скопируйте и вставьте следующий код в файл.
  3. Сохраните файл.
param cmekConfig object = {
  kvUrl: ''
  keyName: ''
  identityId: {}
}
@description('Specify the Azure region to place the application definition.')
param location string = resourceGroup().location
/////////////////////////////////
// Common Resources Configuration
/////////////////////////////////
var commonproperties = {
  name: 'cmekdemo'
  displayName: 'Common Resources'
  storage: {
    sku: 'Standard_LRS'
    kind: 'StorageV2'
    accessTier: 'Hot'
    minimumTlsVersion: 'TLS1_2'

  }
}
var identity = items(cmekConfig.identityId.userAssignedIdentities)[0].key

resource storage 'Microsoft.Storage/storageAccounts@2022-05-01' = {
  name: '${commonproperties.name}${uniqueString(resourceGroup().id)}'
  location: location
  sku: {
    name: commonproperties.storage.sku
  }
  kind: commonproperties.storage.kind
  identity: cmekConfig.identityId
  properties: {
    accessTier: commonproperties.storage.accessTier
    minimumTlsVersion: commonproperties.storage.minimumTlsVersion
    encryption: {
      identity: {
        userAssignedIdentity: identity
      }
      services: {
        blob: {
          enabled: true
        }
        table: {
          enabled: true
        }
        file: {
          enabled: true
        }
      }
      keySource: 'Microsoft.Keyvault'
      keyvaultproperties: {
        keyname: '${cmekConfig.keyName}'
        keyvaulturi: '${cmekConfig.kvUrl}'
      }
    }
  }
}

Используйте PowerShell или Azure CLI для создания файлаmainTemplate.json . Перейдите в каталог, в котором вы сохранили файл Bicep и выполните build команду.

bicep build mainTemplate.bicep

После преобразования Bicep-файла в JSON mainTemplate.json файл должен соответствовать следующему примеру. У вас могут быть разные значения в свойствах metadata для version и templateHash.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "metadata": {
    "_generator": {
      "name": "bicep",
      "version": "0.16.2.56959",
      "templateHash": "1234567891234567890"
    }
  },
  "parameters": {
    "cmekConfig": {
      "type": "object",
      "defaultValue": {
        "kvUrl": "",
        "keyName": "",
        "identityId": {}
      }
    },
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]",
      "metadata": {
        "description": "Specify the Azure region to place the application definition."
      }
    }
  },
  "variables": {
    "commonproperties": {
      "name": "cmekdemo",
      "displayName": "Common Resources",
      "storage": {
        "sku": "Standard_LRS",
        "kind": "StorageV2",
        "accessTier": "Hot",
        "minimumTlsVersion": "TLS1_2"
      }
    },
    "identity": "[items(parameters('cmekConfig').identityId.userAssignedIdentities)[0].key]"
  },
  "resources": [
    {
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2022-05-01",
      "name": "[format('{0}{1}', variables('commonproperties').name, uniqueString(resourceGroup().id))]",
      "location": "[parameters('location')]",
      "sku": {
        "name": "[variables('commonproperties').storage.sku]"
      },
      "kind": "[variables('commonproperties').storage.kind]",
      "identity": "[parameters('cmekConfig').identityId]",
      "properties": {
        "accessTier": "[variables('commonproperties').storage.accessTier]",
        "minimumTlsVersion": "[variables('commonproperties').storage.minimumTlsVersion]",
        "encryption": {
          "identity": {
            "userAssignedIdentity": "[variables('identity')]"
          },
          "services": {
            "blob": {
              "enabled": true
            },
            "table": {
              "enabled": true
            },
            "file": {
              "enabled": true
            }
          },
          "keySource": "Microsoft.Keyvault",
          "keyvaultproperties": {
            "keyname": "[format('{0}', parameters('cmekConfig').keyName)]",
            "keyvaulturi": "[format('{0}', parameters('cmekConfig').kvUrl)]"
          }
        }
      }
    }
  ]
}

Развертывание управляемого приложения

После создания определения каталога служб можно развернуть управляемое приложение. Дополнительные сведения см. в кратком руководстве по развертыванию управляемого приложения каталога служб.

Во время развертывания вы используете управляемые удостоверения, назначаемые пользователем, имя хранилища ключей, URL-адрес хранилища ключей, имя ключа хранилища ключей. Файл createUiDefinition.json создает интерфейс использования.

Например, при развертывании портала на вкладке «Параметры приложения» добавьте demomanagedappmi.

Снимок экрана: вкладка

На вкладке "Конфигурация" включите ключ, управляемый клиентом, и добавьте управляемое удостоверение, назначаемое пользователем для хранилища ключей, demokeyvaultmi. Вы также указываете URL-адрес хранилища ключей и имя ключа хранилища ключей, созданное вами.

Снимок экрана: конфигурация для включения управляемого клиентом ключа, добавления URL-адреса хранилища ключей и имени ключа и добавления управляемого удостоверения, назначаемого пользователем.

Проверка развертывания

После завершения развертывания можно проверить назначение удостоверения управляемого приложения. Назначаемое пользователем управляемое удостоверение demomanagedappmi назначается управляемому приложению.

  1. Перейдите в группу ресурсов, в которой развернуто управляемое приложение.
  2. В разделе Параметры>Идентификация выберите Назначенный пользователем (предварительная версия).

Вы также можете проверить учетную запись хранения, развернутую управляемым приложением. На вкладке "Шифрование " отображается ключ demo-cmek-key и идентификатор ресурса для управляемого удостоверения, назначаемого пользователем.

  1. Перейдите в группу управляемых ресурсов, в которой развернута учетная запись хранения управляемого приложения.
  2. В разделе "Безопасность и сеть" выберите "Шифрование".

Дальнейшие шаги