Conectando-se de seu aplicativo a recursos sem manipular credenciais
Os recursos do Azure com suporte a identidades gerenciadas sempre fornecem uma opção para especificar uma identidade gerenciada para se conectar aos recursos do Azure que dão suporte à autenticação do Microsoft Entra. O suporte a identidades gerenciadas torna desnecessário para os desenvolvedores gerenciar credenciais no código. As identidades gerenciadas são a opção de autenticação recomendada ao trabalhar com recursos do Azure que oferecem suporte a elas. Leia uma visão geral das identidades gerenciadas.
Esta página demonstra como configurar um Serviço de Aplicativo para que ele possa se conectar ao Cofre da Chave do Azure, ao Armazenamento do Azure e ao Microsoft SQL Server. Os mesmos princípios podem ser usados para qualquer recurso do Azure que ofereça suporte a identidades gerenciadas e que se conecte a recursos que dão suporte à autenticação do Microsoft Entra.
Os exemplos de código usam a biblioteca de cliente do Azure Identity, que é o método recomendado, pois ele lida automaticamente com muitas das etapas para você, incluindo a aquisição de um token de acesso usado na conexão.
A quais recursos as identidades gerenciadas podem se conectar?
Uma identidade gerenciada pode se conectar a qualquer recurso que ofereça suporte à autenticação do Microsoft Entra. Em geral, não há suporte especial necessário para que o recurso permita que identidades gerenciadas se conectem a ele.
Alguns recursos não suportam a autenticação do Microsoft Entra ou a biblioteca do cliente não suporta a autenticação com um token. Continue lendo para ver nossas orientações sobre como usar uma identidade gerenciada para acessar as credenciais com segurança sem precisar armazená-las em seu código ou configuração de aplicativo.
Criando uma identidade gerenciada
Existem dois tipos de identidade gerenciada: atribuída pelo sistema e atribuída pelo usuário. As identidades atribuídas ao sistema estão diretamente ligadas a um único recurso do Azure. Quando o recurso do Azure é excluído, a identidade também é. Uma identidade gerenciada atribuída pelo usuário pode ser associada a vários recursos do Azure e seu ciclo de vida é independente desses recursos.
Este artigo explicará como criar e configurar uma identidade gerenciada atribuída pelo usuário, que é recomendada para a maioria dos cenários. Se o recurso de origem que você está usando não oferecer suporte a identidades gerenciadas atribuídas pelo usuário, consulte a documentação desse provedor de recursos para saber como configurá-lo para ter uma identidade gerenciada atribuída ao sistema.
Criar uma identidade gerida atribuída pelo utilizador
Nota
Você precisará de uma função como "Colaborador de Identidade Gerenciada" para criar uma nova identidade gerenciada atribuída pelo usuário.
- Procure por "Identidades Gerenciadas" na barra de pesquisa na parte superior do Portal e selecione o resultado correspondente.
- Selecione o botão "Criar".
- Selecione o grupo Assinatura e Recursos e insira um nome para a identidade gerenciada.
Selecione "Rever + criar" para executar o teste de validação e, em seguida, selecione o botão "Criar".
Quando a identidade tiver sido criada, aparecerá uma tela de confirmação.
Agora você tem uma identidade que pode ser associada a um recurso de origem do Azure. Leia mais sobre como gerenciar identidades gerenciadas atribuídas pelo usuário..
Configurando seu recurso de origem para usar uma identidade gerenciada atribuída pelo usuário
Siga estas etapas para configurar seu recurso do Azure para ter uma identidade gerenciada por meio do Portal. Consulte a documentação do tipo de recurso específico para saber como configurar a identidade do recurso usando a Interface de Linha de Comando, PowerShell ou modelo ARM.
Nota
Você precisará de permissões de "Gravação" para configurar um recurso do Azure para ter uma identidade atribuída ao sistema. Você precisará de uma função como "Operador de Identidade Gerenciada" para associar uma identidade atribuída pelo usuário a um recurso do Azure.
- Localize o recurso usando a barra de pesquisa na parte superior do Portal
- Selecione o link Identidade na navegação
Selecione a guia "Atribuído pelo usuário"
Selecione o botão "Adicionar"
- Selecione a identidade atribuída pelo usuário que você criou anteriormente e selecione "Adicionar"
- A identidade será associada ao recurso e a lista será atualizada.
Seu recurso de origem agora tem uma identidade atribuída pelo usuário que ele pode usar para se conectar aos recursos de destino.
Adicionando permissões à identidade
Nota
Você precisará de uma função como "Administrador de Acesso de Usuário" ou "Proprietário" para o recurso de destino para adicionar atribuições de Função. Certifique-se de que está a conceder o menor privilégio necessário para que a aplicação seja executada.
Agora que seu Serviço de Aplicativo tem uma identidade gerenciada, você precisará dar à identidade as permissões corretas. Ao usar essa identidade para interagir com o Armazenamento do Azure, você usará o sistema RBAC (Controle de Acesso Baseado em Função) do Azure.
- Localize o recurso ao qual você deseja se conectar usando a barra de pesquisa na parte superior do Portal
- Selecione o link "Controle de acesso (IAM)" na navegação à esquerda.
- Selecione o botão "Adicionar" perto da parte superior da tela e selecione "Adicionar atribuição de função".
- Será exibida uma lista de Funções. Você pode ver as permissões específicas que uma função tem selecionando o link "Exibir". Selecione a função que deseja conceder à identidade e selecione o botão "Avançar".
- Você será solicitado a selecionar a quem a função deve ser concedida. Selecione a opção "Identidade gerenciada" e, em seguida, o link "Adicionar membros".
- Um painel de contexto aparecerá à direita, onde você pode pesquisar pelo tipo de identidade gerenciada. Selecione "Identidade gerenciada atribuída pelo usuário" na opção "Identidade gerenciada".
- Selecione a identidade que você criou anteriormente e o botão "Selecionar". O painel de contexto será fechado e a identidade será adicionada à lista.
- Selecione o botão "Rever + atribuir" para ver o resumo da atribuição de função e, em seguida, mais uma vez para confirmar.
- Selecione a opção "Atribuições de função" e uma lista das atribuições de função para o recurso será exibida.
Sua identidade gerenciada agora tem as permissões corretas para acessar o recurso de destino do Azure. Leia mais sobre o Controle de Acesso Baseado em Função do Azure.
Usando a identidade gerenciada em seu código
Seu Serviço de Aplicativo agora tem uma identidade gerenciada com permissões. Você pode usar a identidade gerenciada em seu código para interagir com recursos de destino, em vez de armazenar credenciais em seu código.
O método recomendado é usar a biblioteca de Identidade do Azure para sua linguagem de programação preferida. As linguagens suportadas incluem .NET, Java, JavaScript, Python, Go e C++. A biblioteca adquire tokens de acesso para você, facilitando a conexão com os recursos de destino.
Usando a biblioteca de Identidades do Azure em seu ambiente de desenvolvimento
Exceto para a biblioteca C++, as bibliotecas de Identidade do Azure dão suporte a um DefaultAzureCredential
tipo. DefaultAzureCredential
tenta autenticar automaticamente através de vários mecanismos, incluindo variáveis de ambiente ou um início de sessão interativo. O tipo de credencial pode ser usado em seu ambiente de desenvolvimento usando suas próprias credenciais. Ele também pode ser usado em seu ambiente de produção do Azure usando uma identidade gerenciada. Nenhuma alteração de código é necessária quando você implanta seu aplicativo.
Se você estiver usando identidades gerenciadas atribuídas pelo usuário, também deverá especificar explicitamente a identidade gerenciada atribuída pelo usuário com a qual deseja autenticar, passando o ID do cliente da identidade como parâmetro. Você pode recuperar o ID do cliente navegando até a identidade no Portal.
Leia mais sobre as bibliotecas de Identidade do Azure abaixo:
- Biblioteca de Identidade do Azure para .NET
- Biblioteca de Identidades do Azure para Java
- Biblioteca de Identidades do Azure para JavaScript
- Biblioteca de Identidade do Azure para Python
- Módulo de Identidade do Azure para Go
- Biblioteca de Identidades do Azure para C++
Acessando um Blob no Armazenamento do Azure
using Azure.Identity;
using Azure.Storage.Blobs;
// code omitted for brevity
// Specify the Client ID if using user-assigned managed identities
var clientID = Environment.GetEnvironmentVariable("Managed_Identity_Client_ID");
var credentialOptions = new DefaultAzureCredentialOptions
{
ManagedIdentityClientId = clientID
};
var credential = new DefaultAzureCredential(credentialOptions);
var blobServiceClient1 = new BlobServiceClient(new Uri("<URI of Storage account>"), credential);
BlobContainerClient containerClient1 = blobServiceClient1.GetBlobContainerClient("<name of blob>");
BlobClient blobClient1 = containerClient1.GetBlobClient("<name of file>");
if (blobClient1.Exists())
{
var downloadedBlob = blobClient1.Download();
string blobContents = downloadedBlob.Value.Content.ToString();
}
Aceder a um segredo armazenado no Azure Key Vault
using Azure.Identity;
using Azure.Security.KeyVault.Secrets;
using Azure.Core;
// code omitted for brevity
// Specify the Client ID if using user-assigned managed identities
var clientID = Environment.GetEnvironmentVariable("Managed_Identity_Client_ID");
var credentialOptions = new DefaultAzureCredentialOptions
{
ManagedIdentityClientId = clientID
};
var credential = new DefaultAzureCredential(credentialOptions);
var client = new SecretClient(
new Uri("https://<your-unique-key-vault-name>.vault.azure.net/"),
credential);
KeyVaultSecret secret = client.GetSecret("<my secret>");
string secretValue = secret.Value;
Aceder à Base de Dados SQL do Azure
using Azure.Identity;
using Microsoft.Data.SqlClient;
// code omitted for brevity
// Specify the Client ID if using user-assigned managed identities
var clientID = Environment.GetEnvironmentVariable("Managed_Identity_Client_ID");
var credentialOptions = new DefaultAzureCredentialOptions
{
ManagedIdentityClientId = clientID
};
AccessToken accessToken = await new DefaultAzureCredential(credentialOptions).GetTokenAsync(
new TokenRequestContext(new string[] { "https://database.windows.net//.default" }));
using var connection = new SqlConnection("Server=<DB Server>; Database=<DB Name>;")
{
AccessToken = accessToken.Token
};
var cmd = new SqlCommand("select top 1 ColumnName from TableName", connection);
await connection.OpenAsync();
SqlDataReader dr = cmd.ExecuteReader();
while(dr.Read())
{
Console.WriteLine(dr.GetValue(0).ToString());
}
dr.Close();
Conectando-se a recursos que não suportam ID do Microsoft Entra ou autenticação baseada em token em bibliotecas
Alguns recursos do Azure ainda não oferecem suporte à autenticação do Microsoft Entra ou suas bibliotecas de cliente não oferecem suporte à autenticação com um token. Normalmente, esses recursos são tecnologias de código aberto que esperam um nome de usuário e senha ou uma chave de acesso em uma cadeia de conexão.
Para evitar armazenar credenciais em seu código ou na configuração do aplicativo, você pode armazenar as credenciais como um segredo no Cofre de Chaves do Azure. Usando o exemplo exibido acima, você pode recuperar o segredo do Azure KeyVault usando uma identidade gerenciada e passar as credenciais para sua cadeia de conexão. Essa abordagem significa que nenhuma credencial precisa ser manipulada diretamente em seu código ou ambiente.
Diretrizes se você estiver lidando com tokens diretamente
Em alguns cenários, talvez você queira adquirir tokens para identidades gerenciadas manualmente em vez de usar um método interno para se conectar ao recurso de destino. Esses cenários não incluem nenhuma biblioteca de cliente para a linguagem de programação que você está usando ou o recurso de destino ao qual você está se conectando, ou conectando-se a recursos que não estão sendo executados no Azure. Ao adquirir tokens manualmente, fornecemos as seguintes diretrizes:
Armazene em cache os tokens que você adquire
Para desempenho e confiabilidade, recomendamos que seu aplicativo armazene tokens em cache na memória local ou criptografados se você quiser salvá-los no disco. Como os tokens de identidade gerenciados são válidos por 24 horas, não há nenhum benefício em solicitar novos tokens regularmente, pois um em cache será retornado do ponto de extremidade de emissão do token. Se você exceder os limites de solicitação, terá uma taxa limitada e receberá um erro HTTP 429.
Ao adquirir um token, você pode definir seu cache de token para expirar 5 minutos antes da expires_on
(ou propriedade equivalente) que será retornada quando o token for gerado.
Inspeção de tokens
Seu aplicativo não deve depender do conteúdo de um token. O conteúdo do token destina-se apenas ao público (recurso de destino) que está sendo acessado, não ao cliente que está solicitando o token. O conteúdo do token pode mudar ou ser criptografado no futuro.
Não exponha ou mova tokens
Os tokens devem ser tratados como credenciais. Não os exponha a utilizadores ou outros serviços; por exemplo, soluções de registo/monitorização. Eles não devem ser movidos do recurso de origem que os está usando, exceto para autenticar no recurso de destino.
Próximos passos
- Como usar identidades gerenciadas para o Serviço de Aplicativo e o Azure Functions
- Como utilizar identidades geridas com o Azure Container Instances
- Implementando identidades gerenciadas para recursos do Microsoft Azure
- Usar a federação de identidades de carga de trabalho para identidades gerenciadas para acessar recursos protegidos do Microsoft Entra sem gerenciar segredos