Unix 设置用户ID和文件访问权限 | 8月更文挑战

368 阅读5分钟

这是我参与8月更文挑战的第18天,活动详情查看:8月更文挑战

设置用户ID

为了说明问题,我们首先创建一个可执行程序,名字为setuid,其文件信息如下:

-rwxrwxr-x 1 lhl lhl 7265  4月  6 21:20 setuid*

通过finger命令可以知道系统当前的登录信息:

Login     Name       Tty      Idle  Login Time   Office     Office Phone
lhl       lhl       *:0             Apr  6 20:53 (:0)
lhl       lhl        pts/2           Apr  6 21: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. 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为进程的性质。内核进行的测试为:

  1. 若进程的有效用户ID为0(即超级用户),则允许其一切访问。所以超级用户对于整个文件系统具有至高无上的权限。
  2. 若进程的有效用户ID为该文件的所有者ID,那么:若所有者适当的访问权限位被设置,则允许访问,否则拒绝访问。适当的访问权限为,若进程为读而打开文件,则所有者读位为1,写和执行权限位类似。
  3. 若进程的有效组ID或进程的附加组ID之一等于文件的组ID,那么:若组适当访问权限位被设置,则允许访问,否则拒绝访问。
  4. 若其他用户适当的访问权限位被设置,则允许访问,否则拒绝访问。 注意按照顺序执行以上四步,如果进程符合第2步,则其不会验证3、4步;如果进程符合第3步,则其不会验证第4步。