确保Node.js应用启用结构化日志(如JSON格式),包含时间戳、事件类型、用户ID、请求路径等关键信息,便于后续分析。推荐使用winston或morgan等专业日志库:
winston:支持多传输(文件、控制台)、日志级别(info/error)和结构化格式;morgan:用于记录HTTP请求日志(如请求方法、URL、状态码),可与winston集成。const winston = require('winston');
const morgan = require('morgan');
// 配置winston日志(文件+控制台)
const logger = winston.createLogger({
level: 'info',
format: winston.format.json(),
transports: [
new winston.transports.File({ filename: 'error.log', level: 'error' }),
new winston.transports.File({ filename: 'combined.log' })
]
});
// 生产环境添加控制台日志
if (process.env.NODE_ENV !== 'production') {
logger.add(new winston.transports.Console({ format: winston.format.simple() }));
}
// 使用morgan记录HTTP请求
app.use(morgan('combined', { stream: { write: message => logger.info(message.trim()) } }));
聚焦安全相关操作,记录足够上下文以追踪异常行为,包括:
app.post('/login', (req, res) => {
const { username, password } = req.body;
// 验证逻辑...
if (loginSuccess) {
logger.info({
event: 'user_login',
userId: user.id,
username: user.username,
ip: req.ip,
timestamp: new Date().toISOString()
});
res.json({ message: 'Login successful' });
} else {
logger.warn({
event: 'user_login_failed',
username: username,
ip: req.ip,
timestamp: new Date().toISOString()
});
res.status(401).json({ message: 'Invalid credentials' });
}
});
捕获未处理的异常和未处理的Promise rejection,记录错误堆栈以避免信息泄露(生产环境避免直接输出敏感错误详情):
// 捕获未处理的异常
process.on('uncaughtException', (err) => {
logger.error(`Uncaught Exception: ${err.message}`, {
error: err.stack,
timestamp: new Date().toISOString()
});
process.exit(1); // 重启应用(需配合进程管理工具如PM2)
});
// 捕获未处理的Promise rejection
process.on('unhandledRejection', (reason, promise) => {
logger.error(`Unhandled Rejection at: ${promise}, reason: ${reason}`, {
timestamp: new Date().toISOString()
});
});
winston-daily-rotate-file库限制日志文件大小(如20MB)和保留天数(如14天),避免日志文件过大占用存储或泄露历史信息:const DailyRotateFile = require('winston-daily-rotate-file');
const transport = new DailyRotateFile({
filename: 'application-%DATE%.log',
datePattern: 'YYYY-MM-DD',
zippedArchive: true, // 压缩旧日志
maxSize: '20m',
maxFiles: '14d'
});
logger.add(transport);
root或应用用户读取:chown root:nodejs /path/to/logs/*.log
chmod 640 /path/to/logs/*.log
将日志集中到日志分析平台,通过规则或机器学习检测异常行为:
index=nodejs "failed login" | stats count by ip)快速定位威胁;/var/log/auth.log,记录SSH登录、sudo使用)和Node.js应用日志,识别跨系统攻击(如攻击者通过SSH登录后篡改Node.js代码)。npm audit报告的漏洞被触发)。通过Ubuntu系统日志(journalctl或/var/log/目录)补充应用日志,获取更全面的上下文:
grep 'sshd' /var/log/auth.log,检查是否有未授权登录;grep 'sudo' /var/log/auth.log,确认是否有非管理员用户执行特权命令;journalctl -u your-node-app.service,查看应用崩溃或重启记录(可能与攻击有关)。通过以上步骤,可充分利用日志实现Ubuntu环境下Node.js应用的安全审计,及时发现并响应潜在威胁。