Um momento
article thumbnail

Segredos na Nuvem com o Azure Key Vault para Aplicativos Node.js

10/25/2022
Aprenda a armazenar segredos de aplicativos Node.js na nuvem com o Azure Key Vault, traduzido Cofres de Chave.

Aplicativos podem conter configurações sensíveis que não devem ser incluídas em controle de versão. Configurações são, por exemplo, normalmente isoladas em um arquivo com definições de variáveis. Outros usam um arquivo de propriedades no formato JSON. Uma boa prática é isolar mais ainda os valores que são sensíveis em um módulo de segredos.

Uma opção para centralizar e armazenar segredos na nuvem é o Azure Key Vault, traduzido Cofres de Chave. Além de armazenar pares de chave e valor, o Azure Key Vault também lhe permite guardar keys ("chaves") e certificates ("certificados").

Este artigo mostra como armazenar segredos em um aplicativo Node.js usando o Azure Key Vault.

Cofre de Chaves no Portal do Azure

Depois de cadastrar uma conta no Azure e entrar no sistema, procure por Key Vault, ou Cofres de chave em português.

Clique + Criar. Escolha uma assinatura e um grupo de recursos (crie se não tiver um). Digite o nome para o cofre de chaves. Escolha a região e o esquema de preço ("Tipo de preço"). Se quiser modificar as outras opções, sinta-se à vontade. Clique Próxima.

Na aba de Política de accesso, pode pular porque vamos configurar depois. Clique Próxima. Continue a clicar Próxima até chegar à aba de Revisar + criar. Verifique que tudo está nos conformes e finalmente clique Criar.

Vá para a página do cofre e clique Segredos na barra lateral.

Segredos no Azure Key Vault

Clique Gerar/Importar para adicionar um novo segredo. Escreva o nome e o valor secreto. Conclua com o clique de Criar.

Criar um Segredo no Azure Key Vault

Para acessar o cofre de um aplicativo, precisamos de credenciais. Vamos ver sobre isso na próxima seção.

Registro de Aplicativo no Azure

O cofre vai precisar de um registro para o qual habilitar a leitura dos segredos. No Portal do Azure, procure por App Registrations, traduzido "Registros de aplicativo".

Clique + Novo registro. Digite um nome para o registro de aplicativo. Lembre-se desse nome pois depois vamos precisar dele para associar à permissão de leitura do cofre. Deixe as configurações padrão ou mude ao seu gosto. Finalize com o clique de Registrar.

Na página do novo registro de aplicativo, escolha Certificados e segredos na barra lateral. Na aba de Segredos do cliente, clique + Novo segredo do cliente. Dê um nome ao segredo do cliente. Finalize ao clicar Adicionar.

Anote o valor do segredo do cliente (client secret) pois ele não será exibido novamente.

Copie também o ID secreto (client id; esse pode ser visto novamente).

Clique Visão geral na barra lateral da página do registro de aplicativo e copie o ID do diretório (locatário), traduzido de directory (ou tenant) id. Precisaremos desses três valores para conectar ao cofre de chaves partindo do Node.js.

Segredos de um Registro de Aplicativo no Azure

Políticas de Acesso do Cofre

Agora, volte à página do Cofre de Chaves. Na barra lateral, clique Políticas de acesso e em seguida clique + Criar.

A primeira seção lhe permite definir que permissões específicas o registro de aplicativo terá. Seguiremos o Princípio de Menor Privilégio ("least privilege") e só permitiremos Obter e Listar para a coluna de Permissões do segredo. O primeiro lhe permite ler um segredo enquanto o segundo lhe permite obter a lista de segredos. Se você precisar de mais permissões no futuro, dá para editá-las depois da criação. De qualquer maneira, clique Próxima.

Digite na caixa de texto o nome do registro de aplicativo que foi criado anteriormente. Clique Próxima até chegar em Revisar + criar. Verifique os dados e clique Criar.

Políticas de acesso no Azure Key Vault

Como Acessar os Segredos do Cofre de Chaves no Node.js

Agora veremos como escrever o código em Node.js (JavaScript no servidor) para acessar os segredos do cofre de chaves. Com o Node.js e o NPM instalado, faça o seguinte:

No terminal, instale os seguintes módulos de NPM:

npm install @azure/identity @azure/keyvault-secrets

O módulo @azure/identity será usado para gerar um objeto de credencial que será usado por um cliente de segredos do módulo @azure/keyvault-secrets.

Vamos para o código em Node.js:

