RedHat 7/8及衍生系统中限制直接提权至root的权限分级配置方案咨询
嗨,针对你提出的这种分级提权+最小权限管控的需求,在RedHat 7/8及衍生系统上完全可以通过sudo配置结合IdM(FreeIPA)的用户组管理来实现,我帮你梳理下具体的实现思路和配置方向:
一、先搞定IdM侧的用户组与账号规划
首先在IdM里做好基础的用户和组划分,确保权限边界清晰:
- 创建
ssh_users组:所有允许直接SSH登录服务器的普通用户都加入这个组 - 创建
domain_admins组:域管理员用户加入此组,不要把这个组加入ssh_users,确保他们无法直接SSH登录 - 创建
sys_engineers_adm组:给那些需要最终提权到root的系统工程师对应的<user>.adm账号加入此组 - 创建
audit_users组:把<user>.isso这类审计账号加入此组 - 给每个Domain Admin用户关联对应的
<user>.adm账号(比如用户jdoe对应jdoe.adm),并将普通用户jdoe加入ssh_users组
二、限制SSH登录权限
修改SSH配置,确保只有ssh_users组的用户能登录服务器:
- 编辑
/etc/ssh/sshd_config,添加或修改以下行:AllowGroups ssh_users - 重启sshd服务生效:
systemctl restart sshd
这样Domain Admins组的用户直接SSH会被拒绝,必须先登录自己的普通用户账号。
三、核心:sudoers分级提权规则配置
建议不要直接修改主/etc/sudoers文件,而是在/etc/sudoers.d/目录下创建单独的配置文件(权限设为0440),这样更便于管理和排查。
1. 允许普通用户切换到自身对应的<user>.adm账号
创建/etc/sudoers.d/01-ssh-users-to-adm,内容如下:
# 允许ssh_users组的用户仅切换到自己对应的.adm账号 Defaults!/bin/su - *.adm !requiretty %ssh_users ALL=(ALL) NOPASSWD: /bin/su - ${USER}.adm
这里用${USER}变量实现精准匹配,确保用户jdoe只能切换到jdoe.adm,避免越权。
2. 控制<user>.adm账号的root提权权限
创建/etc/sudoers.d/02-adm-to-root:
# 拒绝非系统工程师的adm用户提权到root %adm_users ALL=!/bin/su - root,!/usr/bin/sudo -i,!/usr/bin/sudo su - root # 允许系统工程师的adm用户提权到root %sys_engineers_adm ALL=(root) NOPASSWD: /bin/su - root,/usr/bin/sudo -i
这里%adm_users是你在IdM中创建的所有<user>.adm账号所属的组,通过黑名单规则限制普通域管理员的adm账号无法直接提root,仅开放给系统工程师组的adm账号。
四、审计账号的特殊日志权限配置
创建/etc/sudoers.d/03-audit-log-permissions,给<user>.isso这类审计账号配置日志删除权限,同时限制其他用户(除root外)无法删除日志:
# 允许审计用户删除指定路径的日志文件 %audit_users ALL=(root) NOPASSWD: /bin/rm -rf /var/log/*,/var/log/**/* # 拒绝其他用户删除日志(root不受此限制) ALL ALL=!/bin/rm -rf /var/log/*,!/bin/rm -rf /var/log/**/*
注意:这里的日志路径可以根据你的实际环境调整,确保只开放必要的日志目录权限,避免误删其他系统文件。
五、Ansible自动化实现思路
如果要批量在多台服务器上部署这套配置,推荐用Ansible编写角色来自动化:
- 编写一个Ansible角色,包含以下核心任务:
- 配置sshd_config的
AllowGroups规则,确保只有ssh_users能登录 - 复制上述三个sudoers配置文件到目标服务器的
/etc/sudoers.d/目录,并用visudo -cf验证配置语法正确性 - 同步IdM的用户组信息(可以用Ansible的
freeipa模块或调用ipa命令) - 触发sshd和sudo服务重启(如果配置有变更)
- 配置sshd_config的
- 示例Playbook片段:
- name: 配置分级提权权限 hosts: all roles: - role: privilege-escalation-tiering tasks: - name: 确保sshd配置正确 lineinfile: path: /etc/ssh/sshd_config regexp: '^AllowGroups' line: 'AllowGroups ssh_users' validate: '/usr/sbin/sshd -t -f %s' notify: restart sshd - name: 部署sudoers配置文件 copy: src: "{{ item.src }}" dest: "/etc/sudoers.d/{{ item.dest }}" mode: 0440 validate: 'visudo -cf %s' loop: - { src: 'files/01-ssh-users-to-adm', dest: '01-ssh-users-to-adm' } - { src: 'files/02-adm-to-root', dest: '02-adm-to-root' } - { src: 'files/03-audit-log-permissions', dest: '03-audit-log-permissions' } notify: restart sudo handlers: - name: restart sshd service: name: sshd state: restarted - name: restart sudo service: name: sudo state: restarted
参考方向
你可以参考RedHat官方文档里的以下内容:
- Sudo配置指南:里面详细讲解了sudo的规则语法、变量使用和权限控制
- IdM(FreeIPA)用户组管理文档:学习如何将IdM组与sudo规则集成
- RedHat安全加固指南:里面有最小权限配置的最佳实践
备注:内容来源于stack exchange,提问作者Maxs728

