1.与进程关联的用户ID和组ID
与一个进程关联的ID有一下几个:
实际用户ID和实际组ID标识我们究竟是谁。通常在一个会话间值是不会改变的,但是超级用户进程有方法改变
他们,在以后的进程控制中会进行说明。
有效用户ID,有效组ID以及附加组ID决定了我们的文件访问权限。
保存的设置用户ID(setuid)和保存的设置组ID(setgid)在执行一个程序时包含了有效用户ID和有效组ID的
副本。
通常,有效用户ID等于实际用户ID,有效组ID等于实际组ID。
每个文件都有一个所有者和组所有者,所有者由stat结构中的st_uid成员表示,组所有者由st_gid成员表示。
当执行一个程序文件时,进程有效用户ID通常就是实际用户ID,有效组ID通常是实际组ID,但是可以设置文件
的设置用户ID(set-user-ID)位和设置组ID(set-group-ID
)位,如果设置了设置用户ID位,则进程在执行该
程序时就具有该程序所有者的权限(进程的有效用户ID设置为程序所有者用户ID),如果设置了设置组ID位,
则进程在执行该程序时就具有该程序的组所有组
的权限
(进程的有效组ID设置为程序组所有者ID)
。
设置用户ID位和设置组ID位都包含在st_mode值中。可以使用宏S_ISUID和S_ISGUID测试。
2.文件的访问权限
每个文件都有9个访问权限位,可将它们分成3类,如下图:
它们都包含在<sys/stat.h>文件中。
下面说明一些文件访问权限的一些规则:
1.如果我们要访问一个文件,必须要对该文件绝对路径中包含的所有目录都具有执行权限。
实践如下:
yan@yan-vm:/home$ ll
total 16
drwxr-xr-x 4 root root 4096 Jun 4 13:03 ./
drwxr-xr-x 23 root root 4096 Apr 12 20:43 ../
drwx------ 3 normaluser normalgroup 4096 Jun 12 11:23 normaluser/
drwx------ 25 yan yan 4096 Jun 12 11:27 yan/
yan@yan-vm:/home$ cat /home/yan/test
123
yan@yan-vm:/home$ chmod u-x yan/
yan@yan-vm:/home$ cat /home/yan/test
cat: /home/yan/test: Permission denied
yan@yan-vm:/home$
上面的yan目录被去掉x权限后,yan目录的用户yan也无法访问目录里面的文件。
2.为了在一个目录中创建新文件,必须要对目录具有写权限和执行权限。
实践如下:
yan@yan-vm:/home$ ll
total 16
drwxr-xr-x 4 root root 4096 Jun 4 13:03 ./
drwxr-xr-x 23 root root 4096 Apr 12 20:43 ../
drwx------ 3 normaluser normalgroup 4096 Jun 12 11:23 normaluser/
d--------- 25 yan yan 4096 Jun 12 11:27 yan/ (目录没有任何权限)
yan@yan-vm:/home$ chmod u+w yan/
yan@yan-vm:/home$ ll
total 16
drwxr-xr-x 4 root root 4096 Jun 4 13:03 ./
drwxr-xr-x 23 root root 4096 Apr 12 20:43 ../
drwx------ 3 normaluser normalgroup 4096 Jun 12 11:23 normaluser/
d-w------- 25 yan yan 4096 Jun 12 11:27 yan/ (增加w权限)
yan@yan-vm:/home$ touch yan/a.txt
touch: cannot touch `yan/a.txt': Permission denied (生成文件失败)
yan@yan-vm:/home$ chmod u+x yan/
yan@yan-vm:/home$ ll
total 16
drwxr-xr-x 4 root root 4096 Jun 4 13:03 ./
drwxr-xr-x 23 root root 4096 Apr 12 20:43 ../
drwx------ 3 normaluser normalgroup 4096 Jun 12 11:23 normaluser/
d-wx------ 25 yan yan 4096 Jun 12 11:27 yan/ (增加执行权限权限)
yan@yan-vm:/home$ touch yan/a.txt (成功生成文件)
yan@yan-vm:/home$
3.为了在一个目录中删除现有的文件,必须对包含该文件的目录具有写权限和执行权限。
4.如果用6个exec函数中的任何一个执行某个文件,都必须对该文件具有执行权限,该文件还必须是一个普通文件。
进程每次打开、创建和删除一个文件时,内核要进行文件访问权限测试:
1.若进程的有效用户ID是0(超级用户),则允许访问。
2.若进程的有效用户ID等于文件的所有者ID(也就是该进程拥有此文件),那么:若所有者的适当访问权限位(读,
写,执行)
被
设置,
则允许访问,否则拒绝访问。
3.若进程的有效组ID或进程的附加组ID之一等于文件的组ID,那么若组适当的访问权限位被设置,则允许访问,否则
拒绝访问。
4.若其他用户适当的访问权限位被设置,则允许访问,否则拒绝访问。
3.新文件、目录的所有权
新文件、目录的用户ID设置为进程的有效用户ID,关于组ID,POSIX.1允许实现选择下列之一作为新文件的组ID:
1.新文件的组ID可以是进程的有效组ID。(在ubuntu中使用这种实现)
2.新文件的组ID可以是它所在的目录的组ID。