Orange的运维学习日记--09.Linux提权su与sudo
Orange的运维学习日记–09.Linux提权su与sudo
文章目录
在符合最小权限原则的前提下,普通用户可以通过 su
或 sudo
等工具,临时获得更高的权限来完成系统管理任务。以下是全面的提升权限操作指南与深度解析
提权概述
- 最小权限原则
每个用户默认只能访问和操作完成工作所需的最少资源,降低误操作和安全风险。 - 临时提权场景
- 安装或更新软件
- 管理用户和组
- 修改系统配置文件
- 检查或恢复系统服务
- 审计与可追溯
所有提权操作应记录日志,便于事后审计和问题排查。
su 命令详解
su
(switch user)用于切换到另一个用户身份执行命令或启动交互式 Shell
功能对比
su username
su - username
/etc/profile
、~/.bash_profile
su
/ 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 # 被拒绝