> 技术文档 > Orange的运维学习日记--09.Linux提权su与sudo

Orange的运维学习日记--09.Linux提权su与sudo


Orange的运维学习日记–09.Linux提权su与sudo

文章目录

  • Orange的运维学习日记--09.Linux提权su与sudo
    • 提权概述
    • su 命令详解
    • sudo 命令详解
    • sudo 实现原理
    • 为什么 sudo 不需要目标账户密码
    • 安全最佳实践
    • 综合案例

在符合最小权限原则的前提下,普通用户可以通过 susudo 等工具,临时获得更高的权限来完成系统管理任务。以下是全面的提升权限操作指南与深度解析


提权概述

  • 最小权限原则
    每个用户默认只能访问和操作完成工作所需的最少资源,降低误操作和安全风险。
  • 临时提权场景
    • 安装或更新软件
    • 管理用户和组
    • 修改系统配置文件
    • 检查或恢复系统服务
  • 审计与可追溯
    所有提权操作应记录日志,便于事后审计和问题排查。

su 命令详解

su(switch user)用于切换到另一个用户身份执行命令或启动交互式 Shell

功能对比

方式 Shell 类型 加载环境 环境变量来源 su username 非登录 Shell 不加载目标用户启动脚本 保留原用户的大部分环境 su - username 登录 Shell 加载 /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)身份执行授权命令,无需知道目标用户密码,并在系统日志中记录操作

Orange的运维学习日记--09.Linux提权su与sudo

基本语法

sudo [-u 用户名] 命令

主要特性

  • 以自身密码认证,避免泄露 root 密码
  • 精细化授权:只允许执行 sudoers 中列出的命令
  • 操作日志记录在 /var/log/secure(或 /var/log/auth.log
  • 支持时间戳免密:默认 5 分钟内无需重复输入密码

配置方式

  1. 编辑主配置:

    visudo # 安全编辑 /etc/sudoers
  2. 或者创建子配置文件:

    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_keepenv_reset 设置保留或清除环境变量。
  • I/O 及审计
    记录命令执行日志,支持 Defaults log_input, log_output 插件化架构,能接入外部审计系统。

为什么 sudo 不需要目标账户密码

在 Linux 中,权限由进程的用户标识(UID)和组标识(GID)决定。sudo 能让普通用户以另一个目标用户(通常是 root)的身份运行命令,却无需知道目标用户的密码,核心原因在于以下几个方面:

  1. sudo 二进制标记为 setuid root
    安装后,/usr/bin/sudo 的文件权限会带有 s 位(如 -rwsr-xr-x),意味着无论谁执行这个程序,内核都会先将它的进程 UID 设置为 root(UID=0)。此时,sudo 进程就拥有了 最高权限
  2. 使用者身份验证与授权由 sudo 自身完成
    • 当普通用户运行 sudo command 时,sudo 进程(此时已经是 root 身份)首先调用 PAM(Pluggable Authentication Modules)要求用户输入 自己 的密码,验证“就是本人”在操作。
    • 验证通过后,sudo 解析 /etc/sudoers* 中的策略,确认该用户是否被授权以哪个目标身份(默认 root)执行哪些命令。
  3. 内核级切换 UID,无需目标账户密码
    既然 sudo 进程本身已经是 root 级别,后续它只需调用 setuid(target_uid)setgid(target_gid) 就能把进程切换到目标用户的身份,执行后续命令。内核允许 root 以任何账户身份切换,因此不需要“目标账户密码”来解锁或授权。
  4. 安全与审计设计
    • sudo 要求输入调用者的密码,是为了防止他人随意在该终端提权,同时确保操作可归因。
    • 目标账户(如 root)密码保持私密,只有在直接以 su 切换到目标用户时才需要。
    • sudo 会把执行过的命令记录到系统日志(如 /var/log/secure),保留审计轨迹。

sudo 的信任链是:

  • 内核信任 sudo 程序(setuid root),
  • sudo 验证调用者身份并检查策略,
  • 一旦授权,通过内核赋予调用者目标用户的 UID/GID。

因此,不需要目标用户密码,只要调用者通过 sudo 的身份验证并符合策略,就能被授予目标用户的权限。


安全最佳实践

  • 最小授权:只允许必要用户执行必要命令,避免使用 ALLNOPASSWD:ALL
  • 配置分离:将自定义规则放在 /etc/sudoers.d/,避免直接修改主文件。
  • 环境隔离:使用 Defaults env_reset 清理危险环境变量,同时保留必需项。
  • 审计增强:开启 log_inputlog_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 # 被拒绝