Ubuntu下Node.js日志安全策略

nodeapp)及同名的组,用于运行Node.js应用,避免使用root用户。例如:sudo groupadd nodeappsudo useradd -g nodeapp nodeapp -s /bin/false/var/log/[appname]/目录下,设置目录所有者为nodeapp,权限为750(所有者可读写执行,组可读执行,其他用户无权限)。例如:sudo mkdir -p /var/log/my-node-appsudo chown nodeapp:nodeapp /var/log/my-node-appsudo chmod 750 /var/log/my-node-app640(所有者可读写,组可读,其他用户无权限),确保只有授权用户能访问。例如,在代码中使用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 {dailymissingokrotate 7compressnotifemptycreate 640 nodeapp nodeappsharedscriptspostrotate[ ! -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/*.logchmod、chown命令限制日志文件的访问权限,确保只有nodeapp用户和adm组(系统管理员)能访问。例如:sudo chown nodeapp:adm /var/log/my-node-app/*.logsudo chmod 640 /var/log/my-node-app/*.logsemanage设置日志文件上下文:sudo semanage fcontext -a -t var_log_t "/var/log/my-node-app(/.*)?"sudo restorecon -Rv /var/log/my-node-appauditd工具监控日志文件的访问和修改,设置规则记录open、write等操作。例如:sudo auditctl -w /var/log/my-node-app/ -p wa -k nodejs_logs# 查看审计日志:ausearch -k nodejs_logsWinston、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.gpgrm /var/log/my-node-app/error.log # 删除原始文件npm audit检查项目依赖的安全漏洞,使用apt更新Node.js到最新稳定版本。例如:npm audit fixsudo apt update && sudo apt upgrade nodejsSnyk、Dependabot等工具监控依赖库的安全更新,及时修复高危漏洞。