用户权限管控:三种免密切换方案对比
用户权限管控:三种免密切换方案对比
1. 需求说明(2分钟)
- 安全基线要求:
- ✅ 禁止root直接登录
- ✅ 创建专用管理用户test
- ✅ test用户免密切换root
- ❌ 禁止test用户直接执行特权命令
2. 三种方案对比(表格演示)
方案 | 实现原理 | 安全级别 | 审计能力 | 配置复杂度 |
---|---|---|---|---|
sudoers白名单 | sudo权限控制 | ★★★ | ★★☆ | 简单 |
PAM认证优化 | 认证规则修改 | ★★★★ | ★★★ | 中等 |
SSH密钥+sudo联动 | 密钥认证组合技 | ★★★★☆ | ★★★★ | 复杂 |
3. 多方案实施步骤
方案一:sudoers配置法
Bash# 创建test用户
sudo useradd -m -s /bin/bash test
echo "test:MySecurePass123!" | sudo chpasswd
# 配置sudoers(方法1)
sudo visudo -f /etc/sudoers.d/test_admin
# 添加内容:
test ALL=(root) NOPASSWD: /bin/su -
# 禁止root登录
sudo sed -i 's/^PermitRootLogin.*/PermitRootLogin no/' /etc/ssh/sshd_config
sudo systemctl restart sshd
方案二:PAM认证修改法
Bash# 修改su配置文件
sudo vim /etc/pam.d/su
# 在auth段添加:
# 允许test用户免密切换
auth sufficient pam_succeed_if.so user = test use_uid
use_uid 参数:强制PAM检查 源用户的实际UID
# 允许root用户免密切换
auth sufficient pam_rootok.so
# 检查用户是否在wheel组
auth required pam_wheel.so use_uid
方案三:SSH密钥+sudo联动
Bash# 生成密钥对
ssh-keygen -t ed25519 -f test_key -N ""
# 部署公钥
sudo mkdir /root/.ssh
sudo cp test_key.pub /root/.ssh/authorized_keys
sudo chmod 700 /root/.ssh
# 配置sudoers
echo "test ALL=(root) NOPASSWD: /usr/bin/ssh root@localhost" | sudo tee /etc/sudoers.d/ssh_sudo
4. 自动化部署脚本
Bash#!/bin/bash
# Filename: setup_sudo_su.sh
# 功能:一键部署三种切换方案
CONFIG_BACKUP_DIR="/etc/backup_$(date +%s)"
mkdir -p $CONFIG_BACKUP_DIR
# 创建test用户
if ! id test &>/dev/null; then
useradd -m -s /bin/bash test
echo "test:MySecurePass123!" | chpasswd
fi
# 备份原始配置
cp -a /etc/ssh/sshd_config $CONFIG_BACKUP_DIR/
cp -a /etc/sudoers $CONFIG_BACKUP_DIR/
cp -a /etc/pam.d/su $CONFIG_BACKUP_DIR/
# 方案1: sudoers配置
echo "test ALL=(root) NOPASSWD: /bin/su -" > /etc/sudoers.d/test_su
# 方案2: PAM优化
sed -i '/auth.*pam_rootok.so/aauth sufficient pam_succeed_if.so user = test' /etc/pam.d/su
chmod 4750 /bin/su
chgrp test /bin/su
# 方案3: SSH密钥
mkdir -p /home/test/.ssh
ssh-keygen -t ed25519 -f /home/test/.ssh/id_ed25519 -N "" -q
cat /home/test/.ssh/id_ed25519.pub >> /root/.ssh/authorized_keys
echo "test ALL=(root) NOPASSWD: /usr/bin/ssh root@localhost" > /etc/sudoers.d/ssh_sudo
# 统一安全设置
sed -i 's/^PermitRootLogin.*/PermitRootLogin no/' /etc/ssh/sshd_config
systemctl restart sshd
echo "部署完成!可用以下方式验证:"
echo "1. sudo su - root"
echo "2. su - root"
echo "3. sudo ssh root@localhost"
5. 验证与测试
Bash# 测试方法1
sudo su - root
# 预期结果:直接获得root权限
# 测试方法2(需先exit返回test用户)
su - root
# 预期结果:无需密码切换
# 测试方法3
sudo ssh root@localhost
# 预期结果:密钥自动认证登录
# 审计验证
tail -n 10 /var/log/auth.log
6. 安全防护措施
-
操作审计
# 监控su使用情况 auditctl -w /bin/su -p x -k privileged_su
-
会话锁定
# 设置10分钟超时 echo "export TMOUT=600" >> /etc/profile
-
风险命令拦截
# 禁止直接rm alias rm='rm -i'
核心配置文件说明
文件/命令 | 作用 | 关键参数说明 |
---|---|---|
/etc/sudoers.d/ | 自定义sudo权限配置 | NOPASSWD: 免密码执行 |
/etc/pam.d/su | 用户切换认证模块 | pam_succeed_if条件判断 |
/bin/su | 用户切换命令 | 权限4750实现受控访问 |
~/.ssh/authorized_keys | SSH公钥认证文件 | 限制命令执行权限 |
故障恢复方案
场景1:所有方案失效
# 单用户模式恢复步骤:
1. 重启系统,在GRUB菜单按'e'编辑
2. 在linux行尾添加 init=/bin/bash
3. 按Ctrl+X启动后执行:
mount -o remount,rw /
passwd root
systemctl default
场景2:误锁权限
# 使用已登录会话恢复:
pkexec chmod 4755 /bin/su
visudo -c # 检查sudoers配置
方案对比总结
评估维度 | 方案一 | 方案二 | 方案三 |
---|---|---|---|
维护成本 | 低(单文件配置) | 中(多文件修改) | 高(密钥管理) |
安全风险 | sudo提权风险 | 组权限控制风险 | 密钥泄露风险 |
适用场景 | 临时测试环境 | 内部管理系统 | 跨服务器管理 |
审计粒度 | 命令级别 | 用户级别 | 会话级别 |