sudo的工作原理 此文不介绍sudoers文件的配置方法,只是简单介绍sudo工作流程。
工作流程 工作流程如下图,第一次用markdown写流程图,不太精细。
认证文件简介 认证文件可以理解为cookie,里面记录认证时间,在终端的PID,用户ID,终端的ttydev。 解析代码参考Github 。 认证文件以二进制保存,每个用户会有一个自己的cookie文件,放在/var/run/sudo/ts
文件夹下,文件名为用户名。 文件保存结构如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 struct timestamp_entry_v1 { unsigned short version; unsigned short size ; unsigned short type; unsigned short flags; uid_t auth_uid; pid_t sid; struct timespec ts ; union { dev_t ttydev; pid_t ppid; } u; }; struct timestamp_entry { unsigned short version; unsigned short size ; unsigned short type; unsigned short flags; uid_t auth_uid; pid_t sid; struct timespec start_time ; struct timespec ts ; union { dev_t ttydev; pid_t ppid; } u; };
有两种保存方式,通过version
进行区分,当version
值为1时使用上面的结构体;剩下的使用下面的结构体。type
字段表示这下方的union
中使用哪个字段,type
会使用以下几个值:
1 2 3 4 #define TS_GLOBAL 0x01 #define TS_TTY 0x02 #define TS_PPID 0x03 #define TS_LOCKEXCL 0x04
flags
字段自行研究吧,没有太关注。auth_uid
这个是授权用户的UID。sid
这个表示所在终端的PID,但是这个有一个东西需要注意,如果这个账户是通过别的账户su
过来的,那么他的值为最上层终端的PID,不太清楚原因。