设置用户ID
为了说明问题,我们首先创建一个可执行程序,名字为setuid,其文件信息如下:
-rwxrwxr-x1lhllhl72654月621:20setuid*
通过finger命令可以知道系统当前的登录信息:
LoginNameTtyIdleLoginTimeOfficeOfficePhone
lhllhl*:0Apr620:53(:0)
lhllhlpts/2Apr621:02(:0)
下面介绍一下Unix系统中与进程相关的各个ID的详细信息。Unix系统中与一个进程相关的ID有6或更多,如下表所示:
注:
1.实际用户ID和实际组ID一般在登录时取自口令文件中的登录项(保存于/etc/passwd文件中)。通常,在一个登录会话期间这些值并不改变,但是超级用户进程可以改变它们(8.10节参加exec系函数)。
2.有效用户ID、有效组ID以及附加组ID决定了我们的文件访问权限。
3.保存的设置用户ID和保存的设置组ID在执行一个程序时包含了有效用户ID和有效阻ID的副本(8.11节说明setuid函数时,将说明它们的作用)
4.通常,一个进程执行期间,其有效用户ID即为实际用户ID,有效组ID即为实际组ID。例如,系统当前的登录用户为lhl,即实际用户ID为1000,(用户lhl所对应的UID),实际用户组ID为1000(用户组lhl所对应的GID)。当执行setuid可执行程序时,该进程的有效用户ID和有效组ID即为1000。但是,进程在运行时如果需要具有文件所有者才能有的权限时,其有效用户ID就必须为文件所有者ID。要达到这一效果,可以通过修改文件的访问权限为set-user-ID位(设置用户ID位),这样在执行此程序时,进程的有效用户ID即为文件的所有者ID。同样,也可以设置set-group-ID(设置用户组ID位),可以是进程的有效组ID为文件的所有者ID。举个使用set-user-ID的例子,修改过Linux系统用户登录密码的人都知道passwd命令,该命令需要修改/etc/passwd和/etc/shadow文件,但是这两文件的所有者都是toot用户,如何使普通用户也可以通过passwd命令修改上述两个文件,可以通过设置passwd的set-user-ID位,这样普通用户就在passwd运行期间就可以拥有root用户已到达修改登录密码的功能。但是,由于set-user-ID赋予了进程额外的权限,所以在系统中使用时需谨慎。
文件访问权限##
说完了,设置用户ID和设置用户组ID,接下来该说一下文件的访问权限问题。Unix系统的所有类型的文件都具有相应的文件访问权限。每个文件拥有9个权限位,从左到右三个为一组,共分为三组,其分别代表所有者权限,所有者组权限以及其他用户权限。9个权限位分为三类权限分别为读(r)、写(w)、执行(x)。
对于文件的权限的使用应注意以下几个规则:
1.当需用文件的名字打开一个文件时,对于改名字中包含的每一级目录都应该具有可执行权限。所以对于目录,其执行权限通常被称为搜索位。例如,但需要打开/usr/include/stdio.h文件时,需要对//usr/user/include具有执行权限,最后需要对要打开的文件具有适当的权限。
对于目录文件其读权限和执行权限的意义不同。读权限允许度目录,获取该目录中所有文件名的列表,注意不能访问目录中文件的详细信息。当一个目录是我们要访问文件的路径中一部分时,对该目录的执行权限使我们可通过该目录访问到该文件。
如果PATH环境变量制定了一个我们不具有执行权限的目录,那么shell决不会在该目录下找到可执行文件。
2.为了在一个目录中创建(或者删除)一个文件,必须对该目录具有写权限和执行权限。
进程每次打开、创建、删除一个文件时,内核就进行文件的访问权限的测试,这个过程涉及文件的所有者(st_uid和st_gid)、进程的有效ID(有效用户ID和有效组ID)以及附加组ID(若支持的话)。其中,两个所有者ID为文件的性质,而两个有效ID和附加组ID为进程的性质。内核进行的测试为:
若进程的有效用户ID为0(即超级用户),则允许其一切访问。所以超级用户对于整个文件系统具有至高无上的权限。
若进程的有效用户ID为该文件的所有者ID,那么:若所有者适当的访问权限位被设置,则允许访问,否则拒绝访问。适当的访问权限为,若进程为读而打开文件,则所有者读位为1,写和执行权限位类似。
若进程的有效组ID或进程的附加组ID之一等于文件的组ID,那么:若组适当访问权限位被设置,则允许访问,否则拒绝访问。
若其他用户适当的访问权限位被设置,则允许访问,否则拒绝访问。
注意按照顺序执行以上四步,如果进程符合第2步,则其不会验证3、4步;如果进程符合第3步,则其不会验证第4步。
原文链接:https://blog.csdn.net/lhl_blog/article/details/69680980