Orange的运维学习日记--09.Linux提权su与sudo
Orange的运维学习日记–09.Linux提权su与sudo
文章目录
 在符合最小权限原则的前提下,普通用户可以通过 su 或 sudo 等工具,临时获得更高的权限来完成系统管理任务。以下是全面的提升权限操作指南与深度解析 
提权概述
- 最小权限原则
每个用户默认只能访问和操作完成工作所需的最少资源,降低误操作和安全风险。 - 临时提权场景
- 安装或更新软件
 - 管理用户和组
 - 修改系统配置文件
 - 检查或恢复系统服务
 
 - 审计与可追溯
所有提权操作应记录日志,便于事后审计和问题排查。 
su 命令详解
su(switch user)用于切换到另一个用户身份执行命令或启动交互式 Shell
功能对比
su usernamesu - username/etc/profile、~/.bash_profilesu / su -root常见用法示例
# 切换到 root(非登录 Shell)su# 切换到 root(登录 Shell)su -# 切换到指定用户(非登录 Shell)su laowang# 切换到指定用户(登录 Shell)su - laowang# 以指定用户身份执行单条命令su -l laowang -c \'id\'
操作要点
- 
输入的是目标用户的密码(例如
root密码),非自身用户密码。 - 
建议使用登录 Shell (
su -),确保配置文件生效。 - 
无法以
/sbin/nologin用户登录,除非指定可登录的 Shell:
su -l adm -s /bin/bash 
sudo 命令详解
sudo 允许指定用户以其他用户(默认为 root)身份执行授权命令,无需知道目标用户密码,并在系统日志中记录操作

基本语法
sudo [-u 用户名] 命令
主要特性
- 以自身密码认证,避免泄露 
root密码 - 精细化授权:只允许执行 
sudoers中列出的命令 - 操作日志记录在 
/var/log/secure(或/var/log/auth.log) - 支持时间戳免密:默认 5 分钟内无需重复输入密码
 
配置方式
- 
编辑主配置:
visudo # 安全编辑 /etc/sudoers - 
或者创建子配置文件:
cat > /etc/sudoers.d/50_adminops <<EOF# 允许 wheel 组成员执行所有命令%wheel ALL=(ALL) ALL# 用户 laowang 无密码执行所有命令laowang ALL=(ALL) NOPASSWD:ALL# 定义命令别名并授予 bob 用户Cmnd_Alias USERMGMT = /sbin/useradd, /sbin/usermod, /sbin/userdelbob ALL=(ALL) USERMGMTEOFchmod 440 /etc/sudoers.d/50_adminops 
使用示例
# 以 root 权限执行sudo id# 以 wwwrun 用户执行sudo -u wwwrun whoami# 以交互式登录 Shell 执行sudo -i# 执行用户管理命令(仅当 bob 被授权)sudo useradd newuser
sudo 实现原理
- setuid 二进制
/usr/bin/sudo标记有 setuid root(权限-rwsr-xr-x),任何用户执行它时,进程立即以root身份运行。 - 策略解析
使用内部库(libsudoers)加载并解析/etc/sudoers及/etc/sudoers.d/*。 - PAM 认证
调用 PAM 模块(如pam_unix.so)验证调用者身份,通常是输入用户自己的密码。 - 时间戳机制
在/var/db/sudo/或/var/run/sudo/记录认证时间戳,在timestamp_timeout期限内免密重用。 - UID/GID 切换
进程切换到目标用户身份(setgid()、setuid()),并根据env_keep或env_reset设置保留或清除环境变量。 - I/O 及审计
记录命令执行日志,支持Defaults log_input, log_output插件化架构,能接入外部审计系统。 
为什么 sudo 不需要目标账户密码
在 Linux 中,权限由进程的用户标识(UID)和组标识(GID)决定。sudo 能让普通用户以另一个目标用户(通常是 root)的身份运行命令,却无需知道目标用户的密码,核心原因在于以下几个方面:
- sudo 二进制标记为 setuid root
安装后,/usr/bin/sudo的文件权限会带有s位(如-rwsr-xr-x),意味着无论谁执行这个程序,内核都会先将它的进程 UID 设置为 root(UID=0)。此时,sudo 进程就拥有了 最高权限。 - 使用者身份验证与授权由 sudo 自身完成
- 当普通用户运行 
sudo command时,sudo 进程(此时已经是 root 身份)首先调用 PAM(Pluggable Authentication Modules)要求用户输入 自己 的密码,验证“就是本人”在操作。 - 验证通过后,sudo 解析 
/etc/sudoers*中的策略,确认该用户是否被授权以哪个目标身份(默认 root)执行哪些命令。 
 - 当普通用户运行 
 - 内核级切换 UID,无需目标账户密码
既然 sudo 进程本身已经是 root 级别,后续它只需调用setuid(target_uid)或setgid(target_gid)就能把进程切换到目标用户的身份,执行后续命令。内核允许 root 以任何账户身份切换,因此不需要“目标账户密码”来解锁或授权。 - 安全与审计设计
- sudo 要求输入调用者的密码,是为了防止他人随意在该终端提权,同时确保操作可归因。
 - 目标账户(如 root)密码保持私密,只有在直接以 
su切换到目标用户时才需要。 - sudo 会把执行过的命令记录到系统日志(如 
/var/log/secure),保留审计轨迹。 
 
sudo 的信任链是:
- 内核信任 sudo 程序(setuid root),
 - sudo 验证调用者身份并检查策略,
 - 一旦授权,通过内核赋予调用者目标用户的 UID/GID。
 因此,不需要目标用户密码,只要调用者通过 sudo 的身份验证并符合策略,就能被授予目标用户的权限。
安全最佳实践
- 最小授权:只允许必要用户执行必要命令,避免使用 
ALL或NOPASSWD:ALL。 - 配置分离:将自定义规则放在 
/etc/sudoers.d/,避免直接修改主文件。 - 环境隔离:使用 
Defaults env_reset清理危险环境变量,同时保留必需项。 - 审计增强:开启 
log_input和log_output,记录命令输入输出。 - 定期审计:检查 
/etc/sudoers*配置、/var/log/secure日志,排查越权风险。 
综合案例
- 
设立运维组
groupadd adminopsusermod -aG adminops alicecat > /etc/sudoers.d/adminops <<EOFCmnd_Alias USERMGMT = /sbin/useradd, /sbin/usermod, /sbin/userdel%adminops ALL=(ALL) USERMGMTEOFchmod 440 /etc/sudoers.d/adminops - 
验证
sudo useradd bob # 成功sudo userdel bob # 成功sudo rpm -qa # 被拒绝 
el
 %adminops ALL=(ALL) USERMGMT
 EOF
 chmod 440 /etc/sudoers.d/adminops
- 验证```bashsudo useradd bob # 成功sudo userdel bob # 成功sudo rpm -qa # 被拒绝


