1. 系统与软件包更新
保持Ubuntu系统和所有软件包为最新版本,及时修补已知安全漏洞。使用sudo apt update && sudo apt upgrade -y命令手动更新,或通过sudo apt install unattended-upgrades配置自动更新,确保系统底层安全。
2. Node.js版本管理
使用**Node Version Manager (nvm)**安装和管理Node.js,避免通过系统包管理器安装固定版本(可能停止安全更新)。安装命令:curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash,之后通过nvm install node安装最新稳定版,并用nvm use node切换。
3. 依赖管理
定期使用npm audit扫描项目依赖项,修复已知漏洞;结合Snyk等第三方工具增强漏洞检测。通过package.json指定依赖的固定版本(如"express": "4.18.2"),并使用package-lock.json或yarn.lock锁定依赖版本,防止意外升级引入风险。
4. 权限与用户管理
避免以root用户运行Node.js应用,创建具有最小权限的专用用户(如deploy)。创建用户:sudo adduser deploy,添加sudo权限:sudo usermod -aG sudo deploy;通过sudo visudo配置sudo权限,限制用户仅能执行必要命令。
5. 安全配置
https模块配置服务器,示例代码:const https = require('https');
const fs = require('fs');
const options = { key: fs.readFileSync('path/to/key.pem'), cert: fs.readFileSync('path/to/cert.pem') };
https.createServer(options, (req, res) => { res.writeHead(200); res.end('Hello world\n'); }).listen(443);
const helmet = require('helmet'); app.use(helmet());。6. 输入验证与清理
对用户输入进行严格验证和清理,防止XSS、SQL注入等攻击。使用express-validator库验证输入格式(如长度、类型),示例代码:
const { check, validationResult } = require('express-validator');
app.post('/upload', [
check('filename').isLength({ min: 1 }).withMessage('文件名至少1个字符'),
check('content').isLength({ min: 1 }).withMessage('内容至少1个字符')
], (req, res) => {
const errors = validationResult(req);
if (!errors.isEmpty()) return res.status(422).json({ errors: errors.array() });
// 处理上传逻辑
});
使用DOMPurify库清理HTML内容,防止XSS攻击。
7. 日志与监控
实施日志记录和实时监控,及时发现异常活动。使用bunyan等日志库记录应用日志(如请求、错误),示例:
const bunyan = require('bunyan');
const log = bunyan.createLogger({ name: 'my-app', level: 'info', streams: [{ stream: process.stdout }] });
log.info('Application started');
集成New Relic、Datadog等监控工具,监控应用性能和安全事件(如异常请求频率)。
8. 其他最佳实践
eval()、setTimeout()的字符串参数等,防止代码注入攻击。sudo aa-status,调整策略以进一步限制权限。.env文件或系统环境变量存储敏感信息(如数据库密码、API密钥),避免硬编码在代码中。