在大多数发行版本中,两个组成员资格几乎涵盖了分析员所需的一切:adm 用于 Debian 和 Ubuntu 上的 /var/log 中的文本日志,systemd-journal 用于完整的系统日志。用 sudo usermod -aG adm,systemd-journal <user> 添加账户并开始一个新的登录会话。少数日志由于设计原因保留为仅 root 访问,特别是在 Red Hat 系列系统上的 /var/log/secure 和 /var/log/messages 以及 /var/log/audit 下的所有内容。对于这些文件,请使用范围狭窄的 sudo,而不是 root shell。
仅仅为了让某人读取日志而给予他们 root 权限是那种在下次审计或下一次事件中会出现的捷径。本指南涵盖了最小权限的方法,以及使“只需将其添加到一个组”比听起来更复杂的陷阱。
谁可以阅读什么
| Log | Debian / Ubuntu | RHEL / Rocky / Alma |
|---|---|---|
| /var/log/auth.log / /var/log/secure | root 和 adm | 仅 root |
| /var/log/syslog / /var/log/messages | root 和 adm | 仅 root |
| Web 服务器日志 | root 和 adm | 仅 root (httpd 日志目录被锁定) |
| 系统日志 (journalctl) | root, systemd-journal, adm | root, systemd-journal, wheel |
| /var/log/audit/audit.log | 仅 root | 仅 root |
确切的所有权因发行版和版本而异,因此请在设备上自行检查:
id
ls -l /var/log/auth.log /var/log/secure 2>/dev/null
getfacl /var/log/journal 2>/dev/null
选项 1:组成员资格
sudo usermod -aG adm,systemd-journal analyst
两个细节很重要。-a 不是可选的:如果没有它,usermod -G 会替换 用户的组,而不是添加到其中。而且组更改仅适用于新会话。退出并重新登录,或启动一个新的登录 shell,然后再进行测试。“我已添加了组,但它仍然显示权限被拒绝”几乎总是一个旧会话。
在 Red Hat 系列系统上,adm 无法解锁 /var/log/secure 或 /var/log/messages。这些文件在那里的 root-only。使用选项 2 或 3。
选项 2:针对 root-only 日志的狭窄 sudo
授予特定命令,而不是 shell。使用 visudo -f 创建 /etc/sudoers.d/log-readers:
%logreaders ALL=(root) NOPASSWD: /usr/sbin/ausearch, /usr/local/bin/read-secure-log
read-secure-log 是一个小型 root 拥有的脚本(模式 0755,root 拥有),它只做一件事情:
#!/bin/sh
exec /usr/bin/zcat -f /var/log/secure /var/log/secure-*
为什么使用包装器而不是在 sudoers 中使用 cat /var/log/secure*?因为在 sudoers 参数中,* 匹配任何内容,包括空格。cat /var/log/secure /etc/shadow 匹配 cat /var/log/secure*.没有参数的包装器没有这样的漏洞。
不要通过 sudo 授予 journalctl 。它打开一个分页器 (less),并且 !sh 在 less 内给你一个 root shell。要访问日志,请使用 systemd-journal 组。 选项 3:可在轮换中保持的组所有权
Option 3: Group ownership that survives rotation
直接设置 ACL 的方法直到下一次轮换时才有效:sudo setfacl -m g:logreaders:r /var/log/secure。然后文件被重新创建,ACL 消失。为了使访问保持,首先以正确的组创建新文件,在创建它们的两个位置:
- logrotate,在文件的定义中:create 0640 root logreaders
- rsyslog,在将其写入的动作上:action(type=”omfile” file=”/var/log/secure” fileGroup=”logreaders” fileCreateMode=”0640″)
在非生产环境中用 logrotate -f 进行测试,然后再部署。
容器
不要仅仅为了读取容器日志而将分析员添加到 docker 组。docker 中的成员身份等同于该主机上的 root。从日志收集器或 SIEM 获取容器日志,或者请求平台团队给予只读访问权限。
出错时
| 症状 | 可能原因 | Fix |
|---|---|---|
| usermod 后仍然权限被拒绝 | 旧会话 | 退出并重新登录 |
| 用户丢失了其他组 | usermod -G 未使用 -a | 重新添加它们;始终使用 -aG |
| journalctl 仅显示用户自己的日志 | 不在 systemd-journal(或 adm / wheel)中 | 添加该组;新会话 |
| 昨天访问有效,今天无效 | 日志轮换时 ACL 丢失 | 使用选项 3 |
| adm 对 /var/log/secure 无济于事 | Red Hat 系列文件为仅 root | 使用选项 2 或 3 |