Node.js 应用在 Linux 环境下运行时,日志可能面临以下安全风险: - 敏感信息泄露(如密码、API密钥、用户数据) - 日志篡改或删除 - 日志文件权限过大 - 日志存储不足导致重要信息丢失 - 日志注入攻击
// 使用中间件过滤敏感信息
app.use((req, res, next) => {
const sanitize = (obj) => {
if (!obj) return obj;
const sensitiveKeys = ['password', 'creditCard', 'token', 'apiKey'];
return Object.keys(obj).reduce((acc, key) => {
acc[key] = sensitiveKeys.includes(key) ? '***REDACTED***' : obj[key];
return acc;
}, {});
};
console.log({
method: req.method,
url: req.url,
headers: sanitize(req.headers),
body: sanitize(req.body)
});
next();
});
# 设置适当的日志文件权限
chmod 640 /var/log/nodejs/app.log
chown nodejs:adm /var/log/nodejs/app.log
使用 logrotate
配置:
/var/log/nodejs/*.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
create 640 nodejs adm
sharedscripts
postrotate
systemctl restart nodejs-service
endscript
}
推荐使用以下工具增强日志安全: - Winston + Morgan:结构化日志记录 - Bunyan:JSON格式日志,便于分析 - ELK Stack (Elasticsearch, Logstash, Kibana):集中式日志管理
# 使用GPG加密日志文件
gpg --encrypt --recipient 'security@yourcompany.com' /var/log/nodejs/app.log
process.on('uncaughtException', (err) => {
logger.error('Uncaught Exception:', {
error: err.message,
stack: err.stack
});
// 根据严重程度决定是否退出
if (err.critical) process.exit(1);
});
process.on('unhandledRejection', (reason, promise) => {
logger.error('Unhandled Rejection at:', {
promise: promise,
reason: reason
});
});
// 记录关键操作
function auditLog(user, action, target, status) {
logger.info('AUDIT', {
timestamp: new Date().toISOString(),
user: user.id,
ip: user.ip,
action,
target,
status
});
}
通过以上措施,可以显著提高Linux环境下Node.js应用的日志安全性,保护敏感数据并满足合规要求。