原文链接:http://blog.csdn.net/chosen0ne/article/details/10581883
对进程校验文件访问权限包括两个部分,一是确定进程的角色(属于哪个用户或者组),二是确定对应的角色是否具有该操作的权限。
首先看第一部分。默认情况下,进程的有效角色就是当前执行这个进程的用户及其所在组。但是,文件具有设置用户ID位和设置组ID位(stat.st_mode的S_ISUID和S_ISGID),用于改变这种默认的行为,将进程的有效角色设置为文件所属的用户和组。这主要用于解决执行进程的用户或组不具备修改这个文件的权限,但却不得不对文件进行修改的情况。比如,/etc/passwd就是用了设置用户ID位,因为passwd允许任意用户修改其密码,而只有超级用户才具有对该文件的写权限,所以在普通用户执行passwd修改密码时,必须将设置用户ID位置位。这里只要记住,进程的角色只能是执行它的用户或者是它要操作的文件的用户。
文件的权限包括用户、组和其他角色的r(读)、w(写)和x(执行)。在根据进程角色检验权限时,可以分为两种:文件权限校验和目录权限校验。文件权限校验比较简单,在open文件时执行了要对文件进行的操作(O_RDONLY、O_WRONLY和O_RDWR),或者是执行一个文件,只要确定是否具有该权限即可,具体规则后文介绍。目录也是具有权限的,主要限制其所属的文件的一些操作,包括:
1. 如果要打开一个文件,必须具有文件路径中所有目录的执行权限(即,搜索文件需要目录的执行权限),比如打开文件/home/work/foo,则必须对/,/home和/home/work三个目录具有执行权限。
2. 要从一个目录删除或者添加一个文件,则必须对这个目录具有写权限和执行权限,删除文件时不需要对该文件具有相关权限。
3. 要获取一个目录下所有文件,则需要对该目录具有读权限。
在打开、创建和删除文件时,内核会进行访问权限的校验,规则如下:
1. 若进程的有效用户ID是0(即,超级用户),则允许访问。
2. 若进程的有效用户ID等于文件的所有者ID(即,进程拥有该文件),那么就要检验所有者是否具有进行该操作的权限,若具有该权限,则允许,否则拒绝。
3. 若进程的有效组ID是文件的组ID,那么检验该组是否具有进行该操作的权限,若具有该权限,则允许,否则拒绝。
4. 执行其他角色的权限检验,如果具有该权限,则允许访问,否则拒绝。
这种测试方式使用的是进程的有效用户ID和组ID,通过access可以测试进程的实际用户ID和组ID是否具有该权限。但是只能测试,而不能使用实际角色进行某个文件操作。
在进行创建一个文件时,需要确定这个文件的所有权问题。这个文件的用户就是进程的有效用户,而组ID,POSIX允许有两种实现:
1. 新文件的组ID是进程的有效组ID。
2. 新文件的组ID是它所在目录的组ID。