Autenticação Azure SQL Server usando Identidades Gerenciadas

Autenticação em bancos de dados é um processo bem conhecido por quase todo desenvolvedor e existem algumas formas de fazer isso, cada uma com seus pontos positivos e negativos. Hoje vamos falar sobre como autenticar um banco de dados SQL Server na Azure usando Identidades Gerenciadas.
Mas, antes, um pouco de contexto. Como extraído pela documentação oficial da Microsoft: “No Azure, identidades gerenciadas eliminam a necessidade de os desenvolvedores terem que gerenciar credenciais, através da disponibilização de uma identidade para o recurso Azure no Azure AD, e usando ela para obter um Azure Active Directory (Azure AD) token”. Diante disso, destaco alguns pontos: as identidades gerenciadas são similares à usuários AD, como no sentido de permissões baseadas em grupos com funções ou permissões individuais, ou no gerenciamento automático de credenciais e na habilidade de identificar a sua aplicação em qualquer serviço Azure.

Pré-Requisitos

Nesse projeto, vamos utilizar os seguintes recursos:

  • Azure AD App Registration
  • Azure SQL Server Database (Pago)
  • Azure App Service (Docker)

Abra o portal Azure navegando para:

https://portal.azure.com

  1. Crie uma conta ou utilize uma existente no portal Azure. Para mais informações, acesse esse link: https://docs.microsoft.com/en-us/learn/modules/create-an-azure-account/
  2. Crie o seu App Service no Show Portal Menu. Selecione o ícone App Service e clique em Create.

a) Use uma assinatura existente ou o formato Pay-As-You-Go, que é criado com a elaboração da sua conta e cobra de acordo com a utilização dos seus recursos. Mas nesse caso não precisa se preocupar, pois esse recurso é de graça;
b)Você pode chamar o Resource Group do nome que quiser, mas para fins de consistência, vamos seguir a seguinte nomenclatura padrão: [ambiente]-[nomeDoServiço]-[TipoDoRecurso], que neste caso resultaria em dev-test-api-rg
c) Para o nome da aplicação, siga a mesma ideia. Mas como “test-api” é um bem comum e precisamos de uma identificação pública única, nós vamos adicionar algo que identifique o nosso. Por exemplo, a identificação da nossa conta que é encontrada digitando na barra de pesquisa: Tenant -> Tenant Properties e copiando como mostro a seguir:

                        

d) E finalmente, chame o nosso App Service de: bf2f5bb7-ef12-40f8-8293-8f2a3b2f2f64-dev-test-api-app-svc;
e) Selecione Docker Container como Publish type -> clique em Linux como sistema operacional e a região que desejar. Nesse exemplo utilizaremos South Central US;
f) Para o App Service Plan, clique em Create New e o chame de dev-test-api-app-svc-plan;
g) Finalmente, para o Sku and size clique em Change Size, isso vai abrir uma dialog box com várias opções. No nosso caso, clique em Dev / Test e na categoria F1, como abaixo:

                         

h) Clique em Próximo e para a Configuração Docker copie as seguintes opções:

– Options: Single Container
– Image Source: Docker Hub
– Access Type: Public
– Image and Tag: tiago-muller/test-api:latest
– Startup Command pode deixar vazio

i) Nós não vamos abordar monitoramento hoje, então pode clicar em Review + Create. E finalize clicando Create;
j) Isso vai abrir uma página de deployment, e assim que estiver completa, uma página similar a essa vai aparecer e você pode clicar em Go to resource;

k) Agora que a nossa aplicação foi iniciada, temos que expor a porta do nosso container, para isso vá em Blade Settings -> Configuration e adicione um novo Application Setting chamado WEBSITES_PORT com o valor de 8080. Isso vai reinicializar a sua aplicação, espere reiniciar antes de ir para o próximo passo;
l) Volte para o overview tab do seu app service, copie a URL e acesse o seu caminho + /api/health/isalive. Você deve visualizar a mensagem: “API is alive”.

 

  1. Agora que a nossa aplicação está rodando, precisamos criar alguns outros recursos no portal Azure:

 

a) Primeiro, vamos criar o nosso SQL Server Database por meio do passo a passo da Microsoft: https://docs.microsoft.com/pt-br/azure/azure-sql/database/single-database-create-quickstart?tabs=azure-portal
b) Com o nosso SQL Server Database criado, precisamos elaborar a nossa App Registration indo em ‘Azure Active Directory Blade’ -> ‘App Registrations’ -> ‘New registration’ para visualizar a seguinte página:

c) Clique em New Registration, digite o nome do app service e deixe o restante como está.

  1. Vamos rapidamente criar um Azure AD Group com permissões Database Admin e adicionar a nossa App Registration a ele. Isso será utilizado em nosso próximo passo. Para fazê-lo, abra o menu Azure Active Directory, e em Groups clique em New Group

a) Chame o seu grupo de dev-database-admins e no menu Members, adicione a nossa App Registration a ele.

  1. Acesse o seu banco de dados SQL Server e siga os seguintes passos:

a)Clique em server name, do lado direito do site, para acessar o servidor do banco de dados.
b) Dentro da página do server, em Settings, clique no menu ‘Active Directory Admin’ -> Set Admin -> Selecione o grupo AD que cria

  1. Configure os parâmetros para a nossa instância SQL Server, Tenant, ClientId e ClientSecret

a) No mesmo menu do item 2, nós precisamos:

– Adicionar uma nova connection string chamada ‘SampleDatabase’ com o valor de “Data Source={seu_servidor de_banco_de_dados_aqui};Initial Catalog={seu_banco_inicial_aqui};Connect Timeout=100;Persist Security Info=false;TrustServerCertificate=false;Encrypt=true;MultipleActiveResultSets=false” e tipo de SQL Server;

– Adicionar uma nova application setting chamada ‘IdentitySettings:Authority’, com o valor de ‘https://login.microsoftonline.com/your_tenant_id_here’;

– Adicionar uma outra application setting chamada ‘IdentitySettings:TenantId’, com o valor do seu Tenant Id

– Adicionar mais uma nova application setting chamada ‘IdentitySettings:ApplicationId’, com o valor de ‘your_application_client_id_here’;

– E finalizar com mais um application setting chamada ‘IdentitySetting:ClientSecret’, com o valor de ‘your client secret here’.

  1. Com o nosso Azure AD Admin configurado para o banco de dados e nossa identidade gerenciada criada, vamos precisar logar no banco e rodar alguns scripts para dar acesso read/write a nossa identidade gerenciada:

 

a)Crie um usuário [sua_identidade_gerenciada_aqui] de um provedor externo;

  • Exemplo: create user bf2f5bb7-ef12-40f8-8293-8f2a3b2f2f64-dev-test-api-app-svc from external provider

b) Alterar a função db_datareader e adicionar membro [sua_identidade_gerenciada_aqui];
c) Alterar a função db_datawriter e adicionar membro [sua_identidade_gerenciada_aqui];

  

  1. Agora, com tudo configurado, podemos chamar o endpoint na API para ver se a conexão está funcionando corretamente através do caminho /api/health/is-db-conn-alive. Se você receber a resposta “Connection is alive: true”, tudo deu certo, parabéns você completou todo o passo a passo.

Resumo

Autenticação a banco de dados é um item básico na maioria das aplicações, mas identidades gerenciadas fazem a sua vida mais fácil, ao delegar à plataforma o trabalho de gerenciar credenciais de forma mais segura.