为什么要限制 su
默认情况下,任何知道 root 口令的用户都能通过 su 切换成 root,而 su 留下的记录远比 sudo 单薄,等于把一个不受审计的提权入口留在系统里。pam_wheel 模块可以把 su 权限限定给 wheel 组成员:只有受控账户能切换,普通用户被直接拒绝,提权路径收敛为『普通账号 + sudo』这一条可审计的链路。
基本信息
| 模块 | pam_wheel(位于 /etc/pam.d/su 中) |
|---|---|
| 典型配置行 | auth required pam_wheel.so use_uid |
| 授权方式 | usermod -aG wheel 用户名(Debian 系历史上用 sudo 组) |
| 生效位置 | /etc/pam.d/su 的 auth 段 |
| 验证方式 | 用非 wheel 账户执行 su 应被拒绝 |
| 前提条件 | sudo 授权先落地,避免操作路径断档 |
典型使用场景
- 等保基线要求提权收敛到受控账户
- 多人共用一台运维机的场景下限制可提权人员范围
- 排查异常提权时确认 su 通道是否已被约束
- 批量交付前统一各机器的 su 策略
- 把 root 口令的知悉范围缩小到少数账户
配置与验证
配置与验证
usermod -aG wheel opsadmin # 授权账户加入 wheel 组(root 执行)
id opsadmin | tr ',' '\n' | grep wheel # 确认组成员关系已生效
# /etc/pam.d/su 中确认存在(部分版本默认被注释):
# auth required pam_wheel.so use_uid
grep -n pam_wheel /etc/pam.d/su # 检查是否已启用及所在位置
# 用非 wheel 账户实测:应提示 permission denied
su - testuser -c 'su - root -c id'配套与回退
配套与回退
grep -n 'pam_wheel' /etc/pam.d/su /etc/pam.d/su-l # 注意 su-l 是另一种登录路径,别漏改
sed -i.bak 's/^#auth\s\+required\s\+pam_wheel.so use_uid/auth required pam_wheel.so use_uid/' /etc/pam.d/su
# 上面这条在备份原文件的同时去掉注释,先确认原文件内容再执行
getent group wheel # 核对 wheel 组成员
usermod -aG wheel opsadmin2 # 新增授权账户
su - opsadmin -c 'sudo -n true; echo exit=$?' # 确认授权账户的 sudo 路径仍可用配置与效果
| 配置位置 | 典型内容 | 效果 |
|---|---|---|
| /etc/pam.d/su | auth required pam_wheel.so use_uid | 仅 wheel 组可 su |
| /etc/pam.d/su(trust 选项) | pam_wheel.so trust | 组成员 su 时不必再输口令 |
| /etc/pam.d/su-l | 同 su 的登录变体 | 覆盖通过登录方式执行的 su |
| /etc/group | wheel:x:10:opsadmin | 决定谁在授权名单里 |
| sudoers | 授权与管理命令 | 替代 su 的提权路径 |
pam_wheel 行在部分发行版中已预置但被注释(#auth required pam_wheel.so use_uid),去掉注释即生效,改动前用测试账户验证拒绝效果再推广。
收紧 su 之前先确认 sudo 授权已经落地并实测可用:否则团队原有的提权习惯被切断,又拿不到替代路径,运维会直接卡住。