Skip to content

Berechtigungen

Berechtigungen können verwendet werden, um zu steuern, auf welche Systemressourcen der Node.js-Prozess Zugriff hat oder welche Aktionen der Prozess mit diesen Ressourcen ausführen kann.

  • Prozessbasierte Berechtigungen steuern den Zugriff des Node.js-Prozesses auf Ressourcen. Der Zugriff auf die Ressource kann vollständig erlaubt oder verweigert werden, oder Aktionen im Zusammenhang mit ihr können gesteuert werden. Beispielsweise können Dateisystemlesezugriffe erlaubt werden, während Schreibzugriffe verweigert werden. Diese Funktion schützt nicht vor bösartigem Code. Gemäß der Node.js Sicherheitsrichtlinie vertraut Node.js jedem Code, den es ausführen soll.

Das Berechtigungsmodell implementiert einen "Sicherheitsgurt"-Ansatz, der verhindert, dass vertrauenswürdiger Code unbeabsichtigt Dateien ändert oder Ressourcen verwendet, für die der Zugriff nicht explizit gewährt wurde. Es bietet keine Sicherheitsgarantien bei Vorhandensein von bösartigem Code. Bösartiger Code kann das Berechtigungsmodell umgehen und beliebigen Code ohne die durch das Berechtigungsmodell auferlegten Einschränkungen ausführen.

Wenn Sie eine potenzielle Sicherheitslücke finden, lesen Sie bitte unsere Sicherheitsrichtlinie.

Prozessbasierte Berechtigungen

Berechtigungsmodell

[Stabil: 2 - Stabil]

Stabil: 2 Stabilität: 2 - Stabil.

Das Node.js-Berechtigungsmodell ist ein Mechanismus zur Beschränkung des Zugriffs auf bestimmte Ressourcen während der Ausführung. Die API befindet sich hinter einem Flag --permission, das, wenn es aktiviert ist, den Zugriff auf alle verfügbaren Berechtigungen einschränkt.

Die verfügbaren Berechtigungen werden durch das Flag --permission dokumentiert.

Wenn Node.js mit --permission gestartet wird, wird die Fähigkeit, über das fs-Modul auf das Dateisystem zuzugreifen, Prozesse zu erzeugen, node:worker_threads zu verwenden, native Addons zu verwenden, WASI zu verwenden und den Runtime Inspector zu aktivieren, eingeschränkt.

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

Die Erlaubnis, einen Prozess zu erzeugen und Worker-Threads zu erstellen, kann mit --allow-child-process bzw. --allow-worker gewährt werden.

Um native Addons bei Verwendung des Berechtigungsmodells zu erlauben, verwenden Sie das Flag --allow-addons. Für WASI verwenden Sie das Flag --allow-wasi.

Runtime-API

Wenn das Berechtigungsmodell über das Flag --permission aktiviert wird, wird dem process-Objekt eine neue Eigenschaft permission hinzugefügt. Diese Eigenschaft enthält eine Funktion:

permission.has(scope[, reference])

API-Aufruf zur Überprüfung von Berechtigungen zur Laufzeit (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

Dateisystemberechtigungen

Das Berechtigungsmodell schränkt standardmäßig den Zugriff auf das Dateisystem über das node:fs-Modul ein. Es garantiert nicht, dass Benutzer nicht über andere Mittel, wie z. B. das node:sqlite-Modul, auf das Dateisystem zugreifen können.

Um den Zugriff auf das Dateisystem zu ermöglichen, verwenden Sie die Flags --allow-fs-read und --allow-fs-write:

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

Die gültigen Argumente für beide Flags sind:

  • * - Um alle FileSystemRead- bzw. FileSystemWrite-Operationen zuzulassen.
  • Durch Kommas (,) getrennte Pfade, um nur passende FileSystemRead- bzw. FileSystemWrite-Operationen zuzulassen.

Beispiel:

  • --allow-fs-read=* - Erlaubt alle FileSystemRead-Operationen.
  • --allow-fs-write=* - Erlaubt alle FileSystemWrite-Operationen.
  • --allow-fs-write=/tmp/ - Erlaubt den FileSystemWrite-Zugriff auf den /tmp/-Ordner.
  • --allow-fs-read=/tmp/ --allow-fs-read=/home/.gitignore - Erlaubt den FileSystemRead-Zugriff auf den /tmp/-Ordner und den Pfad /home/.gitignore.

Platzhalter werden ebenfalls unterstützt:

  • --allow-fs-read=/home/test* erlaubt den Lesezugriff auf alles, was dem Platzhalter entspricht. z. B.: /home/test/file1 oder /home/test2.

Nachdem ein Platzhalterzeichen (*) übergeben wurde, werden alle nachfolgenden Zeichen ignoriert. Zum Beispiel: /home/*.js funktioniert ähnlich wie /home/*.

Wenn das Berechtigungsmodell initialisiert wird, wird automatisch ein Platzhalter (_) hinzugefügt, wenn das angegebene Verzeichnis existiert. Wenn beispielsweise /home/test/files existiert, wird es als /home/test/files/_behandelt. Wenn das Verzeichnis jedoch nicht existiert, wird der Platzhalter nicht hinzugefügt, und der Zugriff ist auf/home/test/filesbeschränkt. Wenn Sie den Zugriff auf einen Ordner erlauben möchten, der noch nicht existiert, stellen Sie sicher, dass Sie den Platzhalter explizit angeben:/my-path/folder-do-not-exist/\*.

Einschränkungen des Berechtigungsmodells

Es gibt Einschränkungen, die Sie kennen müssen, bevor Sie dieses System verwenden:

  • Das Modell wird nicht an einen untergeordneten Knotenprozess oder einen Worker-Thread vererbt.

  • Bei Verwendung des Berechtigungsmodells werden die folgenden Funktionen eingeschränkt:

    • Native Module
    • Child-Prozesse
    • Worker-Threads
    • Inspektorprotokoll
    • Dateisystemzugriff
    • WASI
  • Das Berechtigungsmodell wird initialisiert, nachdem die Node.js-Umgebung eingerichtet wurde. Bestimmte Flags wie --env-file oder --openssl-config sind jedoch so konzipiert, dass sie Dateien vor der Initialisierung der Umgebung lesen. Daher unterliegen solche Flags nicht den Regeln des Berechtigungsmodells. Das Gleiche gilt für V8-Flags, die zur Laufzeit über v8.setFlagsFromString gesetzt werden können.

  • OpenSSL-Engines können zur Laufzeit nicht angefordert werden, wenn das Berechtigungsmodell aktiviert ist, was sich auf die integrierten Module crypto, https und tls auswirkt.

  • Laufzeit-ladbare Erweiterungen können nicht geladen werden, wenn das Berechtigungsmodell aktiviert ist, was sich auf das sqlite-Modul auswirkt.

  • Die Verwendung vorhandener Dateideskriptoren über das Modul node:fs umgeht das Berechtigungsmodell.

Einschränkungen und bekannte Probleme

  • Symbolische Links werden auch zu Orten außerhalb der festgelegten Pfade verfolgt, für die der Zugriff gewährt wurde. Relative symbolische Links können den Zugriff auf beliebige Dateien und Verzeichnisse ermöglichen. Wenn Sie Anwendungen mit aktiviertem Berechtigungsmodell starten, müssen Sie sicherstellen, dass keine Pfade, für die der Zugriff gewährt wurde, relative symbolische Links enthalten.