Permisos
Los permisos se pueden usar para controlar a qué recursos del sistema tiene acceso el proceso de Node.js o qué acciones puede realizar el proceso con esos recursos.
- Permisos basados en procesos controlan el acceso del proceso de Node.js a los recursos. El recurso puede ser totalmente permitido o denegado, o las acciones relacionadas con él pueden ser controladas. Por ejemplo, las lecturas del sistema de archivos pueden ser permitidas mientras que se deniegan las escrituras. Esta característica no protege contra código malicioso. De acuerdo con la Política de seguridad de Node.js, Node.js confía en cualquier código que se le pida ejecutar.
El modelo de permisos implementa un enfoque de "cinturón de seguridad", que evita que el código de confianza cambie involuntariamente los archivos o use recursos cuyo acceso no ha sido explícitamente concedido. No proporciona garantías de seguridad en presencia de código malicioso. El código malicioso puede eludir el modelo de permisos y ejecutar código arbitrario sin las restricciones impuestas por el modelo de permisos.
Si encuentra una posible vulnerabilidad de seguridad, consulte nuestra Política de seguridad.
Permisos basados en procesos
Modelo de permisos
[Estable: 2 - Estable]
Estable: 2 Estabilidad: 2 - Estable.
El Modelo de permisos de Node.js es un mecanismo para restringir el acceso a recursos específicos durante la ejecución. La API existe detrás de una bandera --permission
que cuando se habilita, restringirá el acceso a todos los permisos disponibles.
Los permisos disponibles están documentados por la bandera --permission
.
Al iniciar Node.js con --permission
, la capacidad de acceder al sistema de archivos a través del módulo fs
, generar procesos, usar node:worker_threads
, usar complementos nativos, usar WASI y habilitar el inspector de tiempo de ejecución estará restringida.
$ node --permission index.js
Error: Access to this API has been restricted
at node:internal/main/run_main_module:23:47 {
code: 'ERR_ACCESS_DENIED',
permission: 'FileSystemRead',
resource: '/home/user/index.js'
}
2
3
4
5
6
7
8
Permitir el acceso a la generación de un proceso y la creación de hilos de trabajador se puede hacer usando --allow-child-process
y --allow-worker
respectivamente.
Para permitir complementos nativos al usar el modelo de permisos, use la bandera --allow-addons
. Para WASI, use la bandera --allow-wasi
.
API de Tiempo de Ejecución
Al habilitar el Modelo de Permisos a través del flag --permission
, se agrega una nueva propiedad permission
al objeto process
. Esta propiedad contiene una función:
permission.has(scope[, reference])
Llamada a la API para verificar los permisos en tiempo de ejecución (permission.has()
)
process.permission.has('fs.write'); // true
process.permission.has('fs.write', '/home/rafaelgss/protected-folder'); // true
process.permission.has('fs.read'); // true
process.permission.has('fs.read', '/home/rafaelgss/protected-folder'); // false
2
3
4
5
Permisos del Sistema de Archivos
El Modelo de Permisos, por defecto, restringe el acceso al sistema de archivos a través del módulo node:fs
. No garantiza que los usuarios no puedan acceder al sistema de archivos por otros medios, como a través del módulo node:sqlite
.
Para permitir el acceso al sistema de archivos, utilice los flags --allow-fs-read
y --allow-fs-write
:
$ node --permission --allow-fs-read=* --allow-fs-write=* index.js
Hello world!
2
Los argumentos válidos para ambos flags son:
*
- Para permitir todas las operacionesFileSystemRead
oFileSystemWrite
, respectivamente.- Rutas delimitadas por comas (
,
) para permitir solo las operacionesFileSystemRead
oFileSystemWrite
coincidentes, respectivamente.
Ejemplo:
--allow-fs-read=*
- Permitirá todas las operacionesFileSystemRead
.--allow-fs-write=*
- Permitirá todas las operacionesFileSystemWrite
.--allow-fs-write=/tmp/
- Permitirá el accesoFileSystemWrite
a la carpeta/tmp/
.--allow-fs-read=/tmp/ --allow-fs-read=/home/.gitignore
- Permite el accesoFileSystemRead
a la carpeta/tmp/
y la ruta/home/.gitignore
.
También se admiten comodines:
--allow-fs-read=/home/test*
permitirá el acceso de lectura a todo lo que coincida con el comodín. por ejemplo:/home/test/file1
o/home/test2
Después de pasar un carácter comodín (*
), todos los caracteres posteriores se ignorarán. Por ejemplo: /home/*.js
funcionará de manera similar a /home/*
.
Cuando se inicializa el modelo de permisos, agregará automáticamente un comodín (*) si el directorio especificado existe. Por ejemplo, si /home/test/files
existe, se tratará como /home/test/files/*
. Sin embargo, si el directorio no existe, el comodín no se agregará y el acceso se limitará a /home/test/files
. Si desea permitir el acceso a una carpeta que aún no existe, asegúrese de incluir explícitamente el comodín: /my-path/folder-do-not-exist/*
.
Restricciones del modelo de permisos
Existen restricciones que debe conocer antes de utilizar este sistema:
El modelo no hereda a un proceso de nodo hijo o un hilo de trabajo.
Cuando se utiliza el modelo de permisos, las siguientes características estarán restringidas:
- Módulos nativos
- Proceso hijo
- Hilos de trabajo
- Protocolo de inspector
- Acceso al sistema de archivos
- WASI
El modelo de permisos se inicializa después de que se configura el entorno de Node.js. Sin embargo, ciertas banderas como
--env-file
o--openssl-config
están diseñadas para leer archivos antes de la inicialización del entorno. Como resultado, tales banderas no están sujetas a las reglas del modelo de permisos. Lo mismo se aplica a las banderas de V8 que se pueden establecer a través del tiempo de ejecución mediantev8.setFlagsFromString
.Los motores OpenSSL no se pueden solicitar en tiempo de ejecución cuando el modelo de permisos está habilitado, lo que afecta a los módulos crypto, https y tls integrados.
Las extensiones cargables en tiempo de ejecución no se pueden cargar cuando el modelo de permisos está habilitado, lo que afecta al módulo sqlite.
El uso de descriptores de archivos existentes a través del módulo
node:fs
omite el modelo de permisos.
Limitaciones y problemas conocidos
- Los enlaces simbólicos se seguirán incluso a ubicaciones fuera del conjunto de rutas a las que se ha concedido acceso. Los enlaces simbólicos relativos pueden permitir el acceso a archivos y directorios arbitrarios. Al iniciar aplicaciones con el modelo de permisos habilitado, debe asegurarse de que ninguna ruta a la que se haya concedido acceso contenga enlaces simbólicos relativos.