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.
$ 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
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()
)
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
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
:
$ node --permission --allow-fs-read=* --allow-fs-write=* index.js
Hello world!
2
Die gültigen Argumente für beide Flags sind:
*
- Um alleFileSystemRead
- bzw.FileSystemWrite
-Operationen zuzulassen.- Durch Kommas (
,
) getrennte Pfade, um nur passendeFileSystemRead
- bzw.FileSystemWrite
-Operationen zuzulassen.
Beispiel:
--allow-fs-read=*
- Erlaubt alleFileSystemRead
-Operationen.--allow-fs-write=*
- Erlaubt alleFileSystemWrite
-Operationen.--allow-fs-write=/tmp/
- Erlaubt denFileSystemWrite
-Zugriff auf den/tmp/
-Ordner.--allow-fs-read=/tmp/ --allow-fs-read=/home/.gitignore
- Erlaubt denFileSystemRead
-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/files
beschrä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 überv8.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.