温馨提示×

Node.js 在 Linux 上如何实现安全配置

小樊
42
2025-09-23 02:54:38
栏目: 编程语言

1. 系统账户与权限管理

  • 禁用不必要的用户登录:除root账户外,批量锁定其他用户账户(防止未授权登录)。命令:for temp in $(cut -d ":" -f 1 /etc/passwd | grep -v "root"); do passwd -l $temp; done
  • 使用专用用户运行Node.js:创建专用用户(如nodeapp)及同组,避免以root身份运行(降低权限滥用风险)。命令:sudo groupadd nodeapp; sudo useradd -g nodeapp nodeapp -s /bin/false
  • 限制登录尝试次数:通过PAM配置(/etc/pam.d/login)限制TTY终端登录尝试次数(如auth required pam_tally2.so deny=5 unlock_time=300),防止暴力破解。

2. 系统级安全加固

  • 配置防火墙:使用ufw(Uncomplicated Firewall)限制访问,仅开放必要端口(如HTTP 80、HTTPS 443)。命令:sudo ufw allow 22/tcp; sudo ufw allow 80/tcp; sudo ufw allow 443/tcp; sudo ufw enable
  • SELinux配置:启用SELinux(强制访问控制),根据需求设置策略(如限制Node.js进程只能访问/var/www目录)。命令:setenforce 1(临时启用);修改/etc/selinux/config(永久生效)。

3. Node.js应用安全配置

  • 避免root运行:通过--uid--gid参数指定专用用户(如PM2启动时:pm2 start app.js --uid nodeapp --gid nodeapp),或使用nvm在用户级别安装Node.js。
  • 使用Helmet设置安全HTTP头:通过Helmet中间件添加X-Frame-Options(防点击劫持)、X-XSS-Protection(防XSS)等头,提升应用安全性。示例:const helmet = require('helmet'); app.use(helmet());
  • 输入验证与清理:严格验证所有用户输入(如表单、URL参数),使用validator库或正则表达式过滤特殊字符,防止SQL注入、XSS攻击。
  • 避免危险函数:禁用eval()new Function()等可执行字符串代码的函数,防止远程代码执行(RCE)。

4. 依赖与版本管理

  • 使用NodeSource仓库安装:通过NodeSource PPA安装最新稳定版Node.js(避免旧版本漏洞)。命令:curl -sL https://deb.nodesource.com/setup_20.x | sudo -E bash -; sudo apt-get install -y nodejs
  • 用nvm管理版本:使用nvm(Node Version Manager)安装和管理多版本Node.js,便于切换和升级(避免系统级权限问题)。命令:sudo npm install -g n; sudo n latest
  • 定期更新依赖:使用npm audit检查依赖项安全漏洞,npm update更新到最新版本;或使用Snyk等工具自动化漏洞扫描。

5. HTTPS与加密配置

  • 启用HTTPS:使用Let’s Encrypt生成免费SSL证书,配置Nginx反向代理(将HTTP升级为HTTPS)。示例Nginx配置:
    server { listen 443 ssl; server_name yourdomain.com; ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem; location / { proxy_pass http://localhost:3000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } ```。 
  • 环境变量管理敏感信息:使用dotenv库加载.env文件中的敏感信息(如数据库密码、API密钥),避免硬编码在代码中。命令:require('dotenv').config(); const dbPassword = process.env.DB_PASSWORD;

6. 日志与监控

  • 日志权限设置:创建专用日志目录(如/var/log/my-node-app),设置用户/组权限(chown nodeapp:nodeapp /var/log/my-node-app; chmod 750 /var/log/my-node-app);使用WinstonBunyan等日志库控制日志级别(如infoerror)。
  • 使用logrotate管理日志:创建/etc/logrotate.d/my-node-app配置文件,设置日志轮转(每天轮转、保留14天、压缩旧日志)。示例配置:
    /var/log/my-node-app/*.log { daily missingok rotate 14 compress delaycompress notifempty create 640 nodeapp nodeapp sharedscripts postrotate [ ! -f /var/run/my-node-app.pid ] || kill -USR1 `cat /var/run/my-node-app.pid` endscript } ```。 
  • 监控与告警:使用pm2的监控功能(pm2 monit)或Prometheus+Grafana监控应用性能(CPU、内存、请求量),设置异常告警(如邮件、短信)。

7. 其他安全措施

  • 速率限制:使用express-rate-limit中间件限制请求频率(如每分钟最多60次),防止DDoS攻击。示例:const rateLimit = require('express-rate-limit'); app.use(rateLimit({ windowMs: 60 * 1000, max: 60 }));
  • CORS配置:若需跨域请求,使用cors中间件限制允许的域名(如origin: 'https://yourdomain.com')、方法(如GET,POST),防止恶意跨域访问。
  • 内容安全策略(CSP):通过Helmet设置CSP,限制页面可加载的资源(如defaultSrc: ["'self'"]),减少XSS攻击风险。

0