CentOS上Node.js安全防护全流程指南
强化系统底层防护
sudo yum update -y更新CentOS内核、软件包及安全补丁,修复已知漏洞;/etc/passwd,禁用非必要超级用户账户;/etc/login.defs,要求密码包含大小写字母、数字和特殊字符(长度≥10位);chattr +i命令锁定/etc/passwd、/etc/shadow、/etc/group等文件,防止未授权修改;/etc/pam.d/su,仅允许wheel组用户切换至root。配置防火墙规则
sudo yum install -y firewalld启动服务并设置开机自启(sudo systemctl enable --now firewalld);sudo firewall-cmd --permanent --zone=public --add-service={http,https}添加,自定义端口(如Node.js应用的3000端口)用sudo firewall-cmd --permanent --zone=public --add-port=3000/tcp;sudo firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.100" port protocol="tcp" port="3000" accept'仅允许可信IP访问;sudo firewall-cmd --reload使规则生效。依赖项安全管理
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash安装NVM,用nvm install --lts安装最新稳定版,避免旧版本漏洞;npm audit或snyk test识别依赖项中的安全漏洞,优先修复高危问题;dotenv库加载.env文件,将数据库密码、API密钥等敏感信息存储在环境变量中,切勿提交至版本控制系统。应用代码安全实践
validator库验证用户输入(如邮箱、手机号),防止SQL注入、XSS攻击(如const validator = require('validator'); if (!validator.isEmail(email)) throw new Error('Invalid email'));mysql库的?占位符),避免直接拼接SQL语句(如connection.query('SELECT * FROM users WHERE id = ?', [userId], callback));express-session结合Redis存储会话数据,设置secret密钥(如app.use(session({ secret: process.env.SESSION_SECRET, resave: false, saveUninitialized: false }))),并对会话数据进行签名验证。安全中间件配置
const helmet = require('helmet'); app.use(helmet())设置HTTP安全头部(如Content-Security-Policy、X-Frame-Options),防止XSS、点击劫持等攻击;express-rate-limit限制客户端请求频率(如const rateLimit = require('express-rate-limit'); app.use(rateLimit({ windowMs: 15 * 60 * 1000, max: 100 }))),防范DDoS攻击;cors库精确控制允许访问的域名(如app.use(cors({ origin: 'https://trusted-domain.com' }))),避免跨域攻击。HTTPS加密通信
sudo certbot --nginx -d yourdomain.com);https模块加载证书(如const https = require('https'); const fs = require('fs'); const options = { key: fs.readFileSync('/etc/letsencrypt/live/yourdomain.com/privkey.pem'), cert: fs.readFileSync('/etc/letsencrypt/live/yourdomain.com/fullchain.pem') }; https.createServer(options, app).listen(443));app.use((req, res, next) => { if (!req.secure) res.redirect(https://${req.headers.host}${req.url}); else next(); })将HTTP请求重定向至HTTPS。权限与用户管理
nodeuser),通过chown -R nodeuser:nodeuser /path/to/app设置应用目录权限,使用sudo -u nodeuser node app.js启动应用,避免以root权限运行;755(chmod -R 755 /path/to/app),敏感文件(如.env)权限设为600(chmod 600 /path/to/.env)。日志与监控
winston或morgan记录请求、响应及错误信息(如const winston = require('winston'); const logger = winston.createLogger({ transports: [new winston.transports.File({ filename: 'error.log', level: 'error' })] });),避免日志泄露敏感信息;持续安全维护
npm audit、snyk或第三方工具(如SonarQube)定期扫描代码,修复潜在漏洞;security.txt文件),及时处理第三方报告的漏洞,发布补丁更新。