Linux Node.js 日志安全防护实践
一 权限与目录隔离
mkdir logs && chown node:node logs && chmod 755 logs;日志文件:chmod 600 /var/log/myapp/*.log。避免使用777。必要时用 ACL 精细化授权:setfacl -m u:alice:r /var/log/myapp/app.log。二 日志内容安全与脱敏
const uuid = require('uuid');
const morgan = require('morgan');
morgan.token('requestId', (req) => req.id || (req.id = uuid.v4()));
const jsonFormat = JSON.stringify({
method: ':method', url: ':url', status: ':status',
ip: ':remote-addr', userAgent: ':filteredUserAgent',
requestId: ':requestId', responseTime: ':response-time'
});
morgan.token('filteredUserAgent', (req) => {
const ua = req.headers['user-agent'] || '';
return /InternalMonitor|SecretAgent/i.test(ua) ? '***FILTERED***' : ua;
});
const sampleRate = 0.1; // 10% 采样
app.use(morgan(jsonFormat, {
stream: { write: msg => process.stdout.write(msg) },
skip: (req, res) => {
if (res.statusCode >= 400) return false; // 保留错误
if (req.method !== 'GET') return false; // 保留非GET
return Math.random() > sampleRate; // 采样GET
}
}));
上述做法可有效降低敏感泄露与成本,并提升可观测性。三 存储轮转与保留策略
/var/log/myapp/*.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
create 0640 node node
postrotate
systemctl reload myapp >/dev/null 2>&1 || true
endscript
}
关键点:设置保留天数(如30天)、压缩、延迟压缩、按服务账户创建新文件、轮转后通知应用重开文件句柄。maxsize 与 maxFiles,作为第二道防线。四 传输加密与集中监控告警
五 运行期防护与运维审计
process.on('uncaughtException')、process.on('unhandledRejection')。npm audit、npm outdated,及时修复依赖漏洞。