Linux中Node.js日志安全性保障
一 身份与权限基线
sudo groupadd nodeapp && sudo useradd -g nodeapp nodeapp -s /bin/falsesudo mkdir -p /var/log/my-node-app && sudo chown nodeapp:nodeapp /var/log/my-node-app && sudo chmod 750 /var/log/my-node-appfs.createWriteStream('/var/log/my-node-app/app.log', { flags: 'a', mode: 0o640 })pm2 start app.js --uid nodeapp --gid nodeapp,并确保PM2目录(如**/home/nodeapp/.pm2**)属主一致:sudo chown -R nodeapp:nodeapp /home/nodeapp/.pm2sudo setfacl -R -m u:nodeapp:rwx /var/log/my-node-app;定期审计日志文件权限与属主,防止权限漂移。二 日志内容与输出安全
const morgan = require('morgan');
morgan.token('password', (req) => req.body?.password ? '******' : '-');
morgan.token('safe-ip', (req) => (req.ip || '').replace(/(\d+\.\d+)\.\d+\.\d+/, '$1.*.*'));
morgan.token('filtered-query', (req) => {
const q = new URLSearchParams(req.query);
['id','phone','email'].forEach(k => q.has(k) && q.set(k, '***'));
return q.toString();
});
morgan.format('secure', ':safe-ip - :remote-user [:date[iso]] ":method /:path*?" :status :response-time ms');
app.use(morgan('secure'));
morgan('dev', { skip: (req,res)=> process.env.NODE_ENV==='production' && res.statusCode<400 && req.method==='GET' })三 存储轮转与归档
/var/log/my-node-app/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
create 640 nodeapp nodeapp
sharedscripts
postrotate
[ ! -f /var/run/my-node-app.pid ] || kill -USR1 `cat /var/run/my-node-app.pid`
endscript
}
要点:按天轮转、保留14天、压缩旧日志、创建新文件时恢复正确属主与权限;如使用进程信号通知(如USR1)重开日志文件,确保应用支持。四 传输与集中监控
五 系统加固与审计
sudo semanage fcontext -a -t httpd_log_t "/var/log/my-node-app(/.*)?" && sudo restorecon -Rv /var/log/my-node-app/var/log/my-node-app/** rwk,),并重新加载配置。sudo auditctl -w /var/log/my-node-app/ -p wa -k nodejs_logs,事后用ausearch -k nodejs_logs检索。npm audit与依赖更新,降低因组件漏洞导致日志被滥用的风险。