三权分立不是开三个sudo全权限账号,而是用visudo精确控制每类管理员的最小命令集:系统管理员限于服务/软件/存储命令,安全管理员仅能编辑子配置文件,审计管理员仅免密运行审计工具且加noexec防逃逸,并须配合文件权限与acl隔离敏感路径。

直接给结论:三权分立不是开三个 sudo 全权限账号,而是用 visudo 精确控制每个角色能执行的命令集合,并配合文件系统权限(如 chmod、chown、setfacl)隔离敏感路径。错配一条 sudo 规则或漏设一个目录权限,就可能被测评打回。
怎么用 visudo 给三类管理员分配最小命令集
核心是拒绝“ALL=(ALL) ALL”,改用 Cmnd_Alias 分组定义职责边界:
-
系统管理员只允许操作服务、包管理、存储设备:
Cmnd_Alias SERVICES = /usr/bin/systemctl, /sbin/service, /sbin/chkconfig;Cmnd_Alias SOFTWARE = /usr/bin/yum, /usr/bin/dnf, /bin/rpm;Cmnd_Alias STORAGE = /bin/mount, /bin/umount, /sbin/fdisk - 安全管理员禁用全量
visudo编辑权限,只允许调用/usr/sbin/visudo -f /etc/sudoers.d/secadmin修改子配置——避免其篡改自身权限规则 - 审计管理员必须加
NOPASSWD:前缀,且只列审计工具:auditadmin ALL=(root) NOPASSWD: /usr/sbin/ausearch, /usr/sbin/aureport, /usr/bin/journalctl -o json;不能给/bin/cat /var/log/audit/audit.log这种裸读权限,否则可绕过auditctl的策略限制 - 所有规则末尾加
NOEXEC(如NOPASSWD: NOEXEC: /usr/sbin/ausearch),防止通过这些命令启动 shell 逃逸
为什么 /var/log/audit/audit.log 不能只靠 chmod 700
单纯 chmod 700 /var/log/audit/audit.log 不够,因为 auditd 进程以 root 身份写日志,而审计管理员用 sudo 执行 aureport 时实际仍以 root 权限运行——权限控制点在命令级,不在文件级。
- 真正有效的做法是:确保
auditadmin用户属于adm组(usermod -aG adm auditadmin),并确认/var/log/audit/目录属组为adm、权限为750 - 同时在
/etc/audit/rules.d/下启用规则文件,例如audit.rules中包含-w /var/log/audit/ -p wa -k audit_log_access,让任何非ausearch/aureport的访问行为被记录并告警 - 若用
setfacl,必须对整个/var/log/audit/目录递归设置:setfacl -R -m u:auditadmin:rx /var/log/audit/,否则子目录继承失败
哪些地方最容易被等保测评卡住
测评老师不看配置多漂亮,只验证“能否用 A 角色干 B 角色的事”——以下三点一错即不合格:
- 系统管理员执行
sudo iptables -L必须报错(安全员专属命令),但很多人把NETWORKING别名误加给了sysadmin - 审计管理员执行
sudo /usr/bin/kill 1必须拒绝,但若漏加NOEXEC或未限制PROCESSES别名范围,就能成功 -
auditctl -s输出中enabled字段必须为1,且audit_log_format为json或raw;若仍为默认no,说明审计服务没真正启用,所有aureport查询都无效
最麻烦的其实是权限继承链:比如给 secadmin 授权了 /usr/sbin/semanage,但它依赖 /etc/selinux/config 文件读写——这个文件本身权限若还是 644,普通用户就能直接改,等于白设。所以每加一条 sudo 命令,都要顺藤摸瓜查它读写哪些配置文件、是否已按角色隔离。











