在 Linux 平台上运行 Node.js 时,安全性需要从 系统层、Node.js 运行时、代码层、依赖管理、运维与网络 多个层面共同保障。下面给你一个比较完整、实用的安全实践清单。
sudo useradd -r -s /usr/sbin/nologin nodeapp
sudo -u nodeapp node app.js
systemd 管理服务时限制权限:[Service]
User=nodeapp
Group=nodeapp
NoNewPrivileges=true
防止内存溢出或 fork 炸弹:
[Service]
MemoryMax=512M
CPUQuota=50%
node -v
查看安全公告:
export NODE_OPTIONS="--use-openssl-ca --no-experimental-fetch"
禁用不必要的实验特性。
npm audit
npm audit fix
生产环境推荐:
npm ci
snyk test
snyk monitor
或:
trivy fs .
package-lock.json* 或 latest 版本号const escapeHtml = require('escape-html');
❌ 错误示例:
db.query(`SELECT * FROM user WHERE id = ${req.body.id}`)
✅ 正确:
db.query('SELECT * FROM user WHERE id = ?', [req.body.id])
csurf(已弃用,可替代)res.cookie('token', token, {
httpOnly: true,
sameSite: 'strict',
secure: true
});
express-rate-limitconst rateLimit = require('express-rate-limit');
const limiter = rateLimit({
windowMs: 15 * 60 * 1000,
max: 100
});
app.use(limiter);
const helmet = require('helmet');
app.use(helmet());
包括:
Content-Security-PolicyX-Content-Type-OptionsStrict-Transport-Security✅ PM2:
pm2 start app.js --name myapp
好处:
console.log(req)export JWT_SECRET=xxx
在代码中:
process.env.JWT_SECRET
USER node
FROM node:20-slim
trivy image mynodeapp
fail2banwinston + 报警auditd✅ 不使用 root
✅ Node.js LTS
✅ 定期 npm audit
✅ 依赖锁定
✅ Helmet + Rate Limit
✅ HTTPS + HSTS
✅ 环境变量管理密钥
✅ 最小文件系统权限
✅ 日志不泄露敏感信息
✅ 容器非 root
如果你愿意,我可以:
只要告诉我你的使用场景即可。