乐趣区

关于linux:liunx-用户-ID

liunx 用户 ID

组 ID 同 用户 ID,不多赘述。

理论用户 ID(real user ID)

以后用户登录 shell 时所应用的的用户 ID。

无效用户 ID(effective user ID)

无效用户 ID 用于一些零碎调用权限的判断,比方,文件读 / 写。(在 linux 上文件关上权限另外算的,要判断文件系统用户 ID)

  • 个别情景:
    用户启动过程,主动设置 无效用户 ID = 理论用户 ID
  • 可执行文件设置了 set-user-ID 位:
  1. 可执行文件指 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
  2. 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
  3. 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 用于判断是否有文件关上、批改文件属主、扭转文件权限位的权限。

  1. 个别情景:文件系统用户 ID 追随文件无效用户 ID 变动。
  2. 历史遗留:特权过程想显示调用 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…
退出移动版