Ubuntu上Node.js安全防护实践
sudo apt update && sudo apt upgrade,修补操作系统及软件包漏洞,降低被攻击风险。curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash安装nvm,避免系统包管理器固定版本的安全滞后问题,支持灵活切换版本。nodeuser)并通过chown -R nodeuser:nodeuser /path/to/app设置目录权限,降低权限滥用风险。ufw(Ubuntu默认防火墙)仅开放必要端口(如HTTP 80、HTTPS 443),命令示例:sudo ufw allow 443/tcp;若需限制IP访问,可添加sudo ufw allow from 192.168.1.100 to any port 443,仅允许可信IP连接。sudo apt install certbot python3-certbot-nginx),配置Node.js服务器使用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, (req, res) => {
res.writeHead(200);
res.end('Secure connection established\n');
}).listen(443);
```。
express-validator(Express框架)或DOMPurify(前端/后端通用)过滤用户输入,防止SQL注入、XSS(跨站脚本)等攻击。示例(Express):const { body, validationResult } = require('express-validator');
app.post('/submit',
body('username').isLength({ min: 3 }).trim().escape(),
body('email').isEmail().normalizeEmail(),
(req, res) => {
const errors = validationResult(req);
if (!errors.isEmpty()) return res.status(400).json({ errors: errors.array() });
// 处理合法输入
}
);
```。
helmet中间件自动配置安全头,如X-Frame-Options(防点击劫持)、X-XSS-Protection(启用浏览器XSS过滤器)、Content-Security-Policy(限制资源加载),示例:app.use(helmet())。express-rate-limit限制客户端请求频率(如每分钟60次),防止DDoS攻击;通过body-parser的limit选项限制请求体大小(如100KB),避免大请求耗尽服务器资源。示例:const rateLimit = require('express-rate-limit');
const limiter = rateLimit({ windowMs: 60 * 1000, max: 60 }); // 1分钟内最多60次请求
app.use(limiter);
const bodyParser = require('body-parser');
app.use(bodyParser.json({ limit: '100kb' }));
```。
winston),避免泄露敏感信息(如数据库结构、服务器路径)。示例:app.use((err, req, res, next) => {
console.error(err.stack); // 记录到日志
res.status(500).send('Something broke!');
});
```。
npm audit检查项目依赖中的已知漏洞,npm outdated查看过时依赖,及时更新到安全版本;对于无法修复的漏洞,可使用snyk等工具监控。bcrypt或scrypt对用户密码进行哈希处理,避免明文存储。示例(bcrypt):const bcrypt = require('bcrypt');
const saltRounds = 10;
const plainPassword = 'userPassword123';
bcrypt.hash(plainPassword, saltRounds, (err, hash) => {
if (err) throw err;
// 存储hash到数据库
});
// 验证密码
bcrypt.compare(plainPassword, hash, (err, result) => {
if (result) console.log('Password matched!');
else console.log('Password did not match!');
});
```。
winston或bunyan等日志库记录应用活动(如请求、错误、登录),配置logrotate按日期或大小轮换日志文件(如保留90天、压缩旧日志),防止日志文件过大占用磁盘空间。示例(winston):const winston = require('winston');
const logger = winston.createLogger({
level: 'info',
format: winston.format.combine(
winston.format.timestamp(),
winston.format.json()
),
transports: [
new winston.transports.File({ filename: 'logs/error.log', level: 'error' }),
new winston.transports.File({ filename: 'logs/combined.log' })
]
});
logger.info('Application started');
```。
pm2(进程管理工具)监控Node.js应用状态(如CPU、内存使用率),设置告警(如进程崩溃时重启、内存超过阈值时通知)。示例:pm2 install pm2-logrotate(日志轮换)、pm2 monit(实时监控)。