Aumente a segurança da sua aplicação com Azure Key Vault
Tags: azure, keyvault, cloudnative, dotnet
Published: 2023-01-17 16:35:34

Nesse artigo vamos aprender, de forma simples e objetiva, a criar um segredo no serviço Key Vault, oferecido pelo Microsoft Azure.

Antes, uma breve explicação sobre o Azure Key Vault:
---
Azure Key Vault, em português Azure cofre de chaves, é um serviço em núvem do Microsoft Azure usado para centralizar o armazenamento e gerenciamento de chaves de API, chaves criptográficas, segredos e certificados que precisam ser controlados de forma simples e rígida.

Ao criar o serviço temos duas opções de armazenamento, sendo a camada standard e a premium. Na primeira camada, todo e qualquer segredo/chave/certificado será protegido por um software de segurança. A segunda camada, além de trazer a mesma segurança da primeira, da a opção de proteger **chaves** por módulo de segurança de hardware (Hardware Security Module).

>O **(Hardware Security Module)** oferecido pela camada premium é responsável por trazer uma camada extra de segurança criptográfica para as **chaves** {% embed https://learn.microsoft.com/pt-br/azure/key-vault/keys/about-keys %}

O administrador ou proprietário do Key Vault tem controle absoluto sobre o cofre. É possível criar novas chaves, altera-las, definir uma data de ativação e/ou expiração, monitorar os logs via gráficos através do Metrics, definir qual usuário ou aplicativo poderá acessar/administrar determinada chave, dentre outras funções.

Mão na massa
---
Temos uma aplicação (Azure Function) implantada no Azure que faz consultas a uma base de dados. Atualmente, no arquivo de configuração da aplicação, temos a string de conexão em seu valor original. 
Vamos criar um serviço Azure Key Vault, gerar um segredo contendo o valor original da string de conexão e, no arquivo de configuração da aplicação, vamos substituir o valor original da string de conexão pelo segredo gerado no Key Vault.


>- Para este exemplo, você deve possuir
 - uma aplicação no ar
 - uma assinatura no Azure


1 - Ao acessar o menú *Configuration* do nosso app, podemos ver nossa string de conexão com seu valor original.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d2ysxdow2ghr81u7thh4.jpg)

1.1 - Ao acessar nosso Key Vault, a opção *Objects* nos mostra nossas chaves, segredos e certificados. Como ainda não possuimos nenhum segredo gerado, vamos gerar um indo em *+ Generate/Import*

> Para criar o seu Azure Key Vault, selecione um grupo de recurso, procure por Key Vault e defina um nome, escolha uma região e selecione a camada que lhe atende. 

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sbunfnk86nlmwxm6veqv.jpg)

1.2 - Defina um nome para sua string de conexão e cole em _Secret value_ o valor original da sua string de conexão. Repare que é nesse momento que optamos ou não por uma data de ativação/expiração.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3trcwf9z36seq4l37m2d.jpg)

1.3 - Após termos nosso segredo gerado e clicarmos sobre ele, vamos notar que é possível gerarmos outras versões do mesmo segredo porém com valores e datas de ativação/expiração diferentes.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/c25cabsm8y1uoaofhrk5.jpg)

1.4 - Ao clicarmos sobre a versão do nosso segredo, podemos visualizar informações importantes, porém a mais relevante é a _Secret identifier_. Veja que é com essa URL que teremos acesso ao nosso segredo.

> Formato da URL gerada pelo Key Vault: _https://{nome-cofre}.vault.azure.net/segredo/nome-segredo/versão_ 

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cn67c723wpawl4pftl9s.jpg)

Nesse momento temos nosso segredo gerado. O próximo passo é darmos permissão ao nosso app para que ele tenha permissão para acessar o valor do segredo. 
Veja que interessante e o quão seguro é usar o Key Vault! Além de não mostrarmos o valor original da nossa string de conexão, ainda devemos dar permissão para que o app que vai consumir o segredo possar ler seu real valor!

Então vamos dar permissão ao app.

2 - Para que o nosso Key Vault consiga 'enxergar' a nossa aplicação, a mesma deve estar visível a outros serviços internos do Azure. Para isso confirme que este detalhe esteja habilitado.
No menu esquerdo da sua aplicação procure por Identity. Certifique-se que o seu Status seja On.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nid7ai0fisxr38cjf5zl.jpg)

2.1 - Ainda no nosso Key Vault, no menú esquerdo, vá em *Access policies*. Podemos ver que o administrador/criador do serviço possui permissão geral sobre o segredo. Agora vamos criar uma nova permissão. Clique em *Create*.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ojn6r92bb6moryvcklsu.jpg)

2.2 - Na aba *Permissions* podemos configurar qual tipo de permissão queremos. Se tratando de uma string de conexão, optei por liberar apenas permissão de leitura.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6b45g523p2n174k80u6q.jpg)

2.3 - Na aba *Principal* podemos procurar pelo app que terá permissão de leitura do nosso segredo. Veja que nessa aba podemos procurar por um usuário para ter acesso ao segredo, e na aba seguinte *Application (optional)* podemos procurar por um app desse usuário.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qtafw82sw33m7qehggek.jpg)


2.4 - Após finalizado o processo de permissão, voltamos a página do *Access policies* e vemos que nosso app teve sua permissão criada com sucesso.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rqt7kkrf73sklcx84g00.jpg)


Substituindo nosso valor original da string de conexão pela URL do nosso segredo.
---
3 - Após ter copiado a URL do nosso segredo, volte ao seu app e acesse *Configuration*. Clique sobre a opção _Advanced edit_ e substitua o valor original da string de conexão pela URL gerada pelo segredo.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cpnx6jo9ats8om08xc06.jpg)

```
 {
    "name": "ConnectionString",
    "value": "@Microsoft.KeyVault(SecretUri=https://authappkeyvault.vault.azure.net/secrets/ConnectionString/74oi52a2c95f4a87e4d9ee15d4e95aa0a82cc9f4)",
    "slotSetting": false
  }
```

> Perceba que além da URL gerada pelo segredo, a Microsoft exige que seja incluído uma sintaxe de referência _@Microsoft.KeyVault(SecretUri=https://myvault.vault.azure.net/secrets/mysecret/)_.
{% embed https://learn.microsoft.com/pt-br/azure/app-service/app-service-key-vault-references?tabs=azure-cli %}

Após concluídos esses passos, o processo está completo.
Observe que é um processo muito simples e que entrega uma segurança gigantesca. Mais um ponto pro Microsoft Azure.