, , ,

Managed Identity – Acessar SQL Database com App Service

Avatar de Vinicius

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

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

Avatar de Vinicius

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *