Blog
Domine a plataforma e otimize seus gastos!
Azure SQL + Managed Identities = Autenticação sem usuário e senha
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. Esse cenário já é possível no Azure SQL utilizando Identidades Gerenciadas no Azure AD.
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:
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."
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!