Ubuntu下Node.js日志安全策略
nodeapp)及同名的组,用于运行Node.js应用,避免使用root用户。例如:sudo groupadd nodeapp
sudo useradd -g nodeapp nodeapp -s /bin/false
/var/log/[appname]/目录下,设置目录所有者为nodeapp,权限为750(所有者可读写执行,组可读执行,其他用户无权限)。例如:sudo mkdir -p /var/log/my-node-app
sudo chown nodeapp:nodeapp /var/log/my-node-app
sudo chmod 750 /var/log/my-node-app
640(所有者可读写,组可读,其他用户无权限),确保只有授权用户能访问。例如,在代码中使用fs.createWriteStream时指定:const logStream = fs.createWriteStream('/var/log/my-node-app/app.log', {
flags: 'a',
mode: 0o640 // -rw-r-----
});
redactyl.js等库,在记录日志前识别并清除敏感字段(如apiKey、password、phone、creditCard等)。例如:const Redactyl = require('redactyl.js');
const redactyl = new Redactyl({ properties: ['apiKey', 'password', 'phone'] });
const userData = { name: 'John', apiKey: 'a1b2c3', phone: '1234567890' };
const safeData = redactyl.redact(userData); // 清除敏感字段
logger.info(safeData);
Winston、Pino)的日志级别(如error、warn),避免在debug或info级别记录用户密码、令牌等敏感信息。例如,Winston配置中设置level: 'error',仅记录错误日志。/etc/logrotate.d/[appname]配置文件,设置日志轮转规则(如每天轮转、保留7天、压缩旧日志、创建新文件时设置正确权限)。例如:/var/log/my-node-app/*.log {
daily
missingok
rotate 7
compress
notifempty
create 640 nodeapp nodeapp
sharedscripts
postrotate
[ ! -f /var/run/my-node-app.pid ] || kill -USR1 `cat /var/run/my-node-app.pid`
endscript
}
cron作业定期将日志备份到远程或加密存储(如/backup目录),例如每天凌晨2点备份:crontab -e
# 添加:0 2 * * * tar -czvf /backup/nodejs-$(date +\%Y-\%m-\%d).tar.gz /var/log/my-node-app/*.log
chmod、chown命令限制日志文件的访问权限,确保只有nodeapp用户和adm组(系统管理员)能访问。例如:sudo chown nodeapp:adm /var/log/my-node-app/*.log
sudo chmod 640 /var/log/my-node-app/*.log
semanage设置日志文件上下文:sudo semanage fcontext -a -t var_log_t "/var/log/my-node-app(/.*)?"
sudo restorecon -Rv /var/log/my-node-app
auditd工具监控日志文件的访问和修改,设置规则记录open、write等操作。例如:sudo auditctl -w /var/log/my-node-app/ -p wa -k nodejs_logs
# 查看审计日志:ausearch -k nodejs_logs
Winston、Pino、Bunyan等成熟日志库,它们支持日志级别控制、格式化输出、传输加密等功能。例如,Winston配置示例:const winston = require('winston');
const logger = winston.createLogger({
level: 'error',
format: winston.format.json(),
transports: [
new winston.transports.File({ filename: '/var/log/my-node-app/error.log' })
]
});
ignore或filter功能,过滤掉包含敏感信息的请求。例如,morgan(HTTP请求日志库)中排除body中的密码字段:const morgan = require('morgan');
const omitBodyFields = (fields) => (req, res, next) => {
fields.forEach(field => delete req.body[field]);
next();
};
app.use(omitBodyFields(['password', 'apiKey']));
app.use(morgan('combined'));
TLS/SSL加密传输通道。例如,Winston的Transport配置中启用tls:const winston = require('winston');
const tls = require('tls');
const fs = require('fs');
const logger = winston.createLogger({
transports: [
new winston.transports.File({
filename: '/var/log/my-node-app/secure.log',
stream: fs.createWriteStream('/var/log/my-node-app/secure.log', { tls: { ca: fs.readFileSync('ca.crt') } })
})
]
});
GnuPG或OpenSSL加密,确保即使日志文件被窃取,也无法读取内容。例如,使用GnuPG加密日志文件:gpg -c /var/log/my-node-app/error.log # 生成加密文件 error.log.gpg
rm /var/log/my-node-app/error.log # 删除原始文件
npm audit检查项目依赖的安全漏洞,使用apt更新Node.js到最新稳定版本。例如:npm audit fix
sudo apt update && sudo apt upgrade nodejs
Snyk、Dependabot等工具监控依赖库的安全更新,及时修复高危漏洞。