在 Debian 上提升 Node.js 安全性的可执行清单
一 基础系统与账户加固
- 保持系统与软件包为最新:执行 sudo apt update && sudo apt full-upgrade -y,及时修补内核与基础组件漏洞。
- 使用最新稳定版 Node.js:优先通过 NodeSource 仓库安装所需 LTS 版本,避免使用过旧或已停止维护的版本。
- 最小权限运行:创建专用系统用户(如 nodeapp),禁止以 root 直接运行进程;必要时用 systemd 以该用户启动服务。
- 强化 SSH:仅允许 SSH 密钥登录,禁用 root 远程登录与密码登录,修改默认端口并限制可登录用户组。
- 配置防火墙:启用 UFW,仅放行必要端口(如 22/SSH、80/HTTP、443/HTTPS),其余默认拒绝。
- 启用系统安全机制:按需启用 AppArmor/SELinux 等强制访问控制,减少进程越权风险。
二 运行时与应用层防护
- 移除或隐藏技术栈标识:在 Express 中执行 app.disable(‘x-powered-by’),降低攻击者信息搜集效率。
- 设置安全响应头:使用 Helmet 启用 HSTS、X-Frame-Options、X-Content-Type-Options、CSP 等,减少 XSS/CSRF/点击劫持 风险。
- 强制 HTTPS 与重定向:使用 Let’s Encrypt 获取证书,配置 Nginx 将 80→443 并反向代理到本地 Node.js 端口。
- 输入校验与输出编码:对所有请求参数进行严格校验(如 Joi/express-validator),对输出到页面数据进行转义,防范 SQL/NoSQL 注入 与 XSS。
- 速率限制与防暴力:对登录、注册、敏感接口启用 express-rate-limit,限制单位时间请求次数与并发。
- 请求体大小限制:如 app.use(express.json({ limit: ‘10kb’ })),缓解大体积请求导致的 DoS。
- 安全的会话与凭据:使用强随机 session secret,启用 HttpOnly/Secure Cookie 标志;密码采用 bcrypt/scrypt 等算法哈希存储。
- 安全的 CORS:仅允许受信任源跨域访问,明确 methods/headers/credentials 策略。
三 依赖与代码供应链安全
- 固定依赖版本:在 package.json 中锁定版本(避免无约束的 ^/~),提交并保护 package-lock.json,确保可重复构建。
- 持续漏洞扫描:定期执行 npm audit 或集成 Snyk,对高危漏洞优先升级或替换依赖。
- 减少攻击面:清理未使用的依赖与开发依赖,避免引入维护不活跃或下载量极低的第三方包。
- 最小化全局安装:尽量以项目本地依赖运行,降低全局包被篡改的风险。
- 密钥与配置管理:使用 .env 管理密钥并加入 .gitignore,生产环境通过系统级环境变量注入;日志中禁止记录 密码、token 等敏感信息。
四 部署架构与网络隔离
- 反向代理与静态资源分离:使用 Nginx 终止 TLS、处理静态文件、设置缓存与安全头,Node.js 仅处理动态请求。
- 进程隔离与最小权限:以专用用户运行 Node.js,通过 systemd 设定 WorkingDirectory、User、Group、ProtectSystem=strict、NoNewPrivileges=yes 等安全选项。
- 资源与并发限制:限制 内存/CPU 使用,启用 集群模式 或 反向代理限流,避免单实例资源耗尽。
- 网络访问控制:仅开放必要端口与协议,对管理接口与数据库端口限制来源 IP;必要时使用 VPC/安全组 做二层隔离。
- 日志与监控告警:集中记录 访问/错误 日志,结合 Fail2ban/Logwatch 或 APM 监控异常流量与错误率,建立告警阈值与处置流程。
五 快速检查清单与常用命令
- 系统与账户:
- 执行 sudo apt update && sudo apt full-upgrade -y;创建 nodeapp 用户并配置 sudo 权限最小化。
- 配置 UFW:sudo ufw allow 22,80,443/tcp && sudo ufw enable。
- Node.js 与依赖:
- 使用 NodeSource 安装所需 LTS 版本;npm 配置使用官方仓库与可信镜像。
- 运行 npm audit(或 snyk test),修复高危项;提交并保护 package-lock.json。
- 运行时配置:
- Express 中禁用 x-powered-by,启用 Helmet 与 CSP;配置 express-rate-limit 与 **express.json({ limit: ‘10kb’ })`。
- 强制 HTTPS:使用 certbot 获取证书并配置 Nginx 反向代理到 localhost:3000。
- 示例命令片段:
- 安装与更新:sudo apt update && sudo apt full-upgrade -y
- 防火墙:sudo ufw allow 22,80,443/tcp && sudo ufw enable
- HTTPS:sudo apt install certbot python3-certbot-nginx && sudo certbot --nginx -d yourdomain.com
- 依赖审计:npm audit fix(或 snyk test / snyk monitor)