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

为什么 /var/log 下的文件突然不可读?
常见现象是普通用户或日志收集脚本执行 cat /var/log/syslog 或 journalctl --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 或换输出格式毫无意义。
WOC-YII是rschome.com基于yii framework 1.1.8框架所开发的一款开源简易站群管理系统。它的功能与WOC完全一样。目前版本为V1.3,新版本正在开发中,同时欢迎大家参与到开发中来! WOC-YII 1.3在1.2的基础上优化了登录系统(密码加密),优化了权限控制系统,新增seo管理功能,新增自动安装向导! 程序框架:yiiframework1.1.8 配置文件:p
- 先确认能否列出单位:
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+ 后
$FileCreateMode被file()action 的createowner/creategroup替代,旧配置可能被忽略
最常被忽略的一点:systemd-journald 默认把内核日志(kmsg)和 boot 日志写进二进制 journal,这部分不走 rsyslog 配置,也不受 /var/log 权限影响——想查它们,只能靠组权限或 sudo,没别的捷径。









