unix/linux,sudo,其内部结构机制
我们现在深入sudo
的“引擎室”,探究其内部的结构和运作机制。这就像我们从观察行星运动,到深入研究万有引力定律的数学表达和物理内涵一样,是理解事物本质的关键一步。
sudo
的内部结构与机制详解
sudo
的执行流程可以看作是一系列精心设计的步骤,确保了授权的准确性和安全性。以下是其核心内部机制的分解:
阶段一:初始化与参数解析
-
执行入口 (
main
函数):- 当你在命令行键入
sudo <command>
并回车后,操作系统加载并执行/usr/bin/sudo
程序。 sudo
的main()
函数开始执行。
- 当你在命令行键入
-
SetUID 生效:
- 由于
sudo
文件具有 SetUID root 权限,此时sudo
进程的 有效用户ID (EUID) 变成了root
(UID 0)。其实际用户ID (RUID) 仍然是你当前登录用户的ID。 - 这意味着
sudo
进程现在拥有了root
权限,可以访问受保护的系统资源,比如读取/etc/sudoers
文件。
- 由于
-
命令行参数解析:
sudo
解析你传递给它的命令行选项(如-u
,-i
,-l
,-E
等)和要执行的命令及其参数。
-
加载配置文件 (
sudo.conf
):sudo
读取其主配置文件,通常是/etc/sudo.conf
(或编译时指定的路径)。- 这个文件定义了
sudo
的一些全局行为,比如要加载哪些插件(策略插件、I/O插件等)、调试级别、askpass程序的路径等。 - 插件加载:如果
sudo.conf
中配置了插件,sudo
会使用dlopen()
(或类似机制)动态加载这些共享库 (.so
文件),并调用它们的初始化函数。
阶段二:策略检查与授权 (核心阶段)
这是 sudo
最核心的部分,由策略插件 (Policy Plugin) 主导。默认的策略插件是 sudoers.so
,它负责解析 /e