Node.js: Gestionar secretos

Cómo gestionar secretos con Node.js

👋 ¡Bienvenido a la documentación de Stackhero!

Stackhero ofrece una solución nube de Node.js lista para usar que proporciona una serie de beneficios, incluyendo:

  • Despliegue su aplicación en segundos con un simple git push.
  • Use su propio nombre de dominio y benefíciese de la configuración automática de certificados HTTPS para una mayor seguridad.
  • Disfrute de la tranquilidad con copias de seguridad automáticas, actualizaciones con un clic, y precios sencillos, transparentes y predecibles.
  • Obtenga un rendimiento óptimo y una seguridad robusta gracias a una VM privada y dedicada.

Ahorre tiempo y simplifique su vida: ¡solo toma 5 minutos probar la solución de alojamiento en la nube de Node.js de Stackhero!

Cuando su proyecto Node.js interactúa con una base de datos, almacenamiento de objetos o una API externa, es fundamental almacenar las credenciales, como nombres de usuario, contraseñas o tokens, de forma segura. Estas credenciales suelen denominarse "secretos". Mantener sus secretos confidenciales es esencial para garantizar la seguridad de su aplicación.

Al principio, podría pensar en escribir sus credenciales directamente en el código, de la siguiente manera:

// Conexión a una base de datos PostgreSQL
const pg = new Client({
  host: '<XXXXXX>.stackhero-network.com',
  user: 'admin',
  password: 'myPassword',
  database: 'admin'
});

Sin embargo, este enfoque no es seguro. Sus secretos podrían acabar fácilmente en su repositorio Git, haciéndolos visibles para cualquier persona con acceso. Incluso si piensa que solo usted tiene acceso, es como dejar una nota adhesiva con sus contraseñas en el monitor y esperar que nadie la vea. Esto puede derivar en problemas de seguridad graves.

Además, incluir secretos directamente en el código dificulta la gestión fluida de diferentes entornos, como desarrollo y producción.

Una de las mejores prácticas más extendidas en el sector es almacenar los secretos en variables de entorno.

Las variables de entorno se definen fuera del código y se establecen antes de iniciar Node.js. La idea es definir todos los secretos mediante variables de entorno, para que nunca estén codificados directamente en la aplicación.

Puede definir una variable de entorno al inicio del comando Node.js, así:

MY_PASSWORD=myDevelopmentPassword node app.js

Este comando crea una variable llamada MY_PASSWORD con el valor myDevelopmentPassword. El formato es sencillo: <CLAVE>=<valor>.

Por convención, las variables de entorno se escriben en mayúsculas. Tenga en cuenta que solo pueden contener cadenas de texto, no arrays ni objetos.

Dentro de su archivo app.js, puede acceder a la variable de entorno usando process.env, de la siguiente manera:

console.log(process.env.MY_PASSWORD);

Esto mostrará myDevelopmentPassword.

Ahora, su contraseña está definida fuera del código. Así se evita que acabe accidentalmente en su repositorio Git.

Si utiliza Stackhero en un entorno de producción, puede definir una nueva variable de entorno llamada MY_PASSWORD con el valor myProductionPassword directamente desde el panel de control de su servicio Node.js. Esto facilita la gestión entre entornos.

Ejemplo de configuración de Node.js en el panel de StackheroEjemplo de configuración de Node.js en el panel de Stackhero

Con este método, la contraseña ya no está almacenada en el código y puede utilizar credenciales diferentes para los entornos de desarrollo y producción de forma sencilla.

En proyectos reales, a menudo es necesario gestionar varios secretos. Por ejemplo, para conectarse a una base de datos puede necesitar un hostname, un nombre de usuario y una contraseña.

Gestionar un solo secreto es sencillo, pero manejar varios puede resultar incómodo rápidamente. Imagine iniciar la aplicación con un comando como este:

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

Esto se vuelve difícil de leer y mantener. En producción, probablemente necesitará aún más variables, lo que hace que este enfoque no sea práctico.

Aquí es donde la librería dotenv resulta útil.

Con dotenv, puede almacenar los secretos en un archivo separado llamado .env.

Para empezar, instale la librería dotenv ejecutando:

npm install dotenv

A continuación, cree un archivo .env para guardar sus variables:

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

Para mantener sus secretos protegidos, asegúrese de que el archivo .env no se añada a su repositorio Git. Puede hacerlo añadiéndolo a su archivo .gitignore:

echo ".env" >> .gitignore

Por último, cargue la librería dotenv al principio de su archivo app.js:

require("dotenv").config();

Con esta configuración, cuando inicie la aplicación con node app.js, dotenv leerá automáticamente el archivo .env en su máquina de desarrollo. En producción, no necesita el archivo .env. Las variables de entorno se obtienen directamente de la configuración de su servicio Node.js, que puede gestionar desde el panel de Stackhero.

Ahora que hemos visto la teoría, veamos un ejemplo real.

Puede encontrar un ejemplo completo y funcional aquí: https://github.com/stackhero-io/dotenvWithNodejs

Con estas técnicas, podrá gestionar sus secretos de forma flexible y segura, haciendo que el proceso sea sencillo y eficiente.