1. 最小化敏感信息记录
避免在日志中记录密码、API密钥、信用卡号、个人身份信息(PII)等敏感数据。可通过日志过滤(如Winston的ignore选项)或正则表达式脱敏(如用***替换手机号、身份证号)实现,从源头降低泄露风险。
2. 使用安全成熟的日志库
选择支持安全特性的日志库(如Winston、Pino、Bunyan),这些库提供日志级别控制、结构化日志、传输加密等功能。例如,Winston可通过transports配置将日志发送到加密的远程服务器,Bunyan支持JSON格式的结构化日志,便于后续分析和过滤。
3. 配置日志轮转与归档
使用logrotate工具或日志库的轮转功能(如Winston的winston-daily-rotate-file),定期分割、压缩旧日志文件(如按天分割,保留30天),防止日志文件过大导致磁盘溢出或难以管理。配置示例:
# /etc/logrotate.d/nodejs-app
/var/log/nodejs/app.log {
daily
rotate 30
compress
missingok
notifempty
create 0640 www-data adm
postrotate
systemctl restart nodejs-app
endscript
}
这能避免单个日志文件包含过多历史敏感信息,同时减少存储压力。
4. 加密日志文件
对存储的日志文件进行加密,防止未经授权的访问。常用方法:
gpg --encrypt命令手动加密日志文件,或通过logrotate的postrotate脚本自动加密(如上述配置中添加gpg --output app.log.gpg --encrypt --recipient your@email.com app.log);winston-gpg等库,在日志写入时自动加密(如将日志发送到加密的HTTP服务器或本地加密文件)。加密后的文件需安全存储密钥(如使用密钥管理服务KMS)。5. 严格控制访问权限
通过文件系统权限限制日志文件的访问范围:
chmod设置日志文件权限为640(所有者可读写,所属组可读,其他用户无权限);chown将日志文件所有者设置为运行Node.js进程的用户(如www-data),组设置为需要访问日志的运维用户(如adm);/var/www),建议存放在专用目录(如/var/log/nodejs)。6. 监控与审计日志
使用监控工具(如Prometheus+Grafana、ELK Stack、Graylog)实时监控日志文件的访问、修改和删除操作,设置异常警报(如频繁读取日志文件、未经授权的删除)。定期审计日志内容,检查是否有敏感信息泄露或异常行为(如大量登录失败记录)。
7. 保持系统与依赖更新
定期更新Ubuntu系统(sudo apt update && sudo apt upgrade)、Node.js版本(通过nvm或NodeSource PPA)及相关依赖库(如Winston、Bunyan),修复已知的安全漏洞(如日志库的反序列化漏洞、文件系统权限漏洞),降低被攻击的风险。
8. 避免日志记录敏感上下文
在错误处理中,避免将完整的错误堆栈(可能包含环境变量、数据库连接字符串)记录到日志中。可使用try-catch捕获错误,仅记录错误消息和必要上下文(如error.message、request_id),防止敏感信息泄露。