《unix环境编程》笔记-文件访问权限

时间:2022-02-04 15:17:01

文件访问权限是多用户系统的复杂机制,如何实现自己的文件不让其他用户访问,如何实现代替管理员用户实现对无权限的文件进行访问,有些文件夹不能打开是什么原因。

与每个文件相关的东西,目录看做是目录文件:

个文件都记录所属的文件类型(普通文件、目录文件、块特殊文件、字符特殊文件、FIFO、套接字、符号链接

个文件都有所属的用户和组,分别使用用户ID和组ID表示,指明文件所属的用户。

个文件都有访问权限(用户权限、组权限、其他权限)用户权限指所属的用户可否有对文件读写执行的权限,组权限说明文件所属的组是否有读写执行的权限。

个文件都有设置组ID位和设置用户ID位,其含义是“当执行此文件将进程的有效用户ID(或有效组ID)设置为文件所属的用户(或组)”此文件必须为可执行文件

这些都是在创建一个文件时候确定的,存放在磁盘上的固定信息。当然也可以修改文件的访问权限。

用户登录的时候可以读取口令文件确定登录的用户ID以及登录用户所属的组ID,登录用户的这两个信息被存在登录进程里面,之后创建的所有进程都继承这个登录信息,保存到每个进程里面,作为进程的实际用户ID和实际组ID保存,这样每个进程都有所属的用户和组,当进程调用open函数打开一个文件的时候,就要判断当前进程能否访问该文件,文件可能是属于其他用户的,可能就会无法访问(进程可能会读取文件的属性,获取文件的用户ID和进程所属的用户ID比较,不一样则无法访问),然而进程却并不使用实际的用户ID和组ID来对文件进行访问权限检查,却增加了两个量,有效用户ID和有效组ID,用这两个来对文件进行访问权限检查。

会有如下这样的情况,有个文件属于管理员账号,但我们的进程却需要修改它,这种情况必须要让进程代表管理员来对文件做出修改,假定是修改用户的登录密码,这个是存放在管理员账户的口令文件中,普通用户无法修改,只能读,只有管理员可以修改口令,那么管理员的用户ID和组ID可以通过口令文件的归属获取,这是口令文件的属性,然后把当前进程的有效用户ID和有效组ID修改为管理员的用户ID和组ID,这样再用open打开口令文件的时候就是可行的了,内核也恰好提供了这种接口,就是设置组ID位和设置用户ID位,当新创建了个进程,进程的用户ID和有效用户ID都继承父进程,然后进程再用exec执行新代码的时候就会判断设置用户ID位,如果设置则修改进程的有效用户ID为可执行文件所属的用户ID,这样无疑就会让进程表现出其他用户的权限。

这样一连串的问题就出现了,目录文件的读写权限表示什么,目录文件为什么需要执行权限位,为了open函数用O_TRUNC打开文件成功,文件必须具有哪种访问权限,在目录中创建一个文件对目录文件需要哪些访问权限,删除一个文件呢,删除一个目录呢,exec执行某个文件呢?

规则:

们用名字打开任一类型的文件时,对该名字中包含的每一个目录,包括它可能隐含的当前工作目录都必须具有执行权限。(为了打开/usr/include/stdio.h文件,需要对目录/,usr,include,都具有执行权限,对目录的读权限和执行权限意义不同,读权限允许我们读目录,获得在该目录中的所有文件名列表,执行权限可以使我们通过该目录,也就是搜索该目录,这就是对于目录的执行权限位常定义为搜索位的原因)

于一个文件的读权限决定了我们能否打开文件进行读操作。这与open函数的O_RDONLY和O_RDWR相关

于一个文件的写权限决定了我们能否打开文件进行写操作。这与open函数的O_WRONLY和O_RDWR相关

了在open函数中对一个文件进行O_TRUNC标志,必须对该文件具有写权限

了在目录中创建一个文件,必须对该目录具有写权限和执行权限

了删除一个现有的文件,必须对该文件的目录具有写权限和执行权限,对该文件本身则不需要读写权限。删除文件是删除在目录文件的相应记录,则必须对该目录具有写权限。

果用6个exec函数执行某个文件,则必须对该文件具有执行权限,且必须为普通文件。

 

内核要对open函数中的每一个路径分量进行如下检查:

1)若进程的有效用户ID是0(超级用户),则允许访问。超级用户可以管理全部的文件。

2)若进程的有效用户ID等于文件的所有者ID(也就是进程所属用户拥有此文件),那么若适当的用户权限位被置位,则允许访问。用户权限位是指,若进程为读打开该文件,则用户读位应为1,进程为写打开该文件,则用户写位应为1,若进程执行该文件,则用户执行位应为1

3)若进程的有效组ID或附加组ID之一等于文件的组ID,那么适当的组权限被置位,则允许访问。

4)若其他用户的权限位被置位,则允许访问。

假定要打开“/usr/include/stdio.h”文件:

各个路径的访问权限如下:

drwxr-xr-x  10   root   root   4096  2010-08-16 17:32  usr

drwxr-xr-x  37   root   root   4096  2010-08-16 17:46  include

-rw-r--r--      1   root   root   4096  2010-06-14  22:32  /usr/include/stdio.h

可以看到前两个分量是目录,所有用户都允许读和执行,所有判断usr和include分量的时候都允许访问,目录的执行权限位置位,则可以通过该目录,两个目录分量都属于root用户的,我们登录自己的账户,则在判断到(4)其他权限位的时候才被确定允许访问。

当获取stdio.h分量的时候,也是判断到(4)其他权限位的时候才被确定允许读访问,因为其属于root账户,我们没有对其进行写的权限,因此要为写打开该文件则必定失败。

这是最常用的一个文件 #include<stdio.h> 其中的隐含分量就是 </usr/include/>