第 8 章 · 07 `sudo`:受限提权


文档摘要

第 8 章 · 07 :受限提权 本节摘要:很多人把 理解成「加在命令前面让它有 root 权限」,这只对了一半。 的真正设计是「受限提权」——它不是「给你 root」,而是「按 白名单,允许你以某个身份(常是 root)执行某些命令」。本节要讲清这个安全模型: 为什么比直接 切 root 更安全(可审计、可收回、可细粒度)、怎么用 看自己能做什么、用 安全编辑规则。理解 sudo 的安全模型,你才懂得为什么生产服务器「禁 root 直登、只允许 sudo」是标准实践。 内容来源:综合 知识整理,套用体系化模板。 学习目标 阅读完本节,你应当能够: 说清 的安全模型:基于 白名单的受限提权,而非「直接给 root」。

第 8 章 · 07 sudo:受限提权

本节摘要:很多人把 sudo 理解成「加在命令前面让它有 root 权限」,这只对了一半。sudo 的真正设计是「受限提权」——它不是「给你 root」,而是「按 /etc/sudoers 白名单,允许你以某个身份(常是 root)执行某些命令」。本节要讲清这个安全模型:sudo 为什么比直接 su 切 root 更安全(可审计、可收回、可细粒度)、怎么用 sudo -l 看自己能做什么、用 visudo 安全编辑规则。理解 sudo 的安全模型,你才懂得为什么生产服务器「禁 root 直登、只允许 sudo」是标准实践。

内容来源:综合 sudo 知识整理,套用体系化模板。

学习目标

阅读完本节,你应当能够:

  1. 说清 sudo 的安全模型:基于 /etc/sudoers 白名单的受限提权,而非「直接给 root」。
  2. 解释 sudo 相对 su - 的三大优势:可审计(记录谁执行了什么)、可收回(删规则即止)、可细粒度(限定能跑哪些命令)。
  3. sudo -l 查看自己被允许执行什么。
  4. visudo 安全编辑 /etc/sudoers(直接编辑有语法错误风险)。
  5. 读懂一条 sudoers 规则:谁 在哪台机器=(以谁的身份) 能跑什么命令
  6. 理解为什么生产实践是「禁 root 直登、配 sudo」。

一、设计动机:sudo 解决了 su - 的什么问题

不用 sudo 时,要执行需要 root 权限的命令,得用 su - 切到 root:

su - # 切到 root(需要 root 密码) # 之后所有命令都是 root 身份, 直到 exit

这种模式有几个问题:

  • 共享 root 密码:每个管理员都得知道 root 密码,密码泄露范围大、改密码要通知所有人。
  • 无审计:登入 root 后,所有操作都是「root 干的」,分不清是哪个管理员。
  • 无限制:一旦切到 root,想干啥干啥,没有「只能跑某些命令」的限制。

sudo 针对这三点重新设计:

  • 用自己的密码:你不需要 root 密码,用自己的密码 + sudoers 规则授权。
  • 审计:sudo 记录「谁、何时、以什么身份、执行了什么」到 /var/log/auth.log(或 journald)。
  • 细粒度:规则可限定「alice 只能以 root 跑 /opt/backup.sh」,而非给 alice 完整 root。

这就是为什么生产服务器的标准实践是:禁 root 直接登录(SSH 不允许 root) + 给管理员配 sudo,而非共享 root 密码。

二、高频组合与实战

基本用法

sudo command # 以 root 身份执行 command(输自己密码) sudo -u mysql command # 以 mysql 用户身份执行(不一定非 root) sudo -i # 启动一个 root 的交互式 shell(类似 su -) sudo -s # 启动 root shell 但保留当前环境 sudo !! # 用 sudo 重跑上一条命令(忘了加 sudo 时常用!)

💡 技巧:sudo !! 是「忘了加 sudo」的救命快捷键——上一条命令因权限失败时,敲 sudo !! 会以 root 重跑它。!! 是 Shell 的「上一条命令」展开。

查自己能做什么

sudo -l # 列出我(当前用户)被允许的 sudo 规则 sudo -l command # 查我能否跑某条具体命令

输出示例:

User alice may run the following commands on this host: (ALL : ALL) ALL # alice 可跑任何命令(完整 sudo 权限) (root) /opt/backup.sh # 或限定: 只能以 root 跑 backup.sh

