温馨提示×

Node.js如何在Linux上实现安全防护

小樊
53
2025-10-01 16:16:16
栏目: 编程语言

1. 系统基础防护

  • 内核与系统加固:修改/etc/sysctl.conf文件强化内核防护,启用地址空间布局随机化(kernel.randomize_va_space=2,防止内存攻击)、防御SYN Flood攻击(net.ipv4.tcp_syncookies=1,避免大量半连接耗尽资源),并通过sysctl -p使配置生效。
  • 服务精简策略:定期通过netstat -tulnpss -tulnp扫描开放端口,仅保留必要服务(如SSH 22、HTTP 80、HTTPS 443);关闭不必要的系统服务(如Telnet、FTP),减少攻击面。

2. Node.js应用安全加固

  • 依赖管理:使用npm audit定期检查项目依赖中的已知漏洞,npm outdated查看过时依赖并及时更新;引入Snyk等第三方工具监控依赖安全,修复高危漏洞(如npm audit fix --force修复可自动修复的问题)。
  • 安全编码实践:避免使用eval()new Function()等动态执行代码的方法(易引发远程代码执行);严格验证和过滤用户输入(如使用express-validator校验表单数据、DOMPurify净化HTML内容),防止SQL注入、XSS攻击;对输出数据进行转义(如使用ejs模板引擎的<%- %>语法自动转义),避免恶意脚本执行。
  • 避免Root运行:创建专用普通用户(如nodeuser),通过chown -R nodeuser:nodeuser /app修改应用目录权限,使用sudo -u nodeuser node app.js启动应用,限制进程对系统资源的访问权限。

3. 网络安全配置

  • 防火墙设置:使用ufw(Uncomplicated Firewall)配置简单防火墙规则,仅允许必要端口对外开放(如sudo ufw allow 22/tcp允许SSH登录、sudo ufw allow 80/tcp允许HTTP、sudo ufw allow 443/tcp允许HTTPS),然后启用防火墙(sudo ufw enable);若需更细粒度控制,可使用iptables设置规则(如限制单个IP的连接数)。
  • HTTPS加密:通过Let’s Encrypt获取免费SSL证书(sudo certbot certonly --standalone -d yourdomain.com),配置Nginx或Apache反向代理,将HTTP请求转发至Node.js的HTTPS端口(443);或在Node.js中直接使用https模块(需指定证书路径),强制客户端通过HTTPS访问。
  • CORS与CSRF防护:使用cors中间件配置跨域资源共享(如app.use(cors({ origin: 'https://yourdomain.com', methods: ['GET', 'POST'] }))),限制允许的源、方法和头部;使用csurf中间件防范CSRF攻击(如app.use(csrf({ cookie: true }))),要求客户端提交CSRF Token。

4. 敏感信息管理

  • 环境变量存储:使用dotenv库加载.env文件中的环境变量(如DB_PASSWORD=yourpassword),在代码中通过process.env.DB_PASSWORD读取敏感信息,避免将密码、API密钥等硬编码在代码中;将.env文件添加到.gitignore,防止误提交至版本控制系统。
  • 加密敏感数据:用户密码不要明文存储,使用bcrypt库进行哈希加密(如const hash = await bcrypt.hash(password, 10)),验证时使用bcrypt.compare比较哈希值;敏感数据(如信用卡信息)可使用AES-256加密(如crypto模块),确保即使数据泄露也无法直接读取。

5. 监控与日志管理

  • 日志记录:使用morgan中间件记录HTTP请求日志(如app.use(morgan('combined'))),或使用winston库记录结构化日志(如logger.info('User logged in'));记录关键操作(如登录、支付、权限变更),便于后续审计。
  • 日志轮转与清理:使用logrotate工具配置日志轮转(如/etc/logrotate.d/nodeapp中设置/var/log/nodeapp/*.log { daily rotate 7 compress missingok }),每天轮转日志文件,保留7天压缩日志,避免日志文件过大占用磁盘空间。
  • 实时监控与告警:使用pm2进程管理工具监控应用状态(如pm2 monit查看CPU、内存使用率),设置告警规则(如内存超过80%时发送邮件);使用fail2ban监控SSH登录日志,自动封禁多次尝试失败的IP地址。

6. 进程与权限控制

  • 使用进程管理工具:使用pm2启动应用(如pm2 start app.js --name "myapp"),实现进程守护(崩溃后自动重启)、负载均衡(多实例运行)、日志管理(集中存储);通过pm2 save保存进程列表,pm2 startup设置开机自启。
  • 应用级权限限制:使用AppArmorSELinux限制Node.js进程的权限(如AppArmor配置文件/etc/apparmor.d/usr.bin.node中限制进程只能访问/app目录和/tmp目录),防止进程越权访问系统文件;避免将应用目录设置为777权限,使用chmod 750限制访问。

0