¡Ven a la JSConf España 2026! Comprar entradas

Sistema de permisos en Node.js

Cuando ejecutas un programa con Node.js, este tiene mucho más poder del que normalmente somos conscientes. Puede leer archivos, escribir en el sistema, acceder a la red y ejecutar procesos de forma prácticamente ilimitada.

En esta clase vamos a ver por qué esto puede ser un riesgo de seguridad y cómo activar y controlar el sistema de permisos experimental de Node.js para ejecutar programas de forma mucho más segura.

El problema: Node.js tiene acceso casi total al sistema

Por defecto, un script de Node.js tiene los mismos privilegios que el usuario que lo ejecuta. Esto significa que puede:

  • 📂 Leer archivos sensibles del sistema (como claves SSH o configuraciones).
  • 📝 Escribir archivos en cualquier carpeta donde el usuario tenga permiso.
  • 🌐 Acceder a la red para enviar o recibir datos.
  • ⚙️ Ejecutar procesos externos.
  • 🔧 Modificar recursos del sistema operativo.

Todo esto ocurre sin que Node.js te pida confirmación. El único límite real es el sistema de permisos del sistema operativo. Si ejecutas Node como root o administrador, el riesgo es máximo.

Por qué esto puede ser peligroso

Un script malicioso (o una dependencia de terceros comprometida) podría:

  1. Leer tus archivos privados.
  2. Extraer información sensible y enviarla a un servidor externo.
  3. Instalar malware o crear archivos que se ejecuten al iniciar el sistema.

El sistema de permisos de Node.js

A partir de Node.js v20, se introdujo un sistema de permisos experimental que permite restringir qué puede hacer un script. Este sistema se inspira en otros entornos como Deno y permite controlar:

  • Acceso al sistema de archivos (Lectura/Escritura).
  • Acceso a la red.
  • Ejecución de procesos hijos.
  • Uso de worker_threads.

💡 Nota: Al ser una característica experimental, todavía requiere un flag específico para activarse.

Cómo activar el modo de permisos

Para activar este sistema, debes ejecutar Node.js con el flag --experimental-permission.

node --experimental-permission index.js

Al hacerlo, Node entra en un modo restringido donde no puede acceder a nada sin permiso explícito. Si tu script intenta leer un archivo sin haberle dado permiso previo, el proceso fallará inmediatamente con un error de acceso denegado.

Conceder permisos específicos

En lugar de dar “permiso para todo”, la clave es ser específico. Podemos usar flags adicionales para conceder accesos controlados.

Dar permisos de lectura (--allow-fs-read)

Puedes permitir la lectura de forma global (poco recomendado) o limitarla a archivos o carpetas específicas:

# Permitir lectura en todo el sistema (Peligroso)
node --experimental-permission --allow-fs-read="*" index.js

# Permitir lectura solo en una carpeta específica (Recomendado)
node --experimental-permission --allow-fs-read="/Users/proyecto/data/*" index.js

Dar permisos de escritura (--allow-fs-write)

Lo mismo ocurre con la escritura. Puedes restringir dónde puede guardar archivos tu aplicación:

# Permitir escribir solo en la carpeta 'output'
node --experimental-permission --allow-fs-write="./output/*" index.js

Si el script intenta escribir en /etc/hosts o en tu carpeta personal, Node bloqueará la operación.

Otros permisos importantes

Además de archivos, puedes controlar otros aspectos críticos:

  • --allow-net: Controla el acceso a la red (puedes especificar dominios o IPs).
  • --allow-child-process: Permite o deniega la ejecución de comandos del sistema.
  • --allow-worker: Controla si el script puede crear hilos secundarios.

Controlar permisos desde el propio código

Node.js también nos proporciona una API para comprobar en tiempo de ejecución si tenemos un permiso concreto. Esto es muy útil para mostrar errores amigables en lugar de dejar que la aplicación explote.

Usamos el objeto process.permission:

if (process.permission.has('fs.read', '/ruta/archivo.txt')) {
  console.log('✅ Tenemos permiso de lectura')
} else {
  console.error('❌ Error: No tenemos permiso para leer este archivo')
}

Mejorar los mensajes de error

En lugar de recibir errores crípticos del sistema, detectar la falta de permisos nos permite:

  • Mostrar mensajes claros al usuario.
  • Ofrecer alternativas o instrucciones de configuración.
  • Tener un comportamiento más predecible y profesional.

Por qué esto es vital en el Backend

En el desarrollo de servidores y herramientas profesionales:

  • Ejecutas código que a menudo depende de cientos de librerías de terceros.
  • Procesas archivos subidos por usuarios externos.
  • Trabajas en entornos donde la seguridad es la prioridad número uno.

Implementar el principio de mínimo privilegio (dar solo los permisos estrictamente necesarios) reduce drásticamente la superficie de ataque de tu aplicación.

Conclusión

El sistema de permisos de Node.js es una herramienta poderosa que está cambiando cómo entendemos la seguridad en el ecosistema:

  1. ✅ Por defecto, Node.js tiene acceso casi total; activar el modo de permisos es un gran paso en seguridad.
  2. ✅ Es fundamental ser específico y restrictivo con lo que permitimos.
  3. ✅ Usar la API de permisos en el código ayuda a crear aplicaciones más robustas y con mejores mensajes de error.

Dominar estas herramientas te permitirá construir aplicaciones no solo funcionales, sino también seguras y preparadas para entornos de producción exigentes.