liunx 用户 ID
组 ID 同 用户 ID,不多赘述。
理论用户 ID(real user ID)
以后用户登录 shell 时所应用的的用户 ID。
无效用户 ID(effective user ID)
无效用户 ID 用于一些零碎调用权限的判断,比方,文件读 / 写。(在 linux 上文件关上权限另外算的,要判断文件系统用户 ID)
- 个别情景:
用户启动过程,主动设置无效用户 ID = 理论用户 ID
- 可执行文件设置了 set-user-ID 位:
-
可执行文件指 linux 下为
ELF
格局的可执行文件,不含相似 bash 可执行文件,能够应用file filename
查看文件的类型。$ file shell_test/test shell_test/test: Bourne-Again shell script, ASCII text executable $ file /usr/bin/passwd /usr/bin/passwd: setuid ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=191e5ed22855b6344cf01659f8ae7b7cf4767798, for GNU/Linux 3.2.0, stripped
-
set-user-ID 位可应用
chmod
命令设置,设置之后,启动该可执行文件,无效用户 ID 为该文件的属主,比方:文件 A 属于用户甲,设置了 set-user-ID 位,用户乙执行文件 A,对应过程的无效用户 ID 是乙。# 设置 set-user-ID 位前察看 $ ls -l copy -rwxrwxr-x 1 XXX XXX 28200 Jun 4 19:46 copy # 设置 set-user-ID 位 $ chmod u+s copy # 设置 set-user-ID 位后察看 # 用户的可执行权限位,由 x 变为 s $ ls -l copy -rwsrwxr-x 1 XXX XXX 28200 Jun 4 19:46 copy
- tlpi 的 9.7 节介绍的零碎调用能够扭转无效用户 ID。
保留的 set-user-ID(saved set-user-ID)
最开始无效用户 ID 的正本。过程开始执行会先依据,set-user-ID 位确认无效用户 ID,再将之保留为 saved set-user-ID
。过程执行过程中,无效用户 ID 可能扭转 (后面有提及),saved set-user-ID
不会变。
文件系统用户 ID(file-system user ID)
区别于无效用户 ID,文件系统用户 ID 用于判断是否有文件关上、批改文件属主、扭转文件权限位的权限。
- 个别情景:文件系统用户 ID 追随文件无效用户 ID 变动。
- 历史遗留:特权过程想显示调用 setfsuid() 批改文件系统用户 ID。
文件系统用户 ID 历史遗留问题的再阐明
须要文件系统用户 ID 的非凡场景形容:甲过程向乙过程发送信号;丙过程是一个特权过程;丙须要批改本人的用户 ID 用于查看过程乙对应可执行文件的信息,但又不心愿收到甲过程发送给乙过程的信号。
依据 kill(2)
的 man page 形容,整顿不同 linux 版本的判断信号是否可发送的根据(形容的是个别过程):
- 1.0 – 1.2.2:发送方的无效用户 ID = 接管方无效用户 ID;或者发送方的理论用户 ID = 接管方理论用户 ID。
- 1.2.3 – 1.3.77:发送方的无效用户 ID = 接管方无效用户 ID 或理论用户 ID。
- 1.3.78 – 至今:发送方的无效用户 ID 或理论用户 ID = 接管方保留的设置用户 ID(saved set-user-ID) 或理论用户 ID
即,对于 1.3.78 版本之前的 linux 内核,为了合乎后面形容的非凡场景(丙过程须要查看乙过程对应文件的属主信息,又不想受到发送给乙的信号),linux 设计了文件系统用户 ID,把局部文件权限独立进去。
对于 1.3.78 及当前版本的 linux 内核,只须要将丙过程的无效用户 ID 设置为乙过程的无效用户 ID,就能够实现既能查看其对应文件的属主信息,又收不到多余的信号,也就不必设置文件系统用户 ID,所以说文件系统用户 ID 就成了一个零碎遗留问题,但为了兼容以前的代码,当初的文件系统用户 ID 追随无效用户 ID 变动。
tlpi 9.5 节中也举了一个相似甲给乙发送信号的例子,但我认为它的例子中的形容实际上跟它后面的定义是自圆其说的。我举的例子是从 setfsuid(2) man page 中找到的,我认为比拟精确形容了对应的情景。
参考
- linux/unix 零碎编程手册 (tlpi) 第 9 章落第 20 章第 5 节:https://book.douban.com/subje…
- setfsuid(2):https://man7.org/linux/man-pa…
- kill(2):https://man7.org/linux/man-pa…