Node.js日志在Debian上的安全性分析
一 威胁与风险概览
二 安全基线配置清单
三 关键配置示例
const express = require('express');
const morgan = require('morgan');
const fs = require('fs');
const path = require('path');
// 安全脱敏 token
morgan.token('password', (req) =>
req.body && req.body.password ? '******' : '-'
);
morgan.token('safe-ip', (req) => {
const ip = req.ip || '';
return ip.replace(/(\d+)\.(\d+)\.(\d+)\.(\d+)/, '$1.$2.*.*');
});
morgan.token('filtered-query', (req) => {
const q = new URLSearchParams(req.query).toString();
['id','phone','email'].forEach(k => { if (q.includes(k+'=')) q = q.replace(k+'=([^&]*)', k+'=***'); });
return q;
});
// 生产安全格式
morgan.format('secure', ':safe-ip - :remote-user [:date[iso]] ":method :url" :status :response-time ms');
const app = express();
// 仅记录异常或需要审计的请求
app.use(morgan('secure', {
skip: (req, res) => process.env.NODE_ENV === 'production' && res.statusCode < 400 && req.method === 'GET'
}));
sudo mkdir -p /var/log/myapp
sudo chown -R node:node /var/log/myapp
sudo chmod 0700 /var/log/myapp
# 应用内创建文件时 mode 0600,或由 logrotate 的 create 0640 控制
/var/log/myapp/*.log {
daily
rotate 7
compress
missingok
notifempty
create 0640 root adm
postrotate
systemctl reload myapp.service >/dev/null 2>&1 || true
endscript
}
const fs = require('fs');
const crypto = require('crypto');
const algorithm = 'aes-256-cbc';
const key = crypto.scryptSync(process.env.LOG_SECRET, 'salt', 32);
const iv = crypto.randomBytes(16);
const cipher = crypto.createCipheriv(algorithm, key, iv);
const input = fs.createReadStream('app.log');
const output = fs.createWriteStream('app.log.enc');
output.write(iv); // 前缀 IV
input.pipe(cipher).pipe(output);
提示:加密密钥需妥善管控(如 KMS/Secrets Manager),并做好密钥轮换与备份。
四 集中化与合规要点
五 快速加固清单
| 检查项 | 推荐值/做法 | 说明 |
|---|---|---|
| 日志库与级别 | Winston/Pino/Bunyan;生产以 error/warn/info 为主 | 避免滥用 debug |
| HTTP 日志格式 | 自定义 morgan 格式并脱敏 | 不用 combined/common |
| 目录/文件权限 | 目录 0700;文件 0600;属主 node:node | 仅必要主体可读写 |
| 轮转与保留 | daily;rotate 7;compress;create 0640 root adm | 防膨胀与便于审计 |
| 传输加密 | TLS 到集中式日志平台 | 防窃听 |
| 存储加密 | 极敏感日志用 crypto/GPG 加密 | 降低泄露影响 |
| 集中化与告警 | ELK/Graylog + SIEM 规则告警 | 实时检测与响应 |
| 审计事件 | 登录/登出、权限与配置变更 | 满足审计与合规 |
| 监控与趋势 | Kibana/Grafana 仪表盘与阈值告警 | 运营与安全可视化 |