温馨提示×

Node.js在Linux下如何进行安全防护

小樊
41
2025-12-19 22:03:01
栏目: 编程语言

Node.js 在 Linux 下的安全防护实践

一 运行环境与权限最小化

  • 使用 NVM 安装与切换 Node.js LTS,避免全局包冲突与权限问题;定期更新到包含安全修复的版本。
  • 非 root用户运行应用,应用目录与文件属主收紧到该用户;禁止在生产启用 Node.js REPL/调试端口
  • 进程管理建议用 PM2,通过系统服务方式启动并降权运行;如需更强隔离,可用 systemdProtectSystem=strict、NoNewPrivileges=yes 等隔离选项。
  • 云上同时配置安全组与系统防火墙,仅开放必要端口(如 22/SSH、80/443/HTTP/HTTPS),对管理端口可限制来源 IP。

二 网络与反向代理加固

  • 对外仅暴露 80/443,在内网运行 Node.js(如 3000),由 Nginx 反向代理与终止 TLS,统一配置 HTTP/2、压缩与连接复用。
  • 启用 TLS 证书(如 Let’s Encrypt),禁用旧协议与弱套件;Nginx 反向代理示例:
    server {
      listen 443 ssl http2;
      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 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;
      }
    }
    
  • 防火墙建议:
    • Ubuntu/Debian 使用 UFWsudo ufw allow 22,80,443/tcp && sudo ufw enable
    • CentOS/RHEL 使用 firewalldsudo firewall-cmd --permanent --add-service=http --add-service=https && sudo firewall-cmd --reload

三 应用层安全控制

  • 启用 Helmet 设置安全响应头,并配置 CSP 策略降低 XSS 风险:
    const helmet = require('helmet');
    app.use(helmet());
    app.use(helmet.contentSecurityPolicy({
      directives: {
        defaultSrc: ["'self'"],
        scriptSrc: ["'self'"],
        styleSrc: ["'self'"],
        imgSrc: ["'self'","data:"],
        connectSrc: ["'self'"],
        fontSrc: ["'self'"],
        objectSrc: ["'none'"],
        mediaSrc: ["'self'"],
        frameSrc: ["'none'"]
      }
    }));
    
  • 严格 输入校验/输出编码,使用参数化查询或 ORM 防止 SQL 注入;启用 CSRF 保护(如 csurf 或框架内置方案)。
  • 实施 限流 抵御暴力破解与 DoS
    const rateLimit = require('express-rate-limit');
    app.use('/api/', rateLimit({ windowMs: 15*60*1000, max: 100 }));
    
  • 配置 CORS 白名单,仅允许可信源;启用 HTTPS 全站加密;完善错误处理,避免泄露堆栈与敏感信息。

四 依赖与代码安全

  • 使用 npm audit / Snyk 持续扫描依赖漏洞,及时升级;在 package.json 中固定版本并使用锁文件(如 package-lock.json)确保可复现构建。
  • 禁止在代码中硬编码 API Key/数据库密码,通过 环境变量密钥管理服务 注入;可使用 dotenv 管理本地开发环境。
  • 遵循安全编码:避免 eval()、不安全的第三方库与原型污染;对外部数据与模板进行严格校验与清理。

五 日志、监控与备份

  • 日志权限遵循最小权限原则:仅授权必要主体读取,避免 777;按组管理(如 chown appuser:adm),必要时用 ACL 精细化授权。
  • 配置 logrotatePM2 logrotate 做按日/按大小轮转与保留(如保留 7 天),防止日志无限增长与篡改。
  • 结构化日志(如 Winston/Pino/Bunyan)结合 PM2/KeymetricsPrometheus+Grafana 做异常告警与审计;定期备份代码、配置与数据库,并演练恢复流程。

0