Linux 日志权限与安全管理

1次阅读

普通用户无法读取 /var/log 下日志是因权限模型变更:/var/log/syslog 默认仅 root:syslog 可读,/var/log/journal 仅 systemd-journal 组可访问;应通过 usermod -ag 加入对应组而非 chmod,且需重新登录生效。

Linux 日志权限与安全管理

为什么 /var/log 下的文件突然不可读?

常见现象是普通用户或日志收集脚本执行 cat /var/log/syslogjournalctl --since "1 hour ago" 时直接报 Permission denied。这不是 SElinux 或 AppArmor 搞鬼(默认没开),而是 systemd-journald 和传统 syslog 的权限模型变了——/var/log/journal 默认只对 systemd-journal 组开放,而 /var/log/syslog 可能被 rsyslog 配置成仅 syslog 组可读。

  • 检查归属:ls -l /var/log/syslog,若属主是 root:syslog 且权限是 -rw-r-----,非 root 或非 syslog 组成员就进不去
  • 临时验证:用 sudo getent group syslog 看组成员,再用 groups 确认当前用户是否在其中
  • 别直接 chmod 644 —— 多数发行版(如 ubuntu 22.04+、RHEL 8+)的 rsyslog 或 systemd 会在重启后重置权限

如何让特定用户安全地读日志?

加组比改权限靠谱,但得选对组。systemd 系统优先走 systemd-journal 组(对应 journald 日志),传统 syslog 则依赖 syslog 组(对应 /var/log/*.log)。混用会漏日志。

  • 查日志来源:ls -l /var/log/journal/ 存在且非空 → 主要用 journald;ls /var/log/syslog* 有内容 → rsyslog/syslog-ng 在跑
  • 加组命令:sudo usermod -aG systemd-journal $USER(journald)或 sudo usermod -aG syslog $USER(syslog)
  • 加完必须重新登录或 newgrp syslog 才生效,su - $USER 不行,它不继承新组
  • 注意:debian/Ubuntu 默认禁用 systemd-journal 组访问,需先取消注释 /etc/systemd/journald.conf 中的 Storage=persistent 并设 ReadKMsg=yes,否则加组也白加

journalctl 权限不够时,--no-pager-o json 会失效吗?

不会。权限问题发生在读取 journal 文件或内核日志缓冲区阶段,不是输出格式导致的。但如果你看到 Failed to open Directory /var/log/journal: Permission denied,说明连索引目录都进不去,此时加 --no-pager 或换输出格式毫无意义。

  • 先确认能否列出单位:journalctl --list-units,如果报错,基本就是组权限没到位
  • 绕过文件系统读取:用 journalctl --all --no-pager(需 JournalFile= 配置允许)或启用 ForwardToSyslog=yes,把 journal 转发到 /var/log/syslog 再读
  • 避免用 sudo journalctl 查用户服务日志——它默认只显示系统级 unit,加 --user 才能看到用户 session 日志,且该日志存在 /run/user/$UID/journal,权限更细

rsyslog 配置里 $FileCreateMode 改成 0644 安全吗?

不安全。日志文件含敏感信息(认证失败 IP、命令参数、路径),0644 让所有本地用户可读,等于把审计线索公开给任意能登机的人。真正要控制的是「谁该看」,不是「能不能看」。

  • 正确做法是保持默认 $FileCreateMode 0640,然后把需要查日志的用户加入 syslog
  • 若必须开放某类日志(如 web 应用日志),单独配 if $programname == 'nginx' then /var/log/nginx/access.log,再用 $FileCreateMode 0644 + $FileOwner www-data 限定范围
  • 注意:rsyslog 8.20+ 后 $FileCreateModefile() action 的 createowner/creategroup 替代,旧配置可能被忽略

最常被忽略的一点:systemd-journald 默认把内核日志(kmsg)和 boot 日志写进二进制 journal,这部分不走 rsyslog 配置,也不受 /var/log 权限影响——想查它们,只能靠组权限或 sudo,没别的捷径。

text=ZqhQzanResources