Aplicativo gerenciado do Azure com identidade gerenciada

Nota

O suporte de identidade gerenciada para Aplicativos Gerenciados do Azure está atualmente em visualização. Use a versão da api 2018-09-01-preview para utilizar a identidade gerenciada.

Saiba como configurar um aplicativo gerenciado para conter uma identidade gerenciada. Uma identidade gerenciada pode ser usada para permitir que o cliente conceda ao aplicativo gerenciado acesso aos recursos existentes. A plataforma Azure gerencia a identidade e não exige que você provisione ou alterne nenhum segredo. Para obter mais informações sobre identidades gerenciadas no Microsoft Entra ID, consulte Identidades gerenciadas para recursos do Azure.

Pode conceder dois tipos de identidades à aplicação:

  • Uma identidade gerenciada atribuída ao sistema é vinculada ao seu aplicativo e é excluída se o aplicativo for excluído. Um aplicativo só pode ter uma identidade gerenciada atribuída ao sistema.
  • Uma identidade gerenciada atribuída pelo usuário é um recurso autônomo do Azure que pode ser atribuído ao seu aplicativo. Um aplicativo pode ter várias identidades gerenciadas atribuídas pelo usuário.

Como usar a identidade gerenciada

A identidade gerenciada permite muitos cenários para aplicativos gerenciados. Alguns cenários comuns que podem ser resolvidos são:

  • Implantar um aplicativo gerenciado vinculado a recursos existentes do Azure. Um exemplo é a implantação de uma máquina virtual (VM) do Azure no aplicativo gerenciado anexado a uma interface de rede existente.
  • Conceder ao aplicativo gerenciado e ao editor acesso aos recursos do Azure fora do grupo de recursos gerenciados.
  • Fornecer uma identidade operacional de aplicativos gerenciados para o Log de Atividades e outros serviços no Azure.

Adicionando identidade gerenciada

Criar um aplicativo gerenciado com uma identidade gerenciada requer que outra propriedade seja definida no recurso do Azure. O exemplo a seguir mostra uma propriedade de identidade de exemplo:

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

Há duas maneiras comuns de criar um aplicativo gerenciado com identity: createUiDefinition.json e modelos do Azure Resource Manager. Para cenários simples de criação única, createUiDefinition deve ser usado para habilitar a identidade gerenciada, pois fornece uma experiência mais rica. No entanto, ao lidar com sistemas avançados ou complexos que exigem implantações automatizadas ou múltiplas de aplicativos gerenciados, os modelos podem ser usados.

Usando createUiDefinition

Um aplicativo gerenciado pode ser configurado com identidade gerenciada por meio do createUiDefinition.json. Na seção saídas, a chave managedIdentity pode ser usada para substituir a propriedade identity do modelo de aplicativo gerenciado. O exemplo a seguir habilita uma identidade gerenciada atribuída ao sistema no aplicativo gerenciado. Objetos de identidade mais complexos podem ser formados usando elementos createUiDefinition para solicitar entradas ao consumidor. Essas entradas podem ser usadas para construir aplicativos gerenciados com identidade gerenciada atribuída pelo usuário.

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

Quando usar createUiDefinition para identidade gerenciada

A seguir estão algumas recomendações sobre quando usar createUiDefinition para habilitar uma identidade gerenciada em aplicativos gerenciados.

  • A criação do aplicativo gerenciado passa pelo portal do Azure ou pelo Azure Marketplace.
  • A identidade gerenciada requer informações complexas do consumidor.
  • A identidade gerenciada é necessária na criação do aplicativo gerenciado.

Controle createUiDefinition de identidade gerenciada

O createUiDefinition.json suporta um controle de identidade gerenciado interno.

{
  "$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

Utilizar modelos do Azure Resource Manager

Nota

Os modelos de aplicativos gerenciados do Marketplace são gerados automaticamente para os clientes que passam pela experiência de criação do portal do Azure. Para esses cenários, a managedIdentity chave de saída no createUiDefinition deve ser usada para habilitar a identidade.

A identidade gerenciada também pode ser habilitada por meio de modelos do Azure Resource Manager. O exemplo a seguir habilita uma identidade gerenciada atribuída ao sistema no aplicativo gerenciado. Objetos de identidade mais complexos podem ser formados usando parâmetros de modelo do Azure Resource Manager para fornecer entradas. Essas entradas podem ser usadas para construir aplicativos gerenciados com identidade gerenciada atribuída pelo usuário.

Quando usar modelos do Azure Resource Manager para identidade gerenciada

A seguir estão algumas recomendações sobre quando usar modelos do Azure Resource Manager para habilitar a identidade gerenciada em aplicativos gerenciados.

  • Os aplicativos gerenciados podem ser implantados programaticamente com base em um modelo.
  • Atribuições de função personalizadas para a identidade gerenciada são necessárias para provisionar o aplicativo gerenciado.
  • O aplicativo gerenciado não precisa do portal do Azure e do fluxo de criação do Marketplace.

Modelo SystemAssigned

Um modelo básico do Azure Resource Manager que implanta um aplicativo gerenciado com identidade gerenciada atribuída ao sistema.

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

Modelo UserAssigned

Um modelo básico do Azure Resource Manager que implanta um aplicativo gerenciado com uma identidade gerenciada atribuída pelo usuário.

"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": { }
    }
  }
]

