Managed Identity – Acessar SQL Database com App Service

[ad_1]

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

architecture.png?wt

Table of Contents

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
criar system assigned associado web app viniciusdeschamps.com .br

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
criar user assigned identity viniciusdeschamps.com .br 1

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
associar user assigned identity web app viniciusdeschamps.com .br 1

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

acessar sql server utilizando autenticacao entra viniciusdeschamps.com .br

Seu navegador padrão irá abrir, solicitando que você conecte-se a conta e realize o processo de autenticação utilizando MFA

azure mfa acesso azure sql viniciusdeschamps.com .br

Uma vez conectado, vá até a database que você quer criar o usuário para o Managed Identity, botão direito e New Query

azure sql executar sql query viniciusdeschamps.com .br

E então executar o comando abaixo, substituindo 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 [] FROM EXTERNAL PROVIDER;
ALTER ROLE db_datareader ADD MEMBER [];
ALTER ROLE db_datawriter ADD MEMBER [];
ALTER ROLE db_ddladmin ADD MEMBER [];
GO
System Assigned
executar query para criar system managed identity sql viniciusdeschamps.com .br
User Assigned
executar query para criar user managed identity sql viniciusdeschamps.com .br

É 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 .database.windows.net -d  -U  -P "" -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

configurando sua aplicacao abrir projeto visual studio viniciusdeschamps.com .br

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

adicionar o pacote NuGet Azure Identity viniciusdeschamps.com .br

Na console você vai digitar

Install-Package Azure.Identity
package manager console install package azure identity viniciusdeschamps.com .br

E você deve ver uma saída semelhante a da imagem abaixo, informando que o pacote Azure.Identity foi adicionado

package manager console install package azure identity instalacao concluida viniciusdeschamps.com .br

Atualizar o Entity Framework

Em seguida, no mesmo console digitar

package manager console update package entityframework viniciusdeschamps.com .br

E deve receber uma saída semelhante a esta imagem abaixo

package manager console update package entityframework atualizacao concluida viniciusdeschamps.com .br

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

...  

    
  
...

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

...

   />

...

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 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

web app settings environment variables app settings connection strings viniciusdeschamps.com .br

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
remover web app environment variable connection strings viniciusdeschamps.com .br

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

apos remover web app environment variable connection strings viniciusdeschamps.com .br

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

publish visual studio no azure com managed identity viniciusdeschamps.com .br

Em seguida a parte de Publish com o profile irá aparecer no Visual Studio, basta clicar em Publish

publish profile visual studio no azure com managed identity viniciusdeschamps.com .br

Se tudo estiver OK com seu build, você deverá ver a mensagem de que está ocorrendo warm up

publish profile visual studio no azure com managed identity warming up site viniciusdeschamps.com .br

O navegador padrão irá abrir uma nova aba, e voilá, você verá sua aplicação rodando (se tudo estiver correto)

app service acessando sql database utilizando managed identity viniciusdeschamps.com .br

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

app service acessando sql database utilizando managed identity adicionando entrada viniciusdeschamps.com .br
app service acessando sql database utilizando managed identity verificando entrada criada viniciusdeschamps.com .br

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

verificar conectividade app service sql database managed identity entra id viniciusdeschamps.com .br

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

web app managed identity system assigned viniciusdeschamps.com .br

[ad_2]

Share this content:

I am a passionate blogger with extensive experience in web design. As a seasoned YouTube SEO expert, I have helped numerous creators optimize their content for maximum visibility.

Leave a Comment