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

Примечание.

Поддержка управляемых удостоверений для управляемых приложений Azure в настоящее время доступна в предварительной версии. Используйте версию API 2018-09-01-preview для использования управляемого удостоверения.

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

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

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

Использование управляемого удостоверения

Управляемое удостоверение включает множество сценариев для управляемых приложений. Ниже приведены некоторые распространенные сценарии, которые можно выполнить.

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

Добавление управляемого удостоверения

Для создания управляемого приложения с управляемым удостоверением требуется задать другое свойство в ресурсе Azure. В следующем примере показан пример свойства Удостоверение:

{
  "identity": {
    "type": "SystemAssigned, UserAssigned",
    "userAssignedIdentities": {
      "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testRG/providers/Microsoft.ManagedIdentity/userassignedidentites/myuserassignedidentity": {}
    }
  }
}

Существует два распространенных способа создания управляемого приложения с identityпомощью шаблонов createUiDefinition.json и Azure Resource Manager. Для простых сценариев создания отдельных сценариев следует использовать createUiDefinition для включения управляемого удостоверения, так как он обеспечивает более широкий интерфейс. Однако при работе с расширенными или сложными системами, требующими автоматического или нескольких развертываний управляемых приложений, можно использовать шаблоны.

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

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

"outputs": {
  "managedIdentity": { "Type": "SystemAssigned" }
}

Использование createUiDefinition для управляемого удостоверения

Ниже приведены некоторые рекомендации по использованию createUiDefinition для включения управляемого удостоверения в управляемых приложениях.

  • Создание управляемого приложения проходит через портал Azure или Azure Marketplace.
  • Для управляемого удостоверения требуются сложные входные данные потребителя.
  • Управляемое удостоверение необходимо для создания управляемого приложения.

Элемент управления createUiDefinition управляемого удостоверения

CreateUiDefinition.json поддерживает встроенный элемент управления управляемыми удостоверениями.

{
  "$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": "applicationSettings",
        "label": "Application Settings",
        "subLabel": {
          "preValidation": "Configure your application settings",
          "postValidation": "Done"
        },
        "bladeTitle": "Application Settings",
        "elements": [
          {
            "name": "appName",
            "type": "Microsoft.Common.TextBox",
            "label": "Managed application Name",
            "toolTip": "Managed application instance name",
            "visible": true
          },
          {
            "name": "appIdentity",
            "type": "Microsoft.ManagedIdentity.IdentitySelector",
            "label": "Managed Identity Configuration",
            "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": false,
              "hideUserAssignedIdentity": false,
              "readOnlySystemAssignedIdentity": false
            },
            "visible": true
          }
        ]
      }
    ],
    "outputs": {
      "applicationResourceName": "[steps('applicationSettings').appName]",
      "location": "[location()]",
      "managedIdentity": "[steps('applicationSettings').appIdentity]"
    }
  }
}

Screenshot of the application settings for system-assigned managed identity and user-assigned managed identity

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

Примечание.

Шаблоны управляемых приложений Marketplace автоматически создаются для клиентов, выполняющих портал Azure возможности создания. Для этих сценариев для включения удостоверения необходимо использовать выходной managedIdentityключ в createUiDefinition .

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

Использование шаблонов Azure Resource Manager для управляемого удостоверения

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

  • Управляемые приложения можно программно развертывать на основе шаблона.
  • Пользовательские назначения ролей для управляемого удостоверения необходимы для подготовки управляемого приложения.
  • Управляемое приложение не нуждается в потоке создания портал Azure и Marketplace.

Шаблон SystemAssigned

Базовый шаблон Azure Resource Manager, который развертывает управляемое приложение с управляемым удостоверением, назначаемое системой.

"resources": [
  {
    "type": "Microsoft.Solutions/applications",
    "name": "[parameters('applicationName')]",
    "apiVersion": "2018-09-01-preview",
    "location": "[parameters('location')]",
    "identity": {
        "type": "SystemAssigned"
    },
    "properties": {
        "ManagedResourceGroupId": "[parameters('managedByResourceGroupId')]",
        "parameters": { }
    }
  }
]

Шаблон UserAssigned

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

"resources": [
  {
    "type": "Microsoft.ManagedIdentity/userAssignedIdentities",
    "name": "[parameters('managedIdentityName')]",
    "apiVersion": "2018-11-30",
    "location": "[parameters('location')]"
  },
  {
    "type": "Microsoft.Solutions/applications",
    "name": "[parameters('applicationName')]",
    "apiVersion": "2018-09-01-preview",
    "location": "[parameters('location')]",
    "identity": {
        "type": "UserAssigned",
        "userAssignedIdentities": {
            "[resourceID('Microsoft.ManagedIdentity/userAssignedIdentities/',parameters('managedIdentityName'))]": {}
        }
    },
    "properties": {
        "ManagedResourceGroupId": "[parameters('managedByResourceGroupId')]",
        "parameters": { }
    }
  }
]

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

После предоставления управляемому приложению удостоверения его можно предоставить доступ к существующим ресурсам Azure, создав назначение роли.

