普通用户默认无法查看系统级 journal 日志,需通过 systemd-journald 的三类日志权限划分(系统日志需 systemd-journal/adm 组或 root、用户日志天然可读、syslog 副本由 rsyslog 控制)、禁用组成员资格、polkit 细粒度规则(如 /etc/polkit-1/rules.d/40-restrict-journal.rules 限制非 wheel 组读取与导出)及配置 journald.conf(storage=volatile、禁用 forwardtosyslog、设置 maxretentionsec=1week)协同实现安全管控。

普通用户默认无法查看系统级 journal 日志,这是 systemd 的默认安全策略。限制的关键不是“封禁”,而是通过组权限、Polkit 策略和日志配置三方面协同控制访问范围,避免过度授权或绕过机制。
明确谁有权限读系统日志
systemd-journald 将日志按来源划分为三类,对应不同访问权限:
-
系统日志(
/var/log/journal/):含内核、服务、登录等全局信息,需属于systemd-journal或adm组,或拥有 root 权限 -
用户会话日志(
~/.local/share/systemd/journal/):仅当前用户进程日志,普通用户天然可读,无需额外授权 -
syslog 转发副本(如
/var/log/syslog):由 rsyslog 或 syslog-ng 控制,归属syslog或adm组
禁用组成员资格是最直接的管控方式
不加入特权组,就无法获得系统日志读取能力。操作前先确认现状:
- 运行
getent group systemd-journal和getent group adm查看当前有哪些用户在组内 - 用
sudo gpasswd -d username systemd-journal逐个移除不需要权限的用户 - 移除后务必让该用户完全退出所有终端会话(包括 SSH 和图形界面),重新登录才生效;
su -不继承新组设置
用 Polkit 实现操作级细粒度控制
相比 sudoers,Polkit 可按具体动作限制,例如只允许查本机服务状态,但禁止读内核日志或导出历史记录:
- 新建规则文件:
/etc/polkit-1/rules.d/40-restrict-journal.rules - 写入以下内容(拒绝非 wheel 组用户的 journal 读取与导出):
if (subject.isInGroup("wheel") === false &&
(action.id == "org.freedesktop.journal.read" ||
action.id == "org.freedesktop.journal.export")) {
return polkit.Result.NO;
}
});
保存后立即生效,无需重启服务。
从源头减少敏感日志暴露面
若业务无需长期归档或跨工具分析,可关闭持久化与转发,降低数据泄露风险:
- 编辑
/etc/systemd/journald.conf,设Storage=volatile(日志仅存于/run/log/journal/,重启即清空) - 注释或删除
ForwardToSyslog=yes,防止 journal 内容被复制进/var/log/syslog等路径 - 添加
MaxRetentionSec=1week,限制历史日志最长保留时长,避免敏感信息长期堆积