编辑 sudoers:visudo

/etc/sudoers 是 sudo 的规则文件。绝对不要用普通编辑器直接改它——语法错了会导致 sudo 完全不可用(连 root 都进不去),且没有纠错机会。用 visudo:

sudo visudo # 用 visudo 编辑(它会做语法检查, 错了不让保存)

visudo 会在保存前验证语法,语法错会提示你修正或放弃,这是防止「锁死自己」的安全网

三、sudoers 规则语法

一条规则的标准格式:

谁 在哪台机器=(以谁的身份:组) 能跑什么命令 alice ALL=(root:root) /opt/backup.sh

常见规则示例:

# alice 可在任何机器以 root 跑任何命令(完整权限, 谨慎) alice ALL=(ALL) ALL # bob 只能以 root 跑 backup.sh, 不要密码(NOPASSWD, 服务/脚本场景) bob ALL=(root) NOPASSWD: /opt/backup.sh # dev 组成员能跑 systemctl restart nginx(限定命令) %dev ALL=(root) /bin/systemctl restart nginx # alice 能跑任何命令除了危险的几条(用 通配与排除) alice ALL=(root) ALL, !/bin/rm -rf /

⚠️ 注意:NOPASSWD 让脚本/自动化能跑 sudo 命令(无需交互输密码),但极大降低了安全性——任何能以该用户身份执行的人都能跑那条命令。仅在受控场景(如 CI、特定服务)用,且命令路径要写绝对路径、限定到具体命令。

四、踩坑与排错

坑 1:直接编辑 /etc/sudoers 锁死

sudo vim /etc/sudoers # 写错语法, 保存 # 之后: "alice is not in the sudoers file. This incident will be reported." # 且 root 也登不进去(若没配)... 灾难

永远用 visudo——它会做语法检查。万一已锁死,只能通过单用户模式/恢复控制台修复。

坑 2:NOPASSWD 不生效

通常是规则顺序问题——sudoers 是「最后匹配生效」,如果前面有 alice ALL=(ALL) ALL(需要密码),后面加 NOPASSWD 可能被前面的覆盖。把 NOPASSWD 规则放后面,或检查 sudo -l 实际生效的规则。

坑 3:sudo 密码缓存超时

sudo cmd1 # 输密码 sudo cmd2 # 5 分钟内不重输(缓存) sudo cmd3 # 超时后又问密码

默认 sudo 缓存密码 5 分钟(可配 timestamp_timeout)。脚本里连续 sudo 要么用 NOPASSWD,要么 sudo -v 提前刷新缓存。

坑 4:sudo 与重定向的权限陷阱

sudo echo "x" > /root/file # 错! 重定向是你 Shell 做的, 没 sudo 权限! echo "x" | sudo tee /root/file # 对! tee 在 sudo 下执行, 它写文件

这与第 3 章 tee 节讲的同理:重定向是 Shell 在执行 sudo 之前完成的,Shell 无权限写 /root。用 | sudo tee 才能让写操作在 sudo 权限下进行。

本节要点回顾

  1. sudo 是「受限提权」:基于 /etc/sudoers 白名单,用自己密码 + 规则,允许以某身份(常 root)跑某些命令;不是「直接给 root」。
  2. 相对 su - 的优势:用自己密码(不共享 root 密码)、可审计(记录谁干了啥)、可细粒度(限定命令)。
  3. sudo -l 查自己能做什么;sudo !! 是「忘加 sudo」的救命快捷键。
  4. visudo 安全编辑 sudoers(语法检查,防锁死);绝不要直接编辑 /etc/sudoers
  5. 规则格式:谁 主机=(身份) 命令;NOPASSWD 方便但降低安全性,谨慎用。
  6. 重定向权限陷阱:sudo cmd > /root/file 不行(重定向是 Shell 做的),用 | sudo tee
  7. 生产实践:禁 root 直登 + 配 sudo,而非共享 root 密码。

至此第 8 章「服务、定时与服务管理」全部讲完。本章让你能把程序变成「开机自启、出问题能查日志、按计划自动跑」的生产级服务。下一章(第 9 章)是全书的拔高章——Shell 脚本与组合艺术,把前面八章学的命令组合成可复用的脚本工具,衔接到姊妹篇《造轮子工程》。


发布者: 作者: 灏天文库 转发
评论区 (0)
U