Olá,

Já imaginou um cenário aonde pudéssemos gerenciar os acessos ao banco de dados da nossa aplicação sem precisa ficar especificando usuário e senha em strings de conexão? Ou precisar alterar a senha de algum usuário de aplicação por que alguém foi mandado embora?
Esse cenário já é possível no Azure SQL utilizando Identidades Gerenciadas no Azure AD.

Um pequeno aviso antes de irmos para a parte legal! Existem outras maneiras de garantirmos segurança nas nossas aplicações, especialmente utilizando a integração com o Azure Key Vault que nos permite guardar informações de maneira confidencial, mas meu ponto nesse post é mostrar de forma simples e prática como aumentar a segurança do nosso banco sem nos preocuparmos com gerenciamento de senhas.

EDIT: 2023-06-27: Fiz um vídeo tutorial com o mesmo tema

Criando seu Banco de Dados

Para esse post criei um novo Azure SQL do zero, mas as configurações podem ser aplicadas em um banco já existente.

O primeiro passo é garantirmos que não vamos aceitar autenticação SQL tradicional (com usuário e senha), iremos aceitar apenas autenticação pelo Azure AD

Após selecionado o método de autenticação, selecione um usuário que seja o ADMIN do banco de dados, no meu caso estou utilizando meu próprio usuário para ser o usuário principal. Essa configuração seria o equivalente a definir qual usuário teria os mesmos privilégios da conta "sa" no Sql Server.

Poderíamos aumentar ainda mais a segurança restringindo o acesso somente via Private Endpoint e colocando nosso banco em uma VNet, mas para mantermos a simplicidade e o objetivo do artigo iremos manter a opção de termos um endpoint público. Habilitei também o acesso via serviços do Azure (nosso App Service precisa dessa opção habilitada para acessar o Sql sem estar dentro de uma VNet) e também adicionei meu IP para poder testar via Management Studio.

Por fim, criei o banco utilizando o exemplo de "Sales" do Azure para poder ter dados para testar na aplicação.

Após o banco criado podemos testar a conexão pelo Management Studio utilizando a opção de autenticação "Azure Active Directory - Universal with MFA", ao tentar conectar, se não houver conexão prévia, o Management Studio irá solicitar autenticação e fará cache do token.

Uma vez que nosso usuário foi autenticado podemos gerenciar todos os aspectos do nosso banco, incluir ou remover usuários, mudar configurações e executar nossas queries.

Testando a aplicação Localmente

Pronto! Agora que temos nosso servidor Azure SQL configurado podemos testar o fluxo de autenticação via máquina de desenvolvimento. Todo o código utilizado esta no github no link:

GitHub - rsantosdev/appservice-azuresql-nouserorpassword: Sample code to test Azure Sql authentication with Managed Identity
Sample code to test Azure Sql authentication with Managed Identity - GitHub - rsantosdev/appservice-azuresql-nouserorpassword: Sample code to test Azure Sql authentication with Managed Identity

O único ponto que muda para o fluxo de desenvolvimento normal utilizando usuário e senha é justamente a forma de autenticação na string de conexão, devemos utilizar o padrão a seguir:

Server=seu-servidor.database.windows.net;Authentication=Active Directory Default;Initial Catalog=seu-banco;

No exemplo estou utilizando Dapper, mas mesmo que você estiver usando EntityFramework Core o importante é utilizarmos o pacote Microsoft.Data.SqlClient para acesso ao banco, ele já possui a lógica necessária para ligar com tokens de autenticação no Azure AD. Antes de executar o código garanta que seu Visual Studio/VSCode/AZ CLI estejam autenticados com um usuário que tenha acesso ao banco, casso contrário você pode encontrar o erro "SqlException: Login failed for user '<>'. The server is not currently configured to accept this token."

Código executado com sucesso.
Erro apresentado se o Visual Studio não estiver autenticado.

Configurando o App Service

Agora estamos quase lá, já temos nosso servidor Azure SQL configurado e garantimos que a aplicação está funcionando (ao menos na minha máquina está rodando... auhauhuah)

O próximo passo é criar um App Service no Azure para hospedar nossa aplicação, nesse post não irei abordar a criação. Mas no meu caso, utilizei as configurações default, baixei o publish settings e fiz o deploy direto da minha máquina.

A única configuração que precisamos fazer é criarmos uma identidade gerenciada para o nosso App Service e dar acesso para ela no Azure SQL.

Uma vez criado o App Service vá à opção Identity no portal, habilite na aba System assigned e salve.

Por padrão o nome da identidade gerada será o mesmo nome do seu app service, iremos precisar desse nome para rodarmos o script a seguir, esse script irá criar um usuário com permissões básicas no banco de dados e dessa forma conseguiremos executar nossa aplicação.

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

Com tudo configurado agora podemos executar nossa aplicação no Azure sem precisar especificar nenhum usuário ou senha para conectarmos no banco de dados.

Espero que tenham gostado.
[]s e até o próximo post!

💡
Podemos te ajudar com uma revisão 100% gratuita do seu ambiente cloud.
Share this post