Для этого найдите и выберите имя управляемого приложения или управляемого удостоверения, назначаемого пользователем, а затем выберите элемент управления доступом (IAM). Подробные инструкции см. в статье Назначение ролей Azure с помощью портала Microsoft Azure.

Связывание существующих ресурсов Azure

Примечание.

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

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

Создание createUiDefinition с помощью связанного ресурса

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

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

{
  "$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": "Managed Application Settings",
        "subLabel": {
          "preValidation": "Managed Application Settings",
          "postValidation": "Done"
        },
        "bladeTitle": "Managed Application Settings",
        "elements": [
          {
            "name": "networkInterfaceId",
            "type": "Microsoft.Common.TextBox",
            "label": "Network interface resource ID",
            "defaultValue": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testRG/providers/Microsoft.Network/networkInterfaces/existingnetworkinterface",
            "toolTip": "Must represent the identity as an Azure Resource Manager resource identifer format ex. /subscriptions/sub1/resourcegroups/myGroup/providers/Microsoft.Network/networkInterfaces/networkinterface1",
            "visible": true
          },
          {
            "name": "userAssignedId",
            "type": "Microsoft.Common.TextBox",
            "label": "User-assigned managed identity resource ID",
            "defaultValue": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testRG/providers/Microsoft.ManagedIdentity/userassignedidentites/myuserassignedidentity",
            "toolTip": "Must represent the identity as an Azure Resource Manager resource identifer format ex. /subscriptions/sub1/resourcegroups/myGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/identity1",
            "visible": true
          }
        ]
      }
    ],
    "outputs": {
      "existingNetworkInterfaceId": "[steps('managedApplicationSetting').networkInterfaceId]",
      "managedIdentity": "[parse(concat('{\"Type\":\"UserAssigned\",\"UserAssignedIdentities\":{',string(steps('managedApplicationSetting').userAssignedId),':{}}}'))]"
    }
  }
}

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

Screenshot of a sample createUiDefinition.json with two inputs: a network interface resource ID and a user-assigned managed identity resource ID.

Создание mainTemplate с помощью связанного ресурса

Помимо обновления createUiDefinition, основной шаблон также необходимо обновить, чтобы принять переданный идентификатор связанного ресурса. Чтобы обновить основной шаблон для приема новых выходных данных, можно добавить новый параметр. managedIdentity Так как выходные данные переопределяют значение в созданном шаблоне управляемого приложения, он не передается в основной шаблон и не должен быть включен в раздел параметров.

Пример основного шаблона, который задает сетевой профиль существующему сетевому интерфейсу, предоставленному createUiDefinition.json.

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "existingNetworkInterfaceId": { "type": "string" }
  },
  "variables": {
  },
  "resources": [
    {
      "apiVersion": "2016-04-30-preview",
      "type": "Microsoft.Compute/virtualMachines",
      "name": "myLinkedResourceVM",
      "location": "[resourceGroup().location]",
      "properties": {
        …,
        "networkProfile": {
          "networkInterfaces": [
            {
              "id": "[parameters('existingNetworkInterfaceId')]"
            }
          ]
        }
      }
    }
  ]
}

Использование управляемого приложения с связанным ресурсом

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

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

Доступ к маркеру управляемого удостоверения

Теперь маркер управляемого приложения можно получить через listTokens API из клиента издателя. Пример запроса может выглядеть так:

POST https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/Microsoft.Solutions/applications/{applicationName}/listTokens?api-version=2018-09-01-preview HTTP/1.1

{
  "authorizationAudience": "https://management.azure.com/",
  "userAssignedIdentities": [
      "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{userAssignedIdentityName}"
  ]
}

Параметры текста запроса:

Параметр Обязательное поле Description
authorizationAudience no Универсальный код ресурса (URI) идентификатора приложения целевого ресурса. Это также утверждение aud (аудитории) выданного маркера. Значение по умолчанию — "https://management.azure.com/"
userAssignedIdentities no Список назначаемых пользователем управляемых удостоверений для получения маркера. Если оно не указано, listTokens возвращает маркер управляемого удостоверения, назначаемого системой.

Пример ответа может выглядеть так:

HTTP/1.1 200 OK
Content-Type: application/json

{
  "value": [
    {
      "access_token": "eyJ0eXAi…",
      "expires_in": "2…",
      "expires_on": "1557…",
      "not_before": "1557…",
      "authorizationAudience": "https://management.azure.com/",
      "resourceId": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/Microsoft.Solutions/applications/{applicationName}",
      "token_type": "Bearer"
    }
  ]
}

Ответ содержит массив маркеров в свойстве value :

Параметр Описание
access_token Запрашиваемый маркер доступа.
expires_in Допустимое количество секунд маркера доступа.
expires_on Период времени после истечения срока действия маркера доступа. Это значение представлено как количество секунд от эпохи.
not_before Период времени после вступления в силу маркера доступа. Это значение представлено как количество секунд от эпохи.
authorizationAudience aud (аудитория), для которой был запрошен маркер доступа. Это значение совпадает с тем, что было предоставлено в запросе listTokens .
resourceId Идентификатор ресурса Azure для выданного маркера. Это значение — это идентификатор управляемого приложения или идентификатор управляемого удостоверения, назначаемого пользователем.
token_type Тип маркера.

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