审计账号必须禁用交互式shell并严格限定sudo权限路径,同步校准audit.log文件权限与SELinux上下文,且应用层只读角色不等于系统级只读,需交叉审计。
审计账号必须禁用交互式 shell,否则权限形同虚设
很多团队创建了 shenji 这类审计用户,却忘了关掉它的登录能力——只要能执行 /bin/bash 或 /bin/sh,就能绕过 sudoers 里限制的命令列表,直接调用 curl、python 甚至 gdb 读取内存或提权。这不是理论风险,真实渗透测试中常被利用。
- 创建账号时务必加
-s /sbin/nologin(或/usr/sbin/nologin):useradd -s /sbin/nologin shenji - 若已创建,用
usermod -s /sbin/nologin shenji补救 - 验证是否生效:
sudo -u shenji bash应返回This account is currently not available. - 别依赖
chsh修改,它可能被普通用户调用,而usermod需 root 权限,更可控
sudoers 中只允许可信二进制,且必须限定完整路径
写 shenji ALL=(root) NOPASSWD: tail 是错的——系统 PATH 可被篡改,攻击者可放一个恶意 tail 到 /tmp 并修改 $PATH。审计账号的每一条 sudo 权限都必须带绝对路径,且仅包含审计真正需要的工具。
- 正确写法示例(注意路径):
shenji ALL=(root) NOPASSWD: /usr/bin/tail, /usr/bin/head, /usr/bin/cat, /usr/bin/less, /usr/bin/ausearch, /bin/journalctl -
journalctl要显式授权,因默认不走/var/log/文件系统,而是通过 systemd-journald socket 通信,权限机制不同 - 避免授权
more:老版本存在缓冲区溢出漏洞(CVE-2018-1000001),且功能与less重叠 - 不要加
SETENV或NOEXEC以外的 flag,NOEXEC在部分发行版上与less冲突,慎用
audit.log 文件权限和 SELinux 上下文必须同步校准
即使 sudoers 写对了,审计用户仍可能卡在“Permission denied”——因为 /var/log/audit/audit.log 默认属主是 root:root,权限是 600,连 adm 组都读不了。更隐蔽的是 SELinux:即便 chmod 改成 640,若上下文不是 auditd_log_t,ausearch 或 cat 仍会被拒绝。
- 标准修复组合:
sudo chown root:adm /var/log/audit/audit.logsudo chmod 640 /var/log/audit/audit.logsudo chcon -t auditd_log_t /var/log/audit/audit.log - 检查当前上下文:
ls -Z /var/log/audit/audit.log,输出应含auditd_log_t - 若系统用 AppArmor(如 Ubuntu),需确认
/etc/apparmor.d/usr.sbin.auditd允许shenji所用命令访问该路径 - 切勿用
chattr +i锁死日志文件——auditd 进程自己就写不进去了,会导致日志截断或服务崩溃
Redash 或 SLS 类平台中,“只读审计员”角色 ≠ Linux 系统级只读
很多人以为给审计员配个 Redash 的 viewer 角色,或阿里云 RAM 的只读策略,就万事大吉。但这两者管的是应用层行为,和底层系统日志访问完全隔离。比如 Redash 的 Change 模型能记录谁改了仪表板,但它不记录谁用 sudo tail /var/log/messages 查了内核 panic——这两个维度的日志必须分开管控、交叉比对。
- Redash 审计员账号应绑定独立数据库用户,且该用户在 MySQL 层面只授予
SELECTonredash.changes,禁止FILE权限(防读取服务器文件) - 阿里云 RAM 的
log:Get*权限只管 SLS Project 内数据,不管 ECS 实例上的/var/log/audit/;两者要分别配置、分别轮询 - 关键交叉点在于时间戳对齐:Redash 的
changes.created_at和audit.log里的msg=audit(1741825260.123:456)时间格式不同,排查时得用ausearch --start today --input-logs | grep redash主动关联
sudo 命令、开一个 Redash 数据源、授一个 RAM 权限,都要问一句:这个操作产生的日志,是否能被另一个独立角色审计到?如果不能,那这个权限本身就构成了审计盲区。










