liunx用户ID组ID与用户ID相同,这里不再赘述。真实用户ID(realuserID)当前用户登录shell所使用的用户ID。有效用户ID(effectiveuserID)有效用户ID用于判断一些系统调用权限,例如文件读/写。(在Linux上,文件打开权限是单独计算的,必须判断文件系统的用户ID)一般情况:用户启动进程,自动设置有效用户ID=实际用户ID。set-user-ID位是为可执行文件设置的:可执行文件是指在linux下,是ELF格式的可执行文件,不包括bash可执行文件,可以使用filefilename来查看文件的类型。$fileshell_test/testshell_test/test:Bourne-Againshell脚本,ASCII文本可执行文件$file/usr/bin/passwd/usr/bin/passwd:setuidELF64位LSB共享对象,x86-64,版本1(SYSV),动态链接,解释器/lib64/ld-linux-x86-64.so.2,BuildID[sha1]=191e5ed22855b6344cf01659f8ae7b7cf4767798,对于GNU/Linux3.2.0,可以使用chmod命令设置strippedset-user-ID位,设置后,启动可执行文件,有效用户ID为文件所有者,例如:文件A属于用户A,设置set-user-ID位,用户B执行文件A,有效用户ID对应的进程是B。#在设置set-user-ID位之前观察$ls-lcopy-rwxrwxr-x1XXXXXX28200Jun419:46copy#设置set-user-ID位$chmodu+scopy#Setset-user-IDAfterbitobservation#用户的可执行权限位,由x变为s$ls-lcopy-rwsrwxr-x1XXXXXX28200Jun419:46copytlpi9.7节描述的系统调用可以改变有效用户ID.保存组用户ID(savedset-user-ID)是原始有效用户ID的副本。当进程开始执行时,会先根据set-user-ID位确认有效的用户ID,然后保存为savedset-user-ID。在流程执行过程中,有效用户ID可能会发生变化(前面提到过),但是保存的set-user-ID不会发生变化。file-systemuserID(文件系统用户ID)不同于有效用户ID。文件系统用户ID用于判断是否有文件打开,修改文件所有者,改变文件权限位的权限。一般情况:文件系统用户ID跟在文件的有效用户ID之后。遗留问题:特权进程想要显式调用setfsuid()来修改文件系统用户ID。文件系统用户ID历史问题的重新说明需要文件系统用户ID的特殊场景描述:A进程向B进程发送信号;C进程是特权进程;C需要修改自己的用户ID来查看进程B对应的可执行文件信息,但是又不想接收进程A发给进程B的信号。根据kill(2)的manpage描述,整理出不同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(savedset-user-ID)或实际用户ID即,对于版本1.3.78之前的linux内核,为了符合For上面描述的特殊场景(进程C需要查看进程B对应的文件的所有者信息,但又不想收到发给进程B的信号),Linux设计了文件系统用户ID来分离一些文件权限。对于1.3.78及以后版本的linux内核,只需要将进程C的有效用户ID设置为进程B的有效用户ID,就可以查看到对应文件的属主信息,而不会收到多余的信号,有无需设置文件系统用户ID,因此文件系统用户ID成为系统遗留问题,但为了兼容之前的代码,当前文件系统用户ID随有效用户ID变化。tlpi的9.5节也给出了A向B发送信号的例子,但是我觉得它的例子中的描述其实和它之前的定义是矛盾的。我给出的例子是从setfsuid(2)manpage中找到的,我认为它更准确地描述了相应的情况。参考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...
