Ubuntu 上保障 Node.js 应用安全的可落地清单
一 系统与运行时安全
- 保持系统与包为最新:定期执行 sudo apt update && sudo apt upgrade,及时修补内核与基础组件漏洞。
- 使用 NVM 管理 Node.js 版本,便于快速升级与安全回退:例如 curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash,随后 nvm install 23 && nvm use 23。
- 以非 root用户运行应用,遵循最小权限原则;如需全局包,配置安全的全局目录,避免权限冲突与提权风险。
- 启用 UFW 防火墙,仅开放必要端口:例如 sudo ufw allow 22,80,443/tcp && sudo ufw enable。
- 利用 AppArmor 对 Node.js 进程进行强制访问控制:查看状态 sudo aa-status,按需在 /etc/apparmor.d/ 下添加策略以限制文件系统与网络访问。
二 应用层安全
- 全站启用 HTTPS/TLS,可使用 Let’s Encrypt 或自签证书;在 Node.js 中通过 https 模块或前置 Nginx 终止 TLS。
- 使用 Helmet 设置关键安全头(如 X-Frame-Options、X-XSS-Protection、Content-Security-Policy 等),降低 XSS/CSRF/点击劫持 风险。
- 严格输入校验与输出编码,防范 SQL 注入/XSS;对外部数据使用 DOMPurify、express-validator 等库。
- 配置 CORS 白名单,仅允许受信源与必要方法/头。
- 实施速率限制(如 express-rate-limit)抵御暴力与爬虫滥用。
- 安全会话管理:设置自定义会话 Cookie 名称、HttpOnly/Secure、SameSite 策略,并使用强随机 secret。
- 避免泄露实现细节:在生产环境关闭错误堆栈与调试信息,统一返回通用错误。
- 管理环境变量与密钥:使用 dotenv 或系统服务环境,切勿硬编码数据库密码、API Key 等敏感信息。
三 依赖与代码安全
- 持续审计与修复依赖:使用 npm audit / npm audit fix 与 Snyk(如 snyk test / snyk wizard)识别并修复漏洞。
- 精简与锁定依赖:移除未使用包,确保 package-lock.json 受控,定期执行 npm outdated 并评估升级影响。
- 避免危险 API:禁用或严格限制 eval()、new Function()、setTimeout(string) 等动态执行路径。
- 子进程最小化权限:对 child_process 设置受限 cwd/env/stdio,避免使用 shell 解析;必要时采用沙箱/隔离方案。
四 部署与运行环境
- 使用 PM2 进程管理:如 pm2 start app.js --name “myapp”,并通过 ecosystem.config.js 配置 user、env、instances、max_memory_restart 等,实现守护、平滑重启与资源控制。
- 以反向代理承载静态资源与 TLS:Nginx 示例将 443 端口终止 TLS 并反向代理到 http://127.0.0.1:3000,同时设置 X-Real-IP / X-Forwarded-For / X-Forwarded-Proto 便于后端获取真实客户端信息。
- 精细化进程权限:为 PM2 指定非 root运行用户,必要时通过 sudo 授权特定端口绑定能力。
- 日志与可观测性:记录访问与错误日志,接入 Sentry / Prometheus / New Relic 等 APM/错误监控,及时发现异常与攻击迹象。
五 运维与持续安全
- 建立安全更新机制:定期 apt 升级,结合 npm audit / Snyk 做依赖巡检;可配置 cron 自动检查与提醒(如每日执行更新检查)。
- 定期备份与演练恢复:含代码、配置、证书与数据库;验证恢复流程可用。
- 加固与巡检清单:持续检查 开放端口、进程与监听地址、定时任务、sudoers、SSH 密钥与日志完整性。
- 安全配置基线:为 Nginx/PM2/Node 建立可审计的配置模板与变更流程,变更前后进行安全回归测试。