Permissions
权限可用于控制Node.js进程有权访问哪些系统资源,或者进程可以对这些资源执行哪些操作。权限还可以控制其他模块可以访问哪些模块。
- 基于模块的权限控制在应用程序执行期间哪些文件或 URL 可供其他模块使用。例如,这可用于控制第三方依赖项可以访问哪些模块。
- 基于进程的权限控制Node.js进程对资源的访问。可以完全允许或拒绝资源,也可以控制与其相关的操作。例如,在拒绝写入的同时,可以允许文件系统读取。
Features
当策略检查失败时,默认情况下Node.js将引发错误。可以通过在策略清单中定义“onerror”字段,将错误行为更改为几种可能性之一。以下值可用于更改行为:
"exit"
:将立即退出进程。不允许运行任何清理代码"log"
:将在故障现场记录错误"throw"
:将在故障现场抛出 JS 错误。这是默认设置。
{
"onerror": "log",
"resources": {
"./app/checked.js": {
"integrity": "sha384-SggXRQHwCG8g+DktYYzxkXRIkTiEYWBHqev0xnpCxYlqMBufKZHAHQM3/boDaI/0"
}
}
}
允许加载文件 checked.js 的示例策略文件:
{
"resources": {
"./app/checked.js": {
"integrity": "sha384-SggXRQHwCG8g+DktYYzxkXRIkTiEYWBHqev0xnpCxYlqMBufKZHAHQM3/boDaI/0"
}
}
}
基于进程的权限
Node.js权限模型是一种在执行过程中限制对特定资源的访问的机制。该 API 存在于一个标志后面,启用该标志 --experimental-permission 后,将限制对所有可用权限的访问。
--experimental-permission
可用权限由标志记录
当 启动 Node.js 时 --experimental-permission
,通过 fs
模块访问文件系统、生成进程、使用 node:worker_threads
、 本机插件和启用运行时检查器的能力将受到限制
$ node --experimental-permission index.js
node:internal/modules/cjs/loader:171
const result = internalModuleStat(filename);
^
Error: Access to this API has been restricted
at stat (node:internal/modules/cjs/loader:171:18)
at Module._findPath (node:internal/modules/cjs/loader:627:16)
at resolveMainPath (node:internal/modules/run_main:19:25)
at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:76:24)
at node:internal/main/run_main_module:23:47 {
code: 'ERR_ACCESS_DENIED',
permission: 'FileSystemRead',
resource: '/home/user/index.js'
}
允许访问生成进程和创建工作线程可以分别使用 --allow-child-process
和 --allow-worker
来完成。
要在使用权限模型时允许本机插件,请使用 --allow-addons
标志
运行时 API
通过 --experimental-permission
标志启用权限模型时, process
会向对象添加一个新属性 permission
。此属性包含一个函数:
在运行时检查权限的 API 调用 ( 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
文件系统权限
要允许访问文件系统,请使用 --allow-fs-read
and --allow-fs-write
标志:
$ node --experimental-permission --allow-fs-read=* --allow-fs-write=* index.js
Hello world!
(node:19836) ExperimentalWarning: Permission is an experimental feature
(Use `node --trace-warnings ...` to show where the warning was created)
这两个标志的有效参数为:
*
分别允许所有FileSystemRead
或FileSystemWrite
操作- 用逗号 (
,
) 分隔的路径,分别只允许匹配FileSystemRead
或FileSystemWrite
操作
例:
--allow-fs-read=*
- 它将允许所有 FileSystemRead 操作--allow-fs-write=*
- 它将允许所有 FileSystemWrite 操作--allow-fs-write=/tmp/
- 它将允许 FileSystemWrite 访问该/tmp/
文件夹--allow-fs-read=/tmp/
--allow-fs-read=/home/.gitignore
- 它允许 FileSystemRead 访问/tmp/
文件夹和/home/.gitignore
路径
还支持通配符:
--allow-fs-read=/home/test*
将允许对与通配符匹配的所有内容进行读取访问。例如:/home/test/file1
或/home/test2
传递通配符 (*
) 后,所有后续字符都将被忽略。例如:/home/*.js
将工作类似于/home/*
权限模型约束
在使用此系统之前,您需要了解一些限制:
该模型不会继承到子节点进程或工作线程。
使用权限模型时,以下功能将受到限制:
无法使用
--no-warnings
标志- 本机模块
- 子进程
- 工作线程
- 检查器协议
- 文件系统访问
设置Node.js环境后,将初始化权限模型。但是,某些标志(如
--env-file
or--openssl-config
)被设计为在环境初始化之前读取文件。因此,此类标志不受权限模型规则的约束。当 Permission 模型已启用,会影响内置的
crypto
、https
和tls
模块。