Concedendo acesso aos recursos do Azure

Depois que um aplicativo gerenciado recebe uma identidade, ele pode receber acesso aos recursos existentes do Azure criando uma atribuição de função.

Para fazer isso, procure e selecione o nome do aplicativo gerenciado ou da identidade gerenciada atribuída pelo usuário e, em seguida, selecione Controle de acesso (IAM). Para obter os passos detalhados, veja o artigo Atribuir funções do Azure com o portal do Azure.

Vinculando recursos existentes do Azure

Nota

Uma identidade gerenciada atribuída pelo usuário deve ser configurada antes de implantar o aplicativo gerenciado. Além disso, a implantação de recursos vinculados de aplicativos gerenciados só é suportada para o tipo Marketplace .

A identidade gerenciada também pode ser usada para implantar um aplicativo gerenciado que requer acesso aos recursos existentes durante sua implantação. Quando o cliente provisiona o aplicativo gerenciado, identidades gerenciadas atribuídas pelo usuário podem ser adicionadas para fornecer mais autorizações para a implantação do mainTemplate .

Criação de createUiDefinition com um recurso vinculado

Quando você vincula a implantação do aplicativo gerenciado a recursos existentes, o recurso existente do Azure e uma identidade gerenciada atribuída pelo usuário com a atribuição de função aplicável nesse recurso devem ser fornecidos.

Um exemplo createUiDefinition.json que requer duas entradas: um ID de recurso de interface de rede e um ID de recurso de identidade gerenciado atribuído ao usuário.

{
  "$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),':{}}}'))]"
    }
  }
}

Este createUiDefinition.json gera uma experiência de usuário de criação que tem dois campos. O primeiro campo permite que o usuário insira a ID do recurso do Azure para o recurso que está sendo vinculado à implantação do aplicativo gerenciado. O segundo é para um consumidor inserir a ID do recurso do Azure de identidade gerenciada atribuída pelo usuário, que tem acesso ao recurso do Azure vinculado. A experiência gerada seria semelhante a:

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

Criação do mainTemplate com um recurso vinculado

Além de atualizar o createUiDefinition, o modelo principal também precisa ser atualizado para aceitar o ID de recurso vinculado passado. O modelo principal pode ser atualizado para aceitar a nova saída adicionando um novo parâmetro. Como a managedIdentity saída substitui o valor no modelo de aplicativo gerenciado gerado, ela não é passada para o modelo principal e não deve ser incluída na seção de parâmetros.

Um modelo principal de exemplo que define o perfil de rede para uma interface de rede existente fornecida pelo 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')]"
            }
          ]
        }
      }
    }
  ]
}

Consumindo o aplicativo gerenciado com um recurso vinculado

Depois que o pacote de aplicativo gerenciado é criado, o aplicativo gerenciado pode ser consumido por meio do portal do Azure. Antes de ser consumido, existem várias etapas de pré-requisito.

  • Uma instância do recurso vinculado necessário do Azure deve ser criada.
  • A identidade gerenciada atribuída pelo usuário deve ser criada e receber atribuições de função ao recurso vinculado.
  • O ID de recurso vinculado existente e o ID de identidade gerenciado atribuído pelo usuário são fornecidos para createUiDefinition.

Acessando o token de identidade gerenciado

O token do aplicativo gerenciado agora pode ser acessado por meio da listTokens api do locatário do editor. Um exemplo de solicitação pode se parecer com:

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}"
  ]
}

Parâmetros do corpo da solicitação:

Parâmetro Obrigatório Descrição
authorizationAudience Não O URI da ID do aplicativo do recurso de destino. Também é a aud reivindicação (do público) do token emitido. O valor padrão é "https://management.azure.com/"
userAssignedIdentities Não A lista de identidades gerenciadas atribuídas pelo usuário para recuperar um token. Se não for especificado, listTokens retorna o token para a identidade gerenciada atribuída ao sistema.

Um exemplo de resposta pode ser parecido com:

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"
    }
  ]
}

A resposta contém uma matriz de tokens sob a value propriedade:

Parâmetro Descrição
access_token O token de acesso solicitado.
expires_in O número de segundos que o token de acesso é válido.
expires_on O período de tempo em que o token de acesso expira. Este valor é representado como o número de segundos da época.
not_before O período de tempo em que o token de acesso entra em vigor. Este valor é representado como o número de segundos da época.
authorizationAudience O aud (público) para o qual o token de acesso foi solicitado. Este valor é o mesmo que foi fornecido no listTokens pedido.
resourceId A ID de recurso do Azure para o token emitido. Esse valor é o ID do aplicativo gerenciado ou o ID de identidade gerenciado atribuído pelo usuário.
token_type O tipo do token.

Próximos passos