
1. 项目概述为什么要在Linux服务器上搞“三权分立”最近在给一个金融客户的系统做等保三级测评的加固对方审计老师提了个硬性要求所有生产服务器的操作系统账号权限必须实现“三权分立”。这词儿听起来挺唬人其实就是把系统管理员的权力拆开不让一个人既当“裁判员”又当“运动员”。在Linux世界里这通常意味着要把传统的、拥有至高无上权力的root用户给“架空”把它的权限分给三个不同的角色系统管理员、安全管理员和审计管理员。你可能觉得服务器嘛有个root密码不就行了搞这么复杂干嘛我一开始也这么想但真正深入金融、政务这些对安全要求严苛的领域你就会发现单靠一个root账号和复杂的密码策略根本防不住内部风险。想象一下如果运维人员A拥有全部权限他既可以修改业务配置又能清空操作日志万一出了事儿连个追查的痕迹都留不下。等保三级的要求核心就是“可审计、可追溯、权限最小化”。“三权分立”就是这个理念在操作系统层面的落地它强制实现了权限的制衡。系统管理员负责日常运维但不能动审计日志安全管理员负责策略配置但不能直接操作业务审计管理员专门看日志但没有任何修改权限。三个人互相监督谁也别想一手遮天。这次要做的就是在CentOS 7/Rocky Linux 8这类主流的企业级Linux发行版上不依赖任何第三方商业软件纯粹利用系统自带的sudo和visudo工具搭建一套符合等保三级要求的“三权分立”权限体系。整个过程涉及用户规划、sudoers策略精细编写、日志审计配置等多个环节任何一个细节没考虑到都可能被测评机构扣分。下面我就把这次实战配置的全过程、踩过的坑以及核心的sudoers规则写法毫无保留地分享出来。2. 核心思路与角色权限设计拆解在动手敲命令之前我们必须先把三个角色的权责边界画清楚。照搬等保的条文没用得把它翻译成Linux系统里具体能执行和不能执行的命令集合。2.1 三权角色定义与职责映射我们设计三个系统用户组和对应的用户用组来管理权限是更清晰的做法系统管理员 (sysadmin)核心职责日常系统运维。包括软件安装yum、服务启停systemctl、进程管理、基础网络配置、磁盘空间管理等。权限边界不能查看或修改审计日志文件不能修改其他用户的密码不能修改sudoers文件本身。他的目标是“维持系统运行”。类比就像大楼的物业工程部可以维修水电、打扫卫生但不能调看监控录像也不能修改门禁规则。安全管理员 (secadmin)核心职责负责安全基线。包括用户账号的创建、删除、密码策略设置chage、防火墙规则配置firewall-cmd、sudoers策略的修改这是关键、以及关键系统文件如/etc/passwd,/etc/shadow,/etc/ssh/sshd_config的权限管理。权限边界不能直接重启业务服务不能安装非授权的软件包不能清空或修改系统日志。他的目标是“制定并守护安全规则”。类比就像公司的安保部和HR的结合体负责制定门禁规则、审核人员进出但不负责具体办公设备的维修。审计管理员 (auditadmin)核心职责专职审计与监督。拥有读取所有系统日志/var/log/secure,/var/log/messages,/var/log/audit/等的权限特别是sudo命令的执行日志。可以使用journalctl、ausearch等工具进行日志分析。权限边界只有只读权限。不能执行任何修改系统状态、文件、配置的命令。他的目标是“记录一切只读不写”。类比就像独立的审计员或监控室值班员可以查看所有区域的监控录像和操作记录但无权操作任何设备。2.2 技术实现路径选择为什么是sudo实现权限分离主要有三种思路1用su切换2用权限位setuid的特殊程序3用sudo。前两种在安全性和灵活性上都有明显缺陷。su需要知道目标用户的密码不符合权限最小化和密码保密原则。setuid程序编写复杂容易引入安全漏洞。sudo是当前最成熟、最灵活的方案。它不需要知道root密码通过/etc/sudoers文件精细控制某个用户能以谁的身份、运行哪些命令、在哪些主机上运行。更重要的是sudo自带完整的日志功能所有通过sudo执行的命令都会被记录到/var/log/secure默认或专门的审计日志中天然满足审计要求。我们的核心工作就是为上面定义的三个角色编写三套不同的、高度细化的sudoers规则。这里最大的挑战在于“粒度控制”既要给够权限让他们能干活又要严防越权。比如给系统管理员yum权限时必须禁止他使用yum erase或yum remove来删除关键的审计或安全组件。3. 实操准备与环境初始化理论清晰后我们进入实战环节。假设我们在一台全新的Rocky Linux 8.6服务器上操作。3.1 创建用户与用户组首先创建三个核心用户组和对应的用户。我习惯用useradd命令的-r参数创建系统用户不创建家目录UID在特定范围但为了管理方便这里创建普通用户。# 创建三个核心用户组 sudo groupadd sysadmin sudo groupadd secadmin sudo groupadd auditadmin # 创建系统管理员用户加入sysadmin组 sudo useradd -m -G sysadmin sysadmin1 sudo passwd sysadmin1 # 设置一个强密码 # 创建安全管理员用户加入secadmin组 sudo useradd -m -G secadmin secadmin1 sudo passwd secadmin1 # 创建审计管理员用户加入auditadmin组 sudo useradd -m -G auditadmin auditadmin1 sudo passwd auditadmin1 # 可选创建一个运维用户组用于存放其他普通运维人员他们可以继承sysadmin的部分权限 sudo groupadd ops sudo useradd -m -G ops ops1 sudo passwd ops1注意在生产环境中这些账号的密码必须符合强密码策略长度、复杂度、定期更换并且建议与LDAP/AD域账号集成实现统一认证。这里为了演示使用本地密码。3.2 备份与visudo安全操作规范接下来要修改/etc/sudoers文件这是整个配置中最危险的一步。这个文件语法严格一旦写错可能导致所有sudo权限失效甚至把自己锁在系统外面。务必遵守以下铁律永远使用visudo命令编辑visudo会在保存前检查语法如果出错会提示避免直接vim /etc/sudoers导致系统瘫痪。先备份sudo cp /etc/sudoers /etc/sudoers.bak.$(date %Y%m%d)在测试环境验证所有规则先在非生产的测试机上验证通过再应用到生产环境。保留一个应急的root会话在修改sudoers时务必打开另一个已登录的root终端会话。如果新配置导致无法sudo还可以用这个root会话回滚。4. 核心sudoers策略编写详解现在进入最核心的部分为三个角色编写sudoers策略。我们将策略写在/etc/sudoers.d/目录下的独立文件中这是推荐的做法便于管理。每个文件对应一个角色或一个功能模块。4.1 系统管理员 (sysadmin) 策略系统管理员需要的是“执行权”但必须是受控的。我们创建一个文件/etc/sudoers.d/10-sysadmin。sudo visudo -f /etc/sudoers.d/10-sysadmin文件内容如下每一行我都加了详细注释# 系统管理员策略 - 允许执行日常运维命令禁止接触审计和安全配置 # 规则生效于sysadmin组的成员 %sysadmin ALL(ALL) NOPASSWD: /usr/bin/systemctl status *, /usr/bin/systemctl start *, /usr/bin/systemctl stop *, /usr/bin/systemctl restart *, /usr/bin/systemctl reload * # 说明允许管理所有服务的状态、启动、停止、重启、重载。但注意这里没有包含 enable/disable开机自启因为那属于系统配置变更更应由安全管理员控制。 %sysadmin ALL(ALL) NOPASSWD: /usr/bin/yum install *, /usr/bin/yum update *, /usr/bin/yum check-update # 说明允许安装、更新软件包检查更新。明确禁止了 yum remove 和 yum erase防止误删关键组件。 %sysadmin ALL(ALL) NOPASSWD: /usr/sbin/ss, /usr/bin/netstat -tulnp, /bin/ps aux, /usr/bin/top, /usr/bin/htop # 说明允许使用网络和进程查看工具用于故障排查。这些都是只读命令。 %sysadmin ALL(ALL) NOPASSWD: /bin/df -h, /usr/bin/du -sh *, /bin/lsblk, /usr/sbin/fdisk -l # 说明允许查看磁盘和文件系统使用情况同样是只读。 %sysadmin ALL(ALL) NOPASSWD: /bin/cat /var/log/messages, /bin/cat /var/log/cron # 说明允许查看部分系统日志用于判断系统状态。但明确禁止查看 /var/log/secure 和 /var/log/audit/审计日志。 %sysadmin ALL(ALL) NOPASSWD: /usr/bin/tail -f /var/log/messages, /usr/bin/tail -f /var/log/myapp/*.log # 说明允许实时追踪应用日志方便排障。 # 关键禁止项通过 ! 来显式拒绝某些命令防止通过路径或其他方式绕过 %sysadmin ALL(ALL) !/usr/bin/passwd, !/usr/sbin/visudo, !/bin/vi /etc/sudoers*, !/bin/cat /var/log/secure*, !/bin/cat /var/log/audit/*, !/usr/sbin/ausearch, !/usr/sbin/aureport # 说明禁止修改密码、编辑sudoers、查看审计日志。这是实现“权责分离”的关键。实操心得sudoers中命令的路径必须使用绝对路径防止通过设置PATH环境变量来执行恶意程序。可以使用which command来查找命令的绝对路径。另外通配符*要谨慎使用比如systemctl *就太危险了必须明确列出允许的操作。4.2 安全管理员 (secadmin) 策略安全管理员权限更大但更聚焦。创建文件/etc/sudoers.d/20-secadmin。sudo visudo -f /etc/sudoers.d/20-secadmin# 安全管理员策略 - 负责用户、权限和核心安全配置 %secadmin ALL(ALL) NOPASSWD: /usr/sbin/visudo, /usr/bin/vi /etc/sudoers*, /usr/bin/cat /etc/sudoers* # 说明核心权限允许修改和查看sudoers文件本身这是安全管理员的核心职责。 %secadmin ALL(ALL) NOPASSWD: /usr/sbin/useradd, /usr/sbin/userdel, /usr/sbin/usermod, /usr/bin/passwd, /usr/bin/chage # 说明允许管理用户账号、密码和密码策略chage。 %secadmin ALL(ALL) NOPASSWD: /usr/sbin/groupadd, /usr/sbin/groupdel, /usr/sbin/groupmod # 说明允许管理用户组。 %secadmin ALL(ALL) NOPASSWD: /bin/chown, /bin/chmod # 说明允许修改文件所有者和权限用于修复错误权限或设置安全基线。 %secadmin ALL(ALL) NOPASSWD: /usr/bin/systemctl enable *, /usr/bin/systemctl disable * # 说明允许设置服务开机自启或禁用这是系统安全配置的一部分比如禁用不必要的服务。 %secadmin ALL(ALL) NOPASSWD: /usr/bin/firewall-cmd * # 说明允许管理firewalld防火墙的所有规则。这是网络安全的关键。 %secadmin ALL(ALL) NOPASSWD: /usr/sbin/semanage, /usr/sbin/restorecon, /usr/bin/chcon # 说明允许管理SELinux策略如果启用这是等保三级的高阶要求。 # 关键禁止项安全管理员不应直接操作业务和审计日志 %secadmin ALL(ALL) !/usr/bin/systemctl start *, !/usr/bin/systemctl stop *, !/usr/bin/systemctl restart *, !/usr/bin/yum install *, !/bin/cat /var/log/audit/*, !/usr/sbin/ausearch # 说明禁止启停服务、安装软件、查看原始审计日志。他只能配置策略不能直接“动手”。注意事项给secadmin开放visudo权限是风险最高的操作。必须确保secadmin账号的密码强度极高并且操作行为本身会被sudo日志和auditd审计守护进程记录。在实际中甚至可以要求secadmin执行visudo时需要另一个管理员如sysadmin进行二次验证这需要更复杂的PAM或双人授权系统支持。4.3 审计管理员 (auditadmin) 策略审计管理员的策略最简单也最严格只读。创建文件/etc/sudoers.d/30-auditadmin。sudo visudo -f /etc/sudoers.d/30-auditadmin# 审计管理员策略 - 只读权限专注于日志审计 %auditadmin ALL(ALL) NOPASSWD: /usr/bin/cat /var/log/secure*, /usr/bin/cat /var/log/audit/*, /usr/bin/tail -f /var/log/audit/audit.log # 说明允许查看所有安全及审计日志文件。 %auditadmin ALL(ALL) NOPASSWD: /usr/sbin/ausearch, /usr/sbin/aureport # 说明允许使用SELinux审计工具 ausearch 和 aureport 进行高级日志查询和分析。 %auditadmin ALL(ALL) NOPASSWD: /usr/bin/journalctl * # 说明允许使用journalctl查看所有系统日志。注意journalctl可能包含敏感信息但审计员需要这些信息。 %auditadmin ALL(ALL) NOPASSWD: /bin/cat /var/log/messages*, /bin/cat /var/log/cron*, /bin/ls -la /var/log/ # 说明允许查看其他系统日志和日志目录列表。 # 关键限制审计员只能以root身份运行这些命令且只能读。不需要显式写禁止项因为没允许的就是禁止的。 # 但为了绝对安全可以强制命令在只读模式下运行如果命令支持的话。 Defaults:%auditadmin !syslog, !log_input, !log_output # 说明Defaults关键字用于设置默认选项。这里禁止审计员通过sudo执行命令时记录输入输出到syslog避免审计日志本身被污染。重要技巧对于审计员我们甚至可以使用sudo的NOEXEC功能如果支持或者通过rbash受限bash来限制其shell能力确保他无法在系统中执行任何 shell 操作只能通过sudo运行我们明确允许的那几个只读命令。这需要额外的配置但安全性更高。5. 加固sudo日志与系统审计配置权限分好了但如果日志本身不完整、能被篡改那一切就白费了。等保三级对审计日志的要求是“完整性、保密性和可用性”。我们需要对sudo日志和系统审计进行加固。5.1 配置独立的、受保护的sudo日志默认sudo日志写在/var/log/secure里和其他日志混在一起。我们可以配置独立的、权限严格的日志文件。首先修改/etc/sudoers或/etc/sudoers.d/99-logging文件在顶部或单独文件中添加# 全局sudo日志配置 Defaults logfile/var/log/sudo.log Defaults log_host, log_year, log_input, log_output Defaults iolog_dir/var/log/sudo-io/%{user} Defaults !sysloglogfile指定独立日志文件路径。log_input, log_output极其重要记录用户通过sudo执行命令时所有的输入和输出。这对于事后复盘操作过程至关重要但会显著增加日志量。iolog_dir将输入输出日志按用户分开存放。!syslog不发送到系统syslog避免重复。然后创建日志文件并设置严格的权限确保只有root和auditadmin通过sudo能读sudo touch /var/log/sudo.log /var/log/sudo-io sudo chown root:root /var/log/sudo.log /var/log/sudo-io sudo chmod 600 /var/log/sudo.log # 只有root可读写 sudo chmod 700 /var/log/sudo-io # 只有root可进入 # 设置日志轮转 sudo tee /etc/logrotate.d/sudo EOF /var/log/sudo.log { weekly rotate 12 compress delaycompress missingok notifempty create 0600 root root } EOF5.2 启用并配置auditd审计守护进程sudo日志只记录sudo相关操作。系统层面的全量审计需要靠auditd。等保三级明确要求对重要用户行为、重要安全事件进行审计。安装与启动sudo yum install audit audit-libs sudo systemctl enable --now auditd添加关键审计规则编辑/etc/audit/rules.d/audit.rules在文件末尾添加# 审计所有sudoers文件的修改-w 监视文件路径-p wa 监视写和属性更改-k 给事件打标签 -w /etc/sudoers -p wa -k sudoers -w /etc/sudoers.d/ -p wa -k sudoers # 审计所有特权命令的执行-a 添加规则exit,always 表示总是记录退出事件-S execve 表示记录execve系统调用-F path 过滤路径 -a always,exit -F archb64 -S execve -F path/usr/bin/su -k privileged -a always,exit -F archb64 -S execve -F path/usr/bin/sudo -k privileged -a always,exit -F archb64 -S execve -F path/usr/sbin/visudo -k privileged # 审计用户和管理员组的变更 -w /etc/passwd -p wa -k identity -w /etc/group -p wa -k identity -w /etc/shadow -p wa -k identity # 审计审计日志文件本身的访问防篡改 -w /var/log/audit/ -p wa -k auditlog -w /var/log/sudo.log -p wa -k sudolog保存后重启auditd服务使规则生效sudo systemctl restart auditd查询审计日志审计管理员auditadmin1可以通过sudo执行以下命令查看# 查看所有打上 sudoers 标签的事件 sudo ausearch -k sudoers -ts today # 查看所有特权命令执行 sudo ausearch -k privileged # 生成日报表 sudo aureport --summary踩坑记录auditd规则配置不当可能导致内核日志(dmesg)报错“audit backlog limit exceeded”这是因为事件太多队列满了。需要调整/etc/audit/auditd.conf中的max_log_file日志文件大小和num_logs保留数量以及内核参数audit_backlog_limit。对于高负载生产环境需要精心设计规则只审计最关键的事件避免性能影响。6. 验证、测试与常见问题排查配置完成后绝不能直接上生产。必须进行严格的验证测试。6.1 分角色功能测试使用三个不同的终端分别用三个用户登录进行测试。测试系统管理员 (sysadmin1)# 应能成功 sudo systemctl status sshd sudo yum check-update sudo tail -f /var/log/messages # 应被拒绝 sudo visudo sudo cat /var/log/secure sudo passwd root测试安全管理员 (secadmin1)# 应能成功 sudo visudo # 可以打开编辑但不要乱保存 sudo useradd testuser sudo passwd testuser sudo firewall-cmd --list-all # 应被拒绝 sudo systemctl restart network sudo yum install nginx sudo ausearch -k sudoers测试审计管理员 (auditadmin1)# 应能成功 sudo cat /var/log/secure | head -20 sudo ausearch -m USER_CMD -ts recent sudo journalctl -xe # 任何修改操作都应被拒绝 sudo touch /tmp/test.txt # 会失败因为没授权任何写命令6.2 关键问题排查清单在测试和后续运维中你肯定会遇到问题。下面这个表格整理了常见症状和解决方法问题现象可能原因排查命令与解决方法用户执行sudo时提示[用户名] 不在 sudoers 文件中。此事将被报告。1. 用户不属于sudoers文件中授权的组或用户。2.sudoers.d/目录下的文件语法错误导致整个目录被忽略。1.id [用户名]确认用户所属组。2.sudo visudo -c检查所有sudoers文件语法。重点检查最近修改的文件。3. 查看/etc/sudoers中是否有#includedir /etc/sudoers.d这一行。用户执行特定命令被拒绝提示对不起用户 [用户名] 无权以 root 身份在 [主机名] 上执行 /bin/xxx。1.sudoers规则中命令路径写错。2. 命令使用了通配符但匹配不上。3. 存在!拒绝规则覆盖了允许规则。1.which command确认命令的绝对路径。2.sudo -l查看该用户被授予的精确权限列表。3.规则顺序很重要后面的规则会覆盖前面的。确保允许规则在拒绝规则之前或者逻辑正确。sudo日志 (/var/log/sudo.log) 没有记录1.sudoers中Defaults logfile路径配置错误或权限不对。2.syslog服务未运行或配置过滤。1. 检查/etc/sudoers中logfile路径。2.ls -la /var/log/sudo.log检查文件是否存在及权限应为600root所有。3. 重启rsyslog或auditd服务sudo systemctl restart rsyslog。visudo保存时报语法错误sudoers文件语法错误。不要关闭visudo仔细阅读错误信息它会提示哪一行有问题。常见的错误包括缺少逗号、组名前漏了%、命令路径包含非法字符等。用备份文件恢复或直接sudo visudo编辑主文件修复。审计日志 (audit.log) 增长过快占满磁盘audit.rules规则太宽泛记录了过多事件。1.sudo aureport --summary查看哪些事件最多。2. 优化audit.rules使用更精确的-F过滤条件减少不必要的审计。3. 调整/etc/audit/auditd.conf中的max_log_file和num_logs并确保日志轮转正常工作。6.3 上线后的持续维护要点“三权分立”不是配置完就一劳永逸的需要持续维护。定期审计日志审计管理员应定期如每天审查sudo.log和audit.log关注异常权限使用、失败尝试等。权限定期复审业务变化后sudoers规则可能需要调整。任何修改都必须经过申请、审批、测试、记录的流程并由安全管理员操作。账号生命周期管理员工离职或转岗必须立即禁用或删除其对应账号。这需要与公司HR流程联动。备份与恢复演练定期备份/etc/sudoers.d/目录和/etc/audit/目录下的配置。并演练在sudoers文件损坏后如何用备份的root会话快速恢复。结合堡垒机对于大规模服务器集群强烈建议将“三权分立”与堡垒机跳板机结合。所有运维操作必须通过堡垒机进行堡垒机自身实现三权分立并对所有会话进行录像提供更强大的审计能力。这套基于原生sudo的“三权分立”方案虽然配置起来有些繁琐但它不引入任何外部依赖稳定性高能够很好地满足等保三级在身份鉴别、访问控制和安全审计方面的要求。其核心思想——权限最小化、职责分离和完整审计——适用于任何对安全有要求的生产环境。刚开始实施可能会觉得束手束脚但习惯了这种制衡的流程后你会发现整个运维体系反而更清晰、更安全了。