Skip to content

Permissions

Les permissions peuvent être utilisées pour contrôler à quelles ressources système le processus Node.js a accès ou quelles actions le processus peut entreprendre avec ces ressources.

  • Les permissions basées sur le processus contrôlent l'accès du processus Node.js aux ressources. La ressource peut être totalement autorisée ou refusée, ou les actions qui y sont liées peuvent être contrôlées. Par exemple, les lectures du système de fichiers peuvent être autorisées tout en refusant les écritures. Cette fonctionnalité ne protège pas contre le code malveillant. Conformément à la Politique de sécurité de Node.js, Node.js fait confiance à tout code qu'il est invité à exécuter.

Le modèle de permissions met en œuvre une approche de type "ceinture de sécurité", qui empêche le code de confiance de modifier involontairement des fichiers ou d'utiliser des ressources dont l'accès n'a pas été explicitement accordé. Il ne fournit pas de garanties de sécurité en présence de code malveillant. Un code malveillant peut contourner le modèle de permissions et exécuter du code arbitraire sans les restrictions imposées par le modèle de permissions.

Si vous trouvez une faille de sécurité potentielle, veuillez consulter notre Politique de sécurité.

Permissions basées sur le processus

Modèle de permissions

[Stable: 2 - Stable]

Stable: 2 Stabilité: 2 - Stable.

Le modèle de permissions de Node.js est un mécanisme permettant de restreindre l'accès à des ressources spécifiques pendant l'exécution. L'API existe derrière un drapeau --permission qui, lorsqu'il est activé, restreint l'accès à toutes les permissions disponibles.

Les permissions disponibles sont documentées par le drapeau --permission.

Lorsque Node.js démarre avec --permission, la possibilité d'accéder au système de fichiers via le module fs, de lancer des processus, d'utiliser node:worker_threads, d'utiliser des modules complémentaires natifs, d'utiliser WASI et d'activer l'inspecteur d'exécution sera restreinte.

bash
$ 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'
}

L'autorisation de lancer un processus et de créer des threads de travail peut être effectuée en utilisant respectivement --allow-child-process et --allow-worker.

Pour autoriser les modules complémentaires natifs lors de l'utilisation du modèle de permissions, utilisez le drapeau --allow-addons. Pour WASI, utilisez le drapeau --allow-wasi.

API d'exécution

Lorsque le modèle de permission est activé via l'indicateur --permission, une nouvelle propriété permission est ajoutée à l'objet process. Cette propriété contient une fonction :

permission.has(scope[, reference])

Appel d'API pour vérifier les permissions lors de l'exécution (permission.has())

js
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

Permissions du système de fichiers

Le modèle de permission, par défaut, restreint l'accès au système de fichiers via le module node:fs. Il ne garantit pas que les utilisateurs ne pourront pas accéder au système de fichiers par d'autres moyens, comme via le module node:sqlite.

Pour autoriser l'accès au système de fichiers, utilisez les indicateurs --allow-fs-read et --allow-fs-write :

bash
$ node --permission --allow-fs-read=* --allow-fs-write=* index.js
Hello world!

Les arguments valides pour les deux indicateurs sont les suivants :

  • * - Pour autoriser toutes les opérations FileSystemRead ou FileSystemWrite, respectivement.
  • Chemins délimités par une virgule (,) pour autoriser uniquement les opérations FileSystemRead ou FileSystemWrite correspondantes, respectivement.

Exemple :

  • --allow-fs-read=* - Autorise toutes les opérations FileSystemRead.
  • --allow-fs-write=* - Autorise toutes les opérations FileSystemWrite.
  • --allow-fs-write=/tmp/ - Autorise l'accès FileSystemWrite au dossier /tmp/.
  • --allow-fs-read=/tmp/ --allow-fs-read=/home/.gitignore - Autorise l'accès FileSystemRead au dossier /tmp/ et au chemin /home/.gitignore.

Les caractères génériques sont également pris en charge :

  • --allow-fs-read=/home/test* autorisera l'accès en lecture à tout ce qui correspond au caractère générique. Par exemple : /home/test/file1 ou /home/test2

Après avoir passé un caractère générique (*), tous les caractères suivants seront ignorés. Par exemple : /home/*.js fonctionnera de manière similaire à /home/*.

Lorsque le modèle de permission est initialisé, il ajoutera automatiquement un caractère générique (_) si le répertoire spécifié existe. Par exemple, si /home/test/files existe, il sera traité comme /home/test/files/_. Toutefois, si le répertoire n'existe pas, le caractère générique ne sera pas ajouté et l'accès sera limité à /home/test/files. Si vous souhaitez autoriser l'accès à un dossier qui n'existe pas encore, assurez-vous d'inclure explicitement le caractère générique : /my-path/folder-do-not-exist/\*.

Contraintes du modèle d'autorisations

Il y a des contraintes que vous devez connaître avant d'utiliser ce système :

  • Le modèle n'est pas hérité par un processus enfant ou un thread de travail.

  • Lors de l'utilisation du modèle d'autorisations, les fonctionnalités suivantes seront restreintes :

    • Modules natifs
    • Processus enfants
    • Threads de travail
    • Protocole d'inspecteur
    • Accès au système de fichiers
    • WASI
  • Le modèle d'autorisations est initialisé une fois que l'environnement Node.js est configuré. Cependant, certains drapeaux tels que --env-file ou --openssl-config sont conçus pour lire des fichiers avant l'initialisation de l'environnement. Par conséquent, ces drapeaux ne sont pas soumis aux règles du modèle d'autorisations. Il en va de même pour les drapeaux V8 qui peuvent être définis lors de l'exécution via v8.setFlagsFromString.

  • Les moteurs OpenSSL ne peuvent pas être demandés lors de l'exécution lorsque le modèle d'autorisations est activé, ce qui affecte les modules crypto, https et tls intégrés.

  • Les extensions chargeables au moment de l'exécution ne peuvent pas être chargées lorsque le modèle d'autorisations est activé, ce qui affecte le module sqlite.

  • L'utilisation de descripteurs de fichiers existants via le module node:fs contourne le modèle d'autorisations.

Limitations et problèmes connus

  • Les liens symboliques seront suivis, même vers des emplacements en dehors de l'ensemble de chemins auxquels l'accès a été accordé. Les liens symboliques relatifs peuvent permettre l'accès à des fichiers et répertoires arbitraires. Lorsque vous démarrez des applications avec le modèle d'autorisations activé, vous devez vous assurer qu'aucun chemin auquel l'accès a été accordé ne contient de liens symboliques relatifs.