温馨提示×

Linux 平台上 Node.js 安全性如何保障

小樊
36
2026-06-30 16:50:42
栏目: 编程语言

Linux 平台上运行 Node.js 时,安全性需要从 系统层、Node.js 运行时、代码层、依赖管理、运维与网络 多个层面共同保障。下面给你一个比较完整、实用的安全实践清单。


一、系统层安全(Linux 本身)

1. 使用最小权限原则

  • 不要使用 root 运行 Node.js
sudo useradd -r -s /usr/sbin/nologin nodeapp
sudo -u nodeapp node app.js
  • 使用 systemd 管理服务时限制权限:
[Service]
User=nodeapp
Group=nodeapp
NoNewPrivileges=true

2. 限制系统资源(cgroup / systemd)

防止内存溢出或 fork 炸弹:

[Service]
MemoryMax=512M
CPUQuota=50%

3. 文件系统权限控制

  • Node.js 进程只拥有 必要目录的读写权限
  • 日志、上传目录与应用代码分离
  • 配置文件不放在 web 目录中

二、Node.js 运行时安全

4. 使用 LTS 版本,及时升级

  • ✅ 推荐使用 Node.js LTS
  • ❌ 不使用 EOL(已停止维护)版本
node -v

查看安全公告:

  • https://nodejs.org/en/security

5. 开启 Node.js 安全特性

export NODE_OPTIONS="--use-openssl-ca --no-experimental-fetch"

禁用不必要的实验特性。


三、依赖与第三方库安全(最关键)

6. 定期扫描依赖漏洞

npm audit
npm audit fix

生产环境推荐:

npm ci

7. 使用 Snyk / Trivy

snyk test
snyk monitor

或:

trivy fs .

8. 锁定依赖版本

  • 提交 package-lock.json
  • 避免 *latest 版本号

四、代码层安全

9. 防止常见 Web 漏洞

✅ XSS

const escapeHtml = require('escape-html');

✅ SQL / NoSQL 注入

  • 使用 ORM(Sequelize / Mongoose)
  • 不直接拼接 SQL

❌ 错误示例:

db.query(`SELECT * FROM user WHERE id = ${req.body.id}`)

✅ 正确:

db.query('SELECT * FROM user WHERE id = ?', [req.body.id])

10. 防 CSRF

  • 使用 csurf(已弃用,可替代)
  • 使用 SameSite Cookie:
res.cookie('token', token, {
  httpOnly: true,
  sameSite: 'strict',
  secure: true
});

11. 防暴力破解 / DoS

  • 使用 express-rate-limit
const rateLimit = require('express-rate-limit');

const limiter = rateLimit({
  windowMs: 15 * 60 * 1000,
  max: 100
});

app.use(limiter);

五、HTTP / HTTPS 安全

12. 强制 HTTPS

  • 使用 Nginx / Caddy 终止 SSL
  • 禁止 HTTP 直接访问

13. 安全响应头

const helmet = require('helmet');
app.use(helmet());

包括:

  • Content-Security-Policy
  • X-Content-Type-Options
  • Strict-Transport-Security

六、进程与运行环境安全

14. 使用进程管理器

✅ PM2:

pm2 start app.js --name myapp

好处:

  • 自动重启
  • 限制内存
  • 日志管理

15. 禁止泄露敏感信息

  • 不用 console.log(req)
  • 不向前端返回堆栈信息
  • 使用环境变量:
export JWT_SECRET=xxx

在代码中:

process.env.JWT_SECRET

七、Docker + Linux 场景(如果你在用容器)

16. 容器安全

  • 使用 非 root 用户运行容器
USER node
  • 使用官方 slim 镜像:
FROM node:20-slim
  • 定期扫描镜像:
trivy image mynodeapp

八、日志与监控

17. 安全日志

  • 记录登录、权限变更、异常请求
  • 日志不要记录密码 / token

18. 入侵检测

  • Linux:fail2ban
  • Node.js:winston + 报警
  • 系统级:auditd

九、安全配置检查清单(总结)

✅ 不使用 root
✅ Node.js LTS
✅ 定期 npm audit
✅ 依赖锁定
✅ Helmet + Rate Limit
✅ HTTPS + HSTS
✅ 环境变量管理密钥
✅ 最小文件系统权限
✅ 日志不泄露敏感信息
✅ 容器非 root


如果你愿意,我可以:

  • 针对你的项目结构给安全加固方案
  • 帮你检查 Docker + Node.js 安全配置
  • 给你一份 Node.js 安全基线检查表(运维级)

只要告诉我你的使用场景即可。

0