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

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

Необходимые компоненты

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

Настройка ключа, управляемого клиентом, для учетной записи хранения, развернутой управляемым приложением в качестве ресурса в управляемой группе ресурсов, требует управляемого удостоверения, назначаемого пользователем. Это управляемое удостоверение, назначаемое пользователем, можно использовать для предоставления управляемому приложению доступа к другим существующим ресурсам. Чтобы узнать, как настроить управляемое приложение с помощью управляемого удостоверения, назначаемого пользователем, перейдите в управляемое приложение 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. В разделе "Службы" выберите управляемые удостоверения.
  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)>Role.

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

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

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

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

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

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

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

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

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

Назначьте роль оператора управляемого удостоверения управляемому удостоверению в область управляемого удостоверения, назначаемого пользователем с именем demokeyvaultmi.

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

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

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

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

Ниже представлен порядок публикации управляемого приложения в каталоге услуг.

  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 свойствах и templateHashversion .

{
  "$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 создает интерфейс использования.

Например, в развертывании портала на вкладке "Приложение Параметры" добавьте демоменаджdappmi.

Screenshot of the Application Settings tab to add a user-assigned managed identity.

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

Screenshot of the Configuration to enable the customer-managed key, add key vault URL and key name, and add a user-assigned managed identity.

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

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

  1. Перейдите в группу ресурсов, в которой развернуто управляемое приложение.
  2. В разделе Параметры> Identity выберите user assigned (preview).

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

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

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