Ubuntu 上提升 Node.js 应用安全性的实用清单
一 系统与账户安全
- 保持系统与软件包为最新:执行 sudo apt update && sudo apt upgrade,及时修补漏洞。
- 启用自动安全更新:安装 unattended-upgrades,编辑 /etc/apt/apt.conf.d/50unattended-upgrades 配置仅安装安全更新。
- 配置防火墙 UFW:仅放行必要端口,例如 SSH(22)、HTTP(80)、HTTPS(443);示例:sudo ufw allow OpenSSH;sudo ufw enable。
- 加固 SSH:修改默认端口、禁用 root 登录、仅允许密钥认证、设置空闲超时。
- 最小权限运行:创建非 root专用用户运行应用,禁止交互式登录;必要时用 sudo 授权特定命令。
- 强制访问控制:启用 AppArmor 或 SELinux 对进程进行最小权限约束。
二 Node.js 运行时与依赖管理
- 版本管理:使用 nvm 安装与切换受支持的 Node.js LTS 版本,便于快速修复安全缺陷。
- 升级与切换示例:
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash
source ~/.bashrc
nvm install --lts
nvm use --lts
- 依赖安全:定期执行 npm audit、npm outdated,结合 Snyk 扫描;尽量锁定依赖版本,减少全局包,避免来源不明的包。
- 运行权限:应用以非 root用户启动,降低被攻破后的横向权限。
三 应用层安全配置
- 启用 HTTPS:优先使用 Let’s Encrypt 免费证书;或在 Node 中通过 https 模块加载证书。
- 安全响应头:使用 helmet 移除 X-Powered-By,开启 CSP、HSTS、X-Frame-Options、X-Content-Type-Options 等。
- 请求限制:限制请求体大小(如 express.json({ limit: ‘10kb’ })),启用 express-rate-limit 防暴力与限流。
- 输入校验与过滤:用 Joi/validator.js 校验参数;防范 SQL/NoSQL 注入 与 XSS(输出转义,必要时用 xss-clean)。
- 安全会话与认证:为会话设置 HttpOnly、Secure、SameSite;使用 bcrypt/scrypt 哈希密码,启用 MFA。
- 错误处理:生产环境不暴露堆栈与敏感信息,统一返回通用错误页并记录到安全日志。
- 安全头部与 CORS 示例:
const helmet = require(‘helmet’); app.use(helmet());
const rateLimit = require(‘express-rate-limit’); app.use(‘/api/’, rateLimit({ windowMs: 15601000, max: 100 }));
const cors = require(‘cors’); app.use(cors({ origin: ‘https://yourdomain.com’, methods: [‘GET’,‘POST’,‘PUT’,‘DELETE’] }));
- 环境变量与密钥:用 .env 管理密钥(加入 .gitignore),生产通过系统变量注入;日志禁止记录 password/token。
四 网络与进程架构
- 反向代理与静态资源:用 Nginx 终止 TLS、承载静态资源、设置安全头并反向代理到 Node.js(常见 127.0.0.1:3000/3001);WebSocket 需开启升级头。
- Nginx 示例片段:
server { listen 443 ssl; server_name yourdomain.com;
ssl_certificate /path/to/fullchain.pem; ssl_certificate_key /path/to/privkey.pem;
location / { proxy_pass http://127.0.0.1:3000; proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection ‘upgrade’;
proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme; } }
- 进程守护与日志:用 PM2 启动与守护进程,开启日志轮转与监控;以专用系统用户运行(如 useradd -r -s /bin/false app)。
- 进程启动示例:sudo -u app pm2 start app.js --name myapp;pm2 logs myapp。
五 运维监控与备份
- 日志与监控:集中记录访问与应用日志,结合 PM2、New Relic、Datadog 等监控异常与性能。
- 审计与合规:定期运行 npm audit/Snyk,核查依赖漏洞与许可证;保留变更与发布记录。
- 备份与恢复:定期备份代码、配置与数据库;验证恢复流程可用,确保 RPO/RTO 达标。