Node.js 日志在 Ubuntu 的安全性保障
一 权限与访问控制
- 以最小权限运行应用:为 Node.js 创建专用系统用户(如 nodeuser),禁止以 root 直接运行,应用日志目录与文件均归该用户所有。示例:
sudo useradd -r -s /usr/sbin/nologin nodeuser。
- 目录与文件权限:日志目录建议 700/750(仅属主可写,必要时同组可读),日志文件 640(属主读写、同组只读、其他无权限)。示例:
sudo chown -R nodeuser:nodeuser /var/log/myapp && sudo chmod 750 /var/log/myapp && sudo chmod 640 /var/log/myapp/*.log。
- 系统日志组协作:若由系统日志组(如 adm)集中查看,可将日志组设为 adm 并使用 640,便于运维审计同时限制其他用户。示例:
sudo chown nodeuser:adm /var/log/myapp/app.log && sudo chmod 640 /var/log/myapp/app.log。
- 运行身份一致性:确保服务管理器(如 systemd)与日志目录属主一致,避免“写不进/读不到”。示例:
User=nodeuser、Group=nodeuser。
以上做法可有效降低日志被未授权读取或篡改的风险,并满足最小权限原则。
二 日志轮转与保留策略
- 使用 logrotate 集中管理轮转、压缩与清理,避免单文件过大与磁盘被占满。示例配置(/etc/logrotate.d/nodejs):
/var/log/nodejs/*.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
create 640 nodeuser adm
sharedscripts
postrotate
systemctl reload myapp.service >/dev/null 2>&1 || true
endscript
}
要点:按天轮转、保留 7 天、压缩旧日志、空文件不轮转、轮转后重建为 640 并归属 nodeuser:adm,必要时触发服务重新打开日志文件。
- 若应用内已做按大小/日期轮转(如 winston-daily-rotate-file),仍建议保留系统级 logrotate 作为兜底,防止异常情况下日志失控。
- 定期清理与归档:结合 cron 将已轮转压缩的日志打包备份到安全存储(如独立备份目录或对象存储),并执行清理策略,确保合规留存与快速恢复。
上述策略兼顾容量控制、可用性恢复与运维可观测性。
三 敏感信息与传输安全
- 避免记录敏感数据:严禁在日志中打印 密码、API Key、令牌、信用卡号 等;必要时对结构化字段做脱敏(如只保留后四位)。
- 合规与最小化:仅记录用于审计与排障的必要字段,遵循 GDPR 等数据保护要求,减少可识别个人信息(PII)的落盘。
- 传输加密:跨主机/跨机房传输日志时使用 TLS 或 SSH 隧道;集中式日志平台与采集端之间启用认证与加密通道。
- 静态加密与密钥管理:对离线归档或长期留存日志启用 GPG/OpenSSL 加密,密钥与口令集中托管(如 KMS/Vault),实施最小权限与轮换。
通过“不写敏感、加密传输、加密存储、合规留存”的组合,降低日志泄露与合规风险。
四 审计与监控告警
- 应用内安全审计:记录关键事件(登录/登出、权限变更、配置修改、敏感操作),使用结构化日志(如 JSON)便于检索与聚合。
- 系统与进程审计:启用 auditd 对日志目录与关键文件设置监控规则(如 open/write/unlink),对异常访问进行告警与取证。
- 集中式日志与 SIEM:将日志发送至 ELK Stack(Elasticsearch/Logstash/Kibana) 或 Splunk/Graylog,配置规则进行实时告警(暴力登录、异常错误率、权限变更等)。
- 运行期监控与阈值告警:对日志目录/文件大小设置阈值告警(如 100MB),结合 Monit 或监控系统触发通知,防止磁盘被日志打满导致服务异常。
- 性能与可用性:采用异步日志、合适的日志级别(生产以 info/warn/error 为主),避免高频 debug 影响 I/O 与业务稳定性。
以上措施帮助实现“可观测—可告警—可取证”的闭环安全运营。
五 快速落地清单
- 创建专用用户与目录:
sudo useradd -r -s /usr/sbin/nologin nodeuser,sudo mkdir -p /var/log/myapp && sudo chown nodeuser:nodeuser /var/log/myapp && sudo chmod 750 /var/log/myapp。
- 配置 systemd 服务:设置
User=nodeuser、Group=nodeuser,标准输出/错误由服务管理器接管或写入已授权目录。
- 部署 logrotate:创建 /etc/logrotate.d/nodejs,使用上文示例;验证:
sudo logrotate -d /etc/logrotate.d/nodejs(干跑),sudo logrotate -f /etc/logrotate.d/nodejs(强制)。
- 应用内日志配置:使用 Winston/Pino/Morgan,生产仅输出必要级别,避免记录敏感信息;必要时采用按大小/日期的轮转与压缩。
- 集中与审计:接入 ELK/Splunk/Graylog,配置关键告警;启用 auditd 对日志目录进行关键事件审计;对归档日志执行 GPG 加密与离线保管。
该清单覆盖身份、权限、轮转、脱敏、加密、审计与告警的关键环节,便于快速落地并持续优化。