const AzureIdentity = require('@azure/identity');
const AzureKeyvaultSecrets = require('@azure/keyvault-secrets');

// Pegue os valores que foram copiados anteriormente na parte do registro de aplicativo. Esses valores podem ser obtidos localmente de um arquivo de configuração ou da nuvem de um serviço de configuração como o Azure App Configuration. Recomendo não incluir esse tipo de informação diretamente no código no controle de versão.
const AzureTenantId = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx';
const AzureClientId = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx';
const AzureClientSecret = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';

const credencial = new AzureIdentity.ClientSecretCredential(
  AzureTenantId,
  AzureClientId,
  AzureClientSecret
);

No exemplo acima, importamos os módulos necessários para criar uma credencial e para criar um cliente de segredos. A maneira usada aqui para autenticar é com um ClientSecretCredential: forneça o id do diretório (locatário), o id do cliente e o segredo do cliente. Em inglês, AzureTenantId, AzureClientId e AzureClientSecret, respectivamente.

Há outras maneiras de se autenticar, especialmente se você já tiver um aplicativo rodando na nuvem do Azure, mas nesse artigo focarei na maneira de autenticação usada acima. Recomendo ler a documentação do Azure para adaptar o exemplo para outro método.

Agora, vamos criar um cliente para poder acessar o cofre de chaves:

// Precisamos saber do nome do cofre de chaves para acessá-lo. Recomendo incluir esse valor no seu módulo de configuração.
const keyVaultName = 'meu-cofre-de-chaves';

const clienteDeSegredo = new AzureKeyvaultSecrets.SecretClient(`https://${keyVaultName}.vault.azure.net`, credencial);

Cria-se um cliente de segredo, SecretClient, ao especificar a URL do cofre de chaves e a credencial. O endereço do cofre pode ser verificado na página do cofre, na Visão geral.

Agora, mostrarei uma maneira de se resgatar todos os segredos atráves de um loop:

for await (const propriedadesDeSegredo of clienteDeSegredo.listPropertiesOfSecrets()) {
  const segredoDaNuvem = await clienteDeSegredo.getSecret(propriedadesDeSegredo.name);
  // Faça o que quiser com o valor aqui:
  console.log(segredoDaNuvem.value);
}

No exemplo acima, o método listPropertiesOfSecrets lhe retorna uma lista de propriedades de segredos que podem ser usados em uma repetição. O valor retornado do método é uma promessa, então precisamos usar o for await.

Para cada propriedadesDeSegredo, podemos acessar o nome do segredo pela propriedade propriedadesDeSegredo.name.

No caso do valor, não dá para obtê-lo diretamente do propriedadesDeSegredo. Temos que chamar a API do cofre de novo com o método getSecret, que retorna um objeto com informações do segredo específico. O nome do segredo tem que ser fornecido como argumento para a função getSecret.

Como o getSecret retorna uma promessa, temos que pegar o valor resolvido com o await. Colocamos numa variável chamada segredoDaNuvem. Daí é só acessar o valor do segredo com segredoDaNuvem.value.

Integração do Azure Key Vault em um Aplicativo Existente

Há várias maneiras de integrar o uso do Cofres de Chave do Azure no seu aplicativo. Deixo aqui umas sugestões.

Em ambos o exemplos citados abaixo, se cria um arquivo para um módulo central de segredos que pode ser chamado a qualquer hora para obter os valores. A implementação específica, se for com funções, objeto primitivo, ou classe, depende do seu gosto.

Se você quiser economizar nas chamadas da API, você pode carregar os segredos uma vez só na hora do aplicativo iniciar. Nesse caso, os valores do segredos são armazenados na memória enquanto o aplicativo roda. Para recarregar os valores, você teria que reiniciar o aplicativo. Para certos usos, talvez você não queira manter os valores na memória constantemente, então veja o próximo exemplo.

Outra maneira de se integrar o Azure Key Vault é sempre carregar os valores na hora que eles forem requeridos. Esse método é mais caro, pois faz uma chamada de API a cada vez que um valor é requerido. É provavelmente mais seguro em termos de não manter o valor na memória constantemente (dependendo de como o seu aplicativo foi escrito) pois só aparece e é usado só quando for requerido.

Cabe a você entender o seu aplicativo, os casos de uso e o nível de tolerância de risco. Mostramos aqui apenas uns exemplos para estimular a mente com idéias. Como sempre, recomendo aprimorar sempre naquilo que aprendeu e adaptar as idéias ao seu contexto.

Gostou da aula? 😆👍
Apoie nosso trabalho com uma doação: