Node.js 应用在 Linux 上的安全加固清单
一 基础运行环境与权限
- 使用 NVM 或系统包管理器安装与切换 Node.js,保持版本为最新稳定版,避免权限与兼容性问题。
- 以非 root用户运行应用,遵循最小权限原则;为应用创建专用系统用户与目录,禁止在生产使用 root 直跑。
- 通过 .env / 环境变量管理密钥与敏感配置,禁止硬编码;设置 NODE_ENV=production。
- 依赖管理:在 package.json 中固定版本并使用 package-lock.json;定期执行 npm audit / npm outdated,必要时配合 Snyk 做供应链风险扫描。
- 安全编码:避免 eval、不安全的第三方库;对所有用户输入进行严格校验与过滤;实施速率限制抵御暴力与滥用。
二 网络与接入控制
- 仅开放必要端口与协议:如 22/SSH、80/HTTP、443/HTTPS;使用 UFW(Debian/Ubuntu)或 firewalld(CentOS/RHEL)配置白名单。
- 建议前置 Nginx/Apache 反向代理与 TLS,隐藏后端端口与实现 HTTP→HTTPS 强制跳转、静态资源缓存与压缩。
- 对管理口或敏感接口实施 IP 白名单(如仅内网或跳板机可访问),可在 firewalld 使用富规则或在 UFW 按来源限制端口访问。
- 示例(UFW):仅允许指定 IP 访问 3000/tcp
- sudo ufw allow from 192.168.1.100 to any port 3000/tcp
- sudo ufw deny 3000/tcp
- 示例(firewalld):开放 443/tcp 并限制来源网段
- sudo firewall-cmd --permanent --zone=public --add-port=443/tcp
- sudo firewall-cmd --permanent --zone=public --add-rich-rule=‘rule family=“ipv4” source address=“203.0.113.0/24” port port=“443” protocol=“tcp” accept’
- sudo firewall-cmd --reload
三 应用层安全配置
- 启用 HTTPS/TLS:自签或申请可信证书,配置自动续期(如 certbot);反向代理或内置 https 模块均需开启。
- 使用 Helmet 设置安全响应头(如 X-Frame-Options、X-XSS-Protection、Strict-Transport-Security 等),并按需配置 CSP。
- 严格 CORS:仅允许受信源、限定方法与头;避免通配 **Access-Control-Allow-Origin: ***。
- 防 DoS/暴力:对登录、注册、发送验证码等接口实施限流(如 express-rate-limit)。
- 防 SQL 注入/XSS:使用参数化查询/ORM、输出HTML 转义与内容净化(如 DOMPurify)。
- 错误处理:避免泄露堆栈与敏感信息,统一错误响应与告警。
四 系统与进程加固
- 启用 AppArmor(Debian/Ubuntu)或 SELinux(RHEL/CentOS)对 Node 进程进行强制访问控制,限制文件系统、网络与能力(capabilities)。
- 进程隔离与守护:使用 systemd 以专用用户运行服务,设置 PrivateTmp、ProtectSystem、NoNewPrivileges、RestrictAddressFamilies 等隔离选项;或采用 PM2 的 cluster 与日志轮转能力。
- 资源与稳定性:限制 文件描述符 与内存使用,防范异常连接与内存耗尽;为突发流量预留缓冲。
- 入侵防护:部署 Fail2ban 监控 SSH/管理接口 暴力尝试并自动封禁。
五 日志、监控与备份
- 日志策略:使用 Winston/Pino/Bunyan 等结构化日志库;通过 logrotate 或 PM2 实现按日/按大小轮转、压缩与保留策略,避免单日志过大。
- 权限最小化:日志文件与目录仅对必要用户/组可读写,例如:
- chown appuser:appgroup /var/log/myapp/*.log
- chmod 640 /var/log/myapp/*.log
- 必要时用 setfacl 精细授权,避免 777。
- 审计与告警:集中采集与保留 访问日志、错误日志、审计日志;对异常状态码、频繁失败登录、限流触发等进行实时告警。
- 备份与演练:定期备份代码、配置、证书与数据库;制定应急响应预案并演练恢复流程。