Compartilhar via


Aplicativo Gerenciado do Azure com identidade gerenciada

Observação

O suporte da identidade gerenciada para os Aplicativos Gerenciados do Azure está atualmente em versão prévia. 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 utilizada para permitir que o cliente conceda ao aplicativo gerenciado acesso aos recursos existentes. A plataforma do Azure gerencia a identidade e não exige que você provisione ou gire nenhum segredo. Para saber mais sobre identidades gerenciadas na ID do Microsoft Entra, consulte Identidades gerenciadas para recursos do Azure.

Seu aplicativo pode receber dois tipos de identidades:

  • Uma identidade gerenciada atribuída pelo sistema está vinculada ao seu aplicativo e será excluída se o aplicativo for excluído. Um aplicativo só pode ter uma identidade gerenciada atribuída pelo 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 possibilita muitos cenários para aplicativos gerenciados. Alguns cenários comuns que podem ser resolvidos são:

  • Implantação de um aplicativo gerenciado vinculado aos recursos existentes do Azure. Um exemplo é a implantação de uma máquina virtual (VM) do Azure dentro do aplicativo gerenciado que está anexado a um adaptador 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 Log de Atividades e outros serviços no Azure.

Adicionando a identidade gerenciada

A criação de um aplicativo gerenciado com uma identidade gerenciada exige que outra propriedade seja definida no recurso Azure. O seguinte exemplo mostra uma propriedade identity de amostra:

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

Existem 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 avançada. No entanto, ao lidar com sistemas avançados ou complexos que exigem implantações automatizadas ou de vários aplicativos gerenciados, modelos podem ser usados.

Usando createUiDefinition

Um aplicativo gerenciado pode ser configurado com a identidade gerenciada através do createUiDefinition.json. Na seção saídas , a chave managedIdentity pode ser usada para substituir a propriedade de identidade do modelo de aplicativos gerenciados. O exemplo a seguir habilita uma identidade gerenciada atribuída pelo 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 criar aplicativos gerenciados com a 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 de aplicativos gerenciados passa pelo portal do Azure ou pelo Azure Marketplace.
  • A identidade gerenciada exige uma entrada complexa 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 gerenciada 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]"
    }
  }
}

Captura de tela das configurações do aplicativo para identidade gerenciada atribuída pelo sistema e identidade gerenciada atribuída pelo usuário

Usar modelos do Azure Resource Manager

Observação

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 chave de saída managedIdentity na 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 pelo sistema no aplicativo gerenciado. Objetos de identidade mais complexos podem ser formados usando os parâmetros de modelo do Azure Resource Manager para fornecer entradas. Essas entradas podem ser usadas para criar aplicativos gerenciados com a identidade gerenciada atribuída pelo usuário.

Quando usar os modelos do Azure Resource Manager para identidade gerenciada

A seguir estão algumas recomendações sobre quando usar os 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 fluxo de criação do Marketplace e do portal do Azure.

Modelo SystemAssigned

Um modelo do Azure Resource Manager básico que implanta um aplicativo gerenciado com a 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 do Azure Resource Manager básico 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": { }
    }
  }
]

Como conceder acesso aos recursos do Azure

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

Para fazer isso, pesquise e selecione o nome do aplicativo gerenciado ou da identidade gerenciada atribuída pelo usuário e selecione Controle de acesso (IAM). Para ver as etapas detalhadas, confira Atribuir funções do Azure usando o portal do Azure.

Como vincular recursos existentes do Azure

Observação

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

A identidade gerenciada também pode ser usada para implantar um aplicativo gerenciado que exija 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 da createUiDefinition com um recurso vinculado

Quando você vincula a implantação do aplicativo gerenciado a recursos existentes, é necessário fornecer 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.

Uma amostra createUiDefinition.json que requer duas entradas: uma ID de recurso de interface de rede e uma ID de recurso de identidade gerenciada atribuída pelo 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 identifier 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 identifier 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),':{}}}'))]"
    }
  }
}

Esse 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 no recurso que está sendo vinculado à implantação do aplicativo gerenciado. A segunda é que um consumidor insira a ID de recurso do Azure de identidade gerenciada atribuída pelo usuário, que tem acesso ao recurso vinculado do Azure. A experiência gerada teria a seguinte aparência:

Captura de tela de uma amostra createUiDefinition.json com duas entradas: uma ID de recurso de interface de rede e uma ID de recurso de identidade gerenciada atribuída pelo usuário.

Como criar mainTemplate com um recurso vinculado

Além de atualizar o createUiDefinition, o modelo principal também precisa ser atualizado para aceitar a ID do recurso vinculado passado. O modelo principal pode ser atualizado para aceitar a nova saída adicionando um novo parâmetro. Como a saída managedIdentity 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 exemplo de modelo principal que define o perfil de rede de um adaptador de rede existente fornecido 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 aplicativos gerenciados for criado, o aplicativo gerenciado pode ser consumido pelo portal do Azure. Antes que possa ser consumido, há várias etapas de pré-requisito.

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

Acessando o token da identidade gerenciada

O token do aplicativo gerenciado já pode ser acessado por meio da API listTokens do locatário do editor. Uma solicitação de exemplo pode ser semelhante ao seguinte:

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. Ele também é a declaração aud (público-alvo) 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 a qual recuperar um token. Se não for especificado, listTokens retornará o token da identidade gerenciada atribuída pelo sistema.

Uma resposta de exemplo pode ser semelhante ao seguinte:

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 na propriedade value:

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 expiração do token de acesso. Esse valor é representado como o número de segundos da época.
not_before O período de entrada em vigor do token de acesso. Esse valor é representado como o número de segundos da época.
authorizationAudience O aud (público-alvo) para o qual o token de acesso foi solicitado. Esse valor é o mesmo que foi fornecido na solicitação listTokens.
resourceId A ID de recurso do Azure para o token emitido. Esse valor é a ID do aplicativo gerenciado ou a ID da identidade gerenciada atribuído pelo usuário.
token_type O tipo de token.

Próximas etapas