Node.js: Gerir segredos

Como gerir segredos com Node.js

👋 Bem-vindo à documentação do Stackhero!

A Stackhero oferece uma solução Node.js cloud pronta a usar que proporciona uma série de benefícios, incluindo:

  • Implemente a sua aplicação em segundos com um simples git push.
  • Utilize o seu próprio nome de domínio e beneficie da configuração automática de certificados HTTPS para uma segurança reforçada.
  • Desfrute de tranquilidade com backups automáticos, atualizações com um clique, e preços simples, transparentes e previsíveis.
  • Obtenha desempenho ótimo e segurança robusta graças a uma VM privada e dedicada.

Poupe tempo e simplifique a sua vida: só leva 5 minutos para experimentar a solução de hospedagem cloud Node.js da Stackhero!

Quando o seu projeto Node.js interage com uma base de dados, object storage ou uma API externa, é fundamental armazenar credenciais, como nomes de utilizador, palavras-passe ou tokens, de forma segura. Estas credenciais são frequentemente chamadas de "segredos". Manter os seus segredos confidenciais é essencial para garantir a segurança da sua aplicação.

Inicialmente, pode considerar escrever as suas credenciais diretamente no código, como neste exemplo:

// Ligação a uma base de dados PostgreSQL
const pg = new Client({
  host: '<XXXXXX>.stackhero-network.com',
  user: 'admin',
  password: 'myPassword',
  database: 'admin'
});

No entanto, esta abordagem não é segura. Isto porque os seus segredos podem facilmente acabar no seu repositório Git, ficando visíveis para qualquer pessoa com acesso. Mesmo que pense que só você tem acesso, é um pouco como deixar um Post-it com as suas palavras-passe colado no monitor e esperar que ninguém repare. Isto pode acabar por causar sérios problemas de segurança.

Além disso, ter segredos hard-coded dificulta a gestão de diferentes ambientes, como desenvolvimento e produção, de forma eficiente.

Uma das melhores práticas mais comuns na indústria é armazenar segredos em variáveis de ambiente.

As variáveis de ambiente são definidas fora do seu código e são configuradas antes do arranque do Node.js. A ideia é definir todos os seus segredos através de variáveis de ambiente, para que nunca fiquem escritos diretamente na sua aplicação.

Pode definir uma variável de ambiente ao iniciar o seu comando Node.js, desta forma:

MY_PASSWORD=myDevelopmentPassword node app.js

Este comando cria uma variável chamada MY_PASSWORD com o valor myDevelopmentPassword. O formato é simples: <KEY>=<valor>.

Por convenção, as variáveis de ambiente são escritas em maiúsculas. É importante notar que as variáveis de ambiente apenas podem conter strings, não arrays nem objetos.

Dentro do seu ficheiro app.js, pode aceder à sua variável de ambiente usando process.env, assim:

console.log(process.env.MY_PASSWORD);

Isto irá mostrar myDevelopmentPassword.

Agora, a sua palavra-passe está definida fora do código. Isto ajuda a garantir que não será acidentalmente incluída no seu repositório Git.

Se estiver a utilizar Stackhero num ambiente de produção, pode definir uma nova variável de ambiente chamada MY_PASSWORD com o valor myProductionPassword diretamente no painel de controlo do seu serviço Node.js. Isto facilita a gestão entre ambientes de forma fluida.

Exemplo de configuração Node.js no painel StackheroExemplo de configuração Node.js no painel Stackhero

Com esta configuração, a sua palavra-passe já não está guardada no código e pode facilmente utilizar credenciais diferentes para os ambientes de desenvolvimento e produção.

Em projetos reais, é comum ter de gerir múltiplos segredos. Por exemplo, ligar-se a uma base de dados pode exigir um hostname, nome de utilizador e palavra-passe.

Gerir um único segredo é simples, mas lidar com vários rapidamente se torna pouco prático. Imagine iniciar a sua aplicação com um comando como este:

POSTGRESQL_HOST=<XXXXXX>.stackhero-network.com POSTGRESQL_USER=admin POSTGRESQL_PASSWORD=myPassword node app.js

Isto rapidamente se torna difícil de ler e manter. Em produção, poderá precisar de ainda mais variáveis, tornando esta abordagem pouco prática.

É aqui que a biblioteca dotenv pode ajudar.

Com o dotenv, pode guardar os seus segredos num ficheiro separado chamado .env.

Para começar, instale a biblioteca dotenv executando:

npm install dotenv

De seguida, crie um ficheiro .env para guardar as suas variáveis:

POSTGRESQL_HOST=<XXXXXX>.stackhero-network.com
POSTGRESQL_USER=admin
POSTGRESQL_PASSWORD=myPassword

Para manter os seus segredos seguros, certifique-se de que o ficheiro .env não é adicionado ao seu repositório Git. Pode fazê-lo adicionando-o ao seu ficheiro .gitignore:

echo ".env" >> .gitignore

Por fim, carregue a biblioteca dotenv no topo do seu ficheiro app.js:

require("dotenv").config();

Com esta configuração, ao iniciar a sua aplicação com node app.js, o dotenv lê automaticamente o seu ficheiro .env na sua máquina de desenvolvimento. Em produção, não precisa do ficheiro .env. As variáveis de ambiente são obtidas diretamente da configuração do seu serviço Node.js, que pode gerir através do painel Stackhero.

Agora que já abordámos a teoria, vejamos um exemplo real.

Pode encontrar um exemplo completo e funcional aqui: https://github.com/stackhero-io/dotenvWithNodejs

Com estas técnicas, pode gerir os seus segredos de forma flexível e segura, tornando o processo simples e eficiente.