前言
随着前端应用越来越复杂,对进程管理的需求也日益增多。PM2 是一个非常优秀的进程管理工具,它可以管理 Node.js 进程,可以实现守护进程、负载均衡、应用程序自动重启、进程监控等功能。但是,如果不加以限制,使用 PM2 还是有一定的安全风险的,比如某些进程会包含非常敏感的数据,如何防止进程被“恶意操作”是非常有必要的。因此,本文将介绍如何使用 PM2 的权限管理功能,以保护进程的安全。
什么是 PM2 权限管理
PM2 可以控制启动、停止、重启、删除进程等操作,而这些操作可以被应用程序和 PM2 用户轻易地进行。因此,为了避免不当的操作,作者引入了访问控制列表(ACL),这是一种基于角色的权限控制,它限制了特定用户对应用程序的操作。
ACL 文件格式
PM2 ACL 文件为 JSON 格式文件,它在 pm2_config.available_pm2_version >= 2.0.0 时可用。ACL 文件中的每个条目(entry)都反映了一个用户或用户组的访问权限。ACL 文件中的每个条目应包括以下内容:
- "id": 条目的唯一ID,可以用任何唯一的字符串。
- "action": 哪些操作需要访问权限,可以有多种操作组合,如 "restart|delete"
- "allow": 允许执行的用户或组,可以是数组。
- "deny": 拒绝执行的用户或组,可以是数组。
以下是一个 ACL 文件的示例:
-- -------------------- ---- ------- - ---------- - - ----- ----------- --------- ----------------- -------- --------- --------- ------- --------- -- - ----- ----------- --------- ------- -------- ---------- ------- -- - - -
ACL 文件的位置和加载
ACL 文件的位置可以通过设置 PM2_HOME 环境变量来定义。如果未设置,则默认为 ~/.pm2/acl.json
。一旦文件被读取,ACL 文件的内容就会被 PM2 的服务全部加载并生效。默认情况下,没有 ACL 文件;因此,只有 PM2 用户才能执行所有操作。
你可以通过 pm2 updatePayload 来更新 ACL 文件,即时应用更新,常规的pm2 update也是适用的。
示例代码如下所示:
$ pm2 update â Updating PM2... $ pm2 updatePayload â New PM2+ payload file available $ pm2 update â Updating PM2...
入门示例
接下来,我将举一个例子来说明如何在 PM2 中使用 ACL 文件。
首先,我们先创建一个简单的 Node.js 应用,它将在 8000 端口上监听 HTTP 请求:
const http = require('http'); const server = http.createServer((req, res) => { res.write('Hello, PM2!'); res.end(); }); server.listen(8000);
将应用部署到 PM2 中并启动:
$ pm2 start app.js
现在,我们还没有任何的访问控制,PM2 用户可以执行任何操作。
我们创建一个 ACL 文件,并指定一个条目,只允许用户1来执行restart或delete操作:
-- -------------------- ---- ------- - ---------- - - ----- ---------- --------- ----------------- -------- ---------- ------- -- - - -
然后,我们将 ACL 文件放入默认的 PM2 HOME 目录下:
$ mv acl.json ~/.pm2/acl.json
现在,我们可以测试 ACL 文件的生效情况。如果我们尝试以 PM2 用户身份执行删除操作:
$ pm2 delete app
我们将得到如下错误:
┌──────────┬────┬──────┬───────┬────────┬─────────┬────────┬─────┬───────────┬───────────┬──────────┐ │ App name │ id │ mode │ pid │ status │ restart │ uptime │ cpu │ mem │ user │ watching │ └──────────┴────┴──────┴───────┴────────┴─────────┴────────┴─────┴───────────┴───────────┴──────────┘ [PM2][ERROR] Only user1 is allowed to delete this app.
如果我们尝试使用用户1来执行删除操作,则操作会成功:
$ su user1 $ pm2 delete app
以上操作说明,ACL 文件已经被正确加载并限制了操作的执行。
总结
作为一个优秀的进程管理工具,PM2 的权限管理功能可以帮助保护应用程序进程不被误操作。本文介绍了 ACL 文件的格式、位置、加载等内容,并提供了入门示例,希望能帮助大家更好地使用 PM2。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/649e8d7048841e9894b13009