Você já esta usando o conceito de Serverless em suas aplicações ? Se ainda não está, recomendo que dê uma olhada no Azure Functions, uma funcionalidade do Azure que permite trabalhar com o conceito de programação orientada a eventos, ou seja, seu código pode ser acionado por um serviço externo, através de mensagens, arquivos no blob, entre outros. Mais detalhes sobre Functions você encontra aqui: https://docs.microsoft.com/pt-br/azure/azure-functions/functions-overview.
Azure KeyVault
Agora vamos pensar em segurança, onde guardamos as configurações da nossa aplicação ? Por exemplo: string do banco, senha do email. Provavelmente você guarda no arquivo de configuração, certo ? Isto não está errado, mas você pode ter um problema de segurança se tiver mais de um ambiente, por exemplo: Desenvolvimento, Homologação e Produção. Todo mundo pode ver as configurações do ambiente de produção ? Isto deveria mesmo estar em um arquivo de configuração ?
Aqui entra o Azure KeyVault, um cofre virtual onde podemos guardar diversas informações, como por exemplo nossas configurações de aplicações.
Mas quais as vantagens do KeyVault ? A principal delas é a segurança, mas vamos enumerar mais algumas:
- Centralização da configuração - podemos guardar a configuração de vários ambientes no KeyVault
- Versionamento da configuração - todas as mudanças em chaves do KeyVault são armazenadas, então você tem um histórico dos valores
- Acesso restrito - permita somente leitura no KeyVault para suas aplicações
Você pode pegar mais detalhes do Azure KeyVault aqui: https://docs.microsoft.com/pt-br/azure/key-vault/
Permitindo acesso ao KeyVault através do Identity da Function
Para que a function possa acessar o KeyVault precisamos permitir o acesso através da configuração do Identity. Assim vamos acessar a nossa function no portal do Azure e habilitar a opção:
Clicando em Salvar teremos nosso ID criado:
Vamos copiar este ID e habilitar o acesso no KeyVault.
Habiltando a function dentro do KeyVault
Dentro do KeyVault vamos em “Access policies” e depois em “Add Access Policy”
Dentro da Access Policy vamos colocar acesso somente para Leitura da Secret:
E agora vamos pegar o ID da function que geramos no Identity e permitir o acesso:
Por fim clicamos no botão “Add” e confirmamos o acesso.
Crie suas chaves nas Secrets do KeyVault
Não se esqueca de criar as Secrets dentro do KeyVault. No nosso exemplo teremos uma Secret com o nome de “valorCofre”.
Criando uma function de exemplo para acessar o KeyVault
Para este exemplo estamos usando uma Function de HTTP Trigger, que permite o acesso a function através de um endereço HTTP.
A Secret dentro da function funciona como uma variável de ambiente, então podemos configurar esta variável no portal do Azure, dentro das configurações da Function.
Veja abaixo o código para lermos a variável de ambiente e retornar:
public static class FunctionCofre
{
[FunctionName("FunctionCofre")]
public static async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
ILogger log)
{
return new OkObjectResult($"Valor da Secret: {Environment.GetEnvironmentVariable("valorCofre")}");
}
}
Como a function e o KeyVault estão conectados o valor da Secret dentro da Function será passado como uma variável de ambiente.
Se você estiver executando o código localmente, o valor não vai existir, mas caso precise do valor para debug, uma maneira simples é colocar no arquivo “local.settings.json”. Este arquivo não é enviado na publicação para o Azure.
Para o teste, você precisa publicar a function no Azure!
Criando a variável na Function
Agora dentro da Function no Portal do Azure vamos criar a variável em “Configuration”, adicionando um novo Application Settings com os seguintes dados:
Name: valorCofre
Value: @Microsoft.KeyVault(VaultName=cdsv;SecretName=valorCofre)
O value indica para pegar o valor do Keyvault com nome de “cdsv” e a secret com nome de “valorCofre”
Salvamos e pronto! Agora nossa function busca valores no Azure KeyVault!
Veja o resultado da chamada HTTP a function:
O codigo fonte deste exemplo esta no meu GitHub: https://github.com/carloscds/CSharpSamples/tree/master/FunctionAcessandoKeyVault
Este post, como muitos outros, são o resultado de problemas reais que enfrentamos diariamente. Um especial agradecimento ao meu amigo Thiago Custodio pela colaboração na resolução do problema que originou este post.
Abraços e até a próxima!