Com o Azure Managed Identity é possível eliminar a necessidade dos desenvolvedores gerenciarem as senhas e credenciais, mantendo a comunicação segura entre os serviços. Se você ainda não sabe o que é Azure Managed Identity, confere este artigo aqui
No artigo de hoje, vou mostrar um exemplo prático de como acessar SQL database com App Service utilizando Managed Identity
Exemplo prático
Utilizando a imagem acima como exemplo, imaginando que você já possui um App Service e um Azure SQL Database, e quer realizar a comunicação deles através do Managed Identity
Pré-requisitos
- Azure SQL Server deve estar configurado para aceitar autenticação com Microsoft Entra
- Não precisa ser apenas Entra ID, pode ser no modo SQL e Entra
- Associar um Managed Identity no seu App Service
- Conceder permissões no SQL para o Managed Identity
Associar um Managed Identity no App Service
Você pode fazer isso tanto pelo Azure Portal como pela linha de comando
System Assigned
Para criar Managed Identity do tipo System Assigned basta executar o seguinte comando
az webapp identity assign --name Meu-Web-App --resource-group Meu-Resource-Group
User Assigned
Para criar Managed Identity do tipo User Assigned, é preciso primeiro criar a Managed Identity
$managedIdentity = az identity create --resource-group Meu-Resource-Group --name Managed-Identity-Name
Em seguida associar com o App Service
az webapp identity assign --resource-group Meu-Resource-Group --name Meu-Web-App --identities ($managedIdentity | ConvertFrom-Json).id
Conceder permissões no SQL
Para que essa comunicação seja estabelecida, o App Services precisa ter acesso ao Azure SQL Database através de uma Managed Identity, então você precisa conectar no Azure SQL Server utilizando uma conta do Entra e que tenha privilégios para criar usuários (preferencialmente que seja admin) e executar o seguinte comando na Database que você quer conceder o acesso via Managed Identity
Conectar no SQL Management Studio
Abra o SQL Management Studio, informe o servidor e escolha Authentication como Microsoft Entra MFA, pois desde Julho/2024 a Microsoft exige que os usuários no Azure tenham MFA configurado, então essa é a opção que precisa ser utilizada para permitir a autenticação
Seu navegador padrão irá abrir, solicitando que você conecte-se a conta e realize o processo de autenticação utilizando MFA
Uma vez conectado, vá até a database que você quer criar o usuário para o Managed Identity, botão direito e New Query
E então executar o comando abaixo, substituindo <identity-name> pelo nome da Managed Identity que está associada ao seu App Service
Se Managed Identity for do tipo System Assigned, o nome sempre será o nome do App Service
CREATE USER [<identity-name>] FROM EXTERNAL PROVIDER;
ALTER ROLE db_datareader ADD MEMBER [<identity-name>];
ALTER ROLE db_datawriter ADD MEMBER [<identity-name>];
ALTER ROLE db_ddladmin ADD MEMBER [<identity-name>];
GO
System Assigned
User Assigned
É possível utilizar tanto o SQL Server Management Studio quanto conectar através da linha de comando e, então executar o comando acima
sqlcmd -S <server-name>.database.windows.net -d <db-name> -U <aad-user-name> -P "<aad-password>" -G -l 30
E então executar o SQL Query para criar o usuário conforme sua Managed Identity
Configurando sua aplicação
Supondo que você utiliza um App Service e um Azure SQL Database e, para se comunicarem, você define uma ConnectionString para que a sua aplicação possa se conectar ao banco de dados.
Para este exemplo, estamos utilizando a seguinte solução, que está disponível aqui
Utilizando o Visual Studio, navegue até o projeto e abra o arquivo DotNetAppSqlDb.sln
Pré-requisitos
- Web App utilizando no Azure SQL Database
- Para conexão via Managed Identity, você vai precisar
- Adicionar o pacote NuGet Azure.Identity
- Atualizar o Entity Framework
- Modificar o código para estabelecer a comunicação via Managed Identity
Adicionar o pagote NuGet
Vá em Tools, NuGet Package Manager e clique em Package Manager Console
Na console você vai digitar
Install-Package Azure.Identity
E você deve ver uma saída semelhante a da imagem abaixo, informando que o pacote Azure.Identity foi adicionado
Atualizar o Entity Framework
Em seguida, no mesmo console digitar
E deve receber uma saída semelhante a esta imagem abaixo
Connection Strings
A forma como você cria a sua ConnectionString pode mudar dependendo a linguagem em que sua aplicação é escrita, então vamos utilizar aqui ASP.NET, onde você teria a seguinte linha dentro do Web.config
...
<connectionStrings>
<add name="MyDbConnection" connectionString="Data Source=sql-server;Initial Catalog=app-database;User Id=sql-user;Password=sql-password;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;providerName=System.Data.SqlClient" />
</connectionStrings>
...
Claramente, não é a forma mais segura de utilizar, pois qualquer pessoa com acesso ao servidor vai ter acesso a informações que sigilosas que estarão em texto plano
Como mencionado anteriormente, seria possível utilizar Key Vault, mas ainda há um gerenciamento de senhas e credenciais a ser realizado, desta forma Managed Identity seria uma alternativa, onde a ConnectionString mudaria para
...
<connectionStrings>
<add name="MyDbConnection" connectionString="Data Source=tcp:azure-sql-server.database.windows.net,1433;Initial Catalog=app-database;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;" providerName="System.Data.SqlClient" /> />
</connectionStrings>
...
Autenticação via Managed Identity
E, claro, dentro da sua aplicação precisaria determinar que a conexão do MyDbConnection será realizada através da requisição de um token ao Entra ID através do código abaixo (Models\MyDatabaseContext.cs)
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Web;
using System.Configuration;
using Azure.Identity;
namespace DotNetAppSqlDb.Models
{
public class MyDatabaseContext : DbContext
{
public MyDatabaseContext() : base("name=MyDbConnection")
{
Azure.Identity.DefaultAzureCredential credential;
var managedIdentityClientId = ConfigurationManager.AppSettings["ManagedIdentityClientId"];
if (managedIdentityClientId != null)
{
//User-assigned managed identity Client ID is passed in via ManagedIdentityClientId
var defaultCredentialOptions = new DefaultAzureCredentialOptions { ManagedIdentityClientId = managedIdentityClientId };
credential = new Azure.Identity.DefaultAzureCredential(defaultCredentialOptions);
}
else
{
//System-assigned managed identity or logged-in identity of Visual Studio, Visual Studio Code, Azure CLI or Azure PowerShell
credential = new Azure.Identity.DefaultAzureCredential();
}
var conn = (System.Data.SqlClient.SqlConnection)Database.Connection;
var token = credential.GetToken(new Azure.Core.TokenRequestContext(new[] { "https://database.windows.net/.default" }));
conn.AccessToken = token.Token;
}
public System.Data.Entity.DbSet<DotNetAppSqlDb.Models.Todo> Todoes { get; set; }
}
}
Remover Connection Strings configuradas no App Service
Os parâmetros configurados no nível do recurso App Service > Settings > Environment Variables tem prioridade sobre aqueles configurados dentro da sua aplicação, por exemplo no Web.config
Então, para garantir que conexão ocorra através da Managed Identity vamos remover essa Connection Strings com o seguinte comando
az webapp config connection-string delete --resource-group Meu-Resource-Group --name Meu-Web-App --setting-names Minha-Connection-String
E verificando o App Service novamente, agora não há qualquer referência, ou seja, a Connection String foi definida no Web.config e as configurações lá definidas juntamente com Models\MyDatabaseContext.cs, permitirão a conexão via Managed Identity
Publicar sua aplicação conectando com Managed Identity
Assumindo que você já tenha o perfil de publish da sua aplicação para o Web App no Azure, agora com as alterações feitas, vamos fazer a publicação da aplicação através do Visual Studio
Selecione o projeto no Solution Explorer, em seguida vá em Build e clique em Publish DotNetAppSqlDb
Em seguida a parte de Publish com o profile irá aparecer no Visual Studio, basta clicar em Publish
Se tudo estiver OK com seu build, você deverá ver a mensagem de que está ocorrendo warm up
O navegador padrão irá abrir uma nova aba, e voilá, você verá sua aplicação rodando (se tudo estiver correto)
E você pode clicar em Create New, adicionar uma descrição e pressionar Create para verificar se a conexão e interação com a database está ocorrendo ok
Como verificar que a conexão está ocorrendo através do Managed Identity?
Você precisa ir no Entra dentro do portal do Azure, na seção Monitoring e em Sign-in logs, então escolher Managed identity sign-ins
Como é possível observar que na terceira coluna, Managed Identity, possui o mesmo ID que a Identity associada ao App Service e que possui acesso ao Azure SQL Database
Deixe um comentário