这几天看书没看进去,整理一下几个相关的文件id,
与进程相管理的 ID有6个或更多:
实际用户id 登陆she'll决定,我们实际上是谁 通常在会话期间不会改变
实际组id
有效用户 id 用户问文件访问权限检查
有效组id
保存的设置用户id 有exec函数保存
保存的设置组id
通常有效用户id等于实际用户id,有效组id等于有效组id。但是可以在文件模式字(st_mode)中设置一个特殊标志,其含义是“当执行此文件时, 将进程的有效用户id设置为文件的所有者的用户id(st_uid).同样,文件模式中可以设置另一位,它将使得执行此文件的进程的有效组id设置为该文 件的组所有者id。在文件模式中,这两位被称为设置用户id位和设着组id位。
进程在每次打开,创建或是删除一个文件时,内核就进行文件访问权限测试,而这种测试涉及文件所有者id(st_uid&st_gid),进程的有 效id(有效用户id,有效组id)以及附加组id。两个所有者id是文件的性质,而两个有效id和附加组id则是进程性质。内核进行测试是指:
(1)若进程的有效id是0(超级用户),则允许访问。
(2) 若进程的有效用户id等于文件的所有者id(也就是该进程拥有该文件),那么:若所有者适当的访问权限位被设置,则允许访问,否则拒绝访问。适当的访问权限位指的是:若进程为读而打开该文件,则用户读位应为1;若用户位写而打开该文件,则用户写位应为1;若进程将执行该文件,则用户执行位位1.
(3)若进程的有效组ID或进程的附加组id等于文件组id,那么适当的权限位被设置,则允许执行访问,否则拒绝访问;
(4)若其它用户适当的访问权限位被设置,则允许访问,否则拒绝访问。
其中这四步按顺序执行,其中一个条件满足则判读停止。
整体的思路就是:比较所有者id与进程有效id,当条件满足时,继续查看文件对应的模式是否满足将要进行的操作。
新文件和新目录的所有权:
新文件的用户id设置为该进程的有效用户id,关于组id,则有两个选择:
(1)新文件的组id可以是进程的有效组id;
(2)新文件的组id,可以是它所在目录的id;(在linux中就有这种实现)。
保存的设置用户id主要是用在exec环境下。主要用户启动一个新的程序,通常的实现先调用fork,然后调用该函数:,在执行exec后,进程的id没有变,除此之外,执行新程序的进程还保持了原进程的下列特征:
进程id和父进程id;
实际用户id和实际组id;
附加组id
会话id
控制终端
当前工作目录
根目录
文件模式创建屏蔽字;
文件锁
未处理信号
资源限制。。。。。。。。。。。
一般而言,应该使用least privileges原则来涉及应用程序,这样可能就会遇到需要调整id,可以调用的函数setuid来设置实际用户id和有效用户id,类似的可以调用setgid来设置实际组id和有效组id。
更改规则如下,对用户和组id同样使用;
()若进程具有超级用户特权,,则setuid函数将实际用户id,有效用户id,以及保存的设置用户id设置为uid
()若进程没有超级用户特权,但是uid等于实际用户id或是保存的是设置用户id,则setuid只将有效用户id设置为uid,不改变实际的用户id和保存的设置用户id。
()如过上面的两个条件都不满足,则errno设置为EPERM,并返回-1
关于内核维护的是三个用户id,需要注意的是:
()只有超级用户才可以更改时间用户id。通常实际用户id是在用户登陆时,有login程序设置的,而且永远不会改变。因为login是一个超级用户进程,是设置所有三个用户id;
() 仅当对程序文件设置了设置用户id时,exec函数才会设置有效用户id。如果设置用户id没有设置,则exec函数不会改变有效用户id,而将其维持为原先值。任何时候都可以将有效用户id设置为实际用户id或是保存的用户id。
()保存的用户id有exec赋值有效用户id而来,如果设置了文件的设置用户id位以后,则exec在执行时,根据文件id设置进程的有效用户id,从而将副本保存起来。
改变三个用户id的不同方法:
ID exec setuid(uid)
设置用户id位关闭 设置用户id打开 超级用户 一般用户
实际用户id 不变 不变 设为uid 不变
有效用户id 不变 设置为程序文件的用户id 设为uid 设为uid
保存的设置用户id 从有效用户id复制 从有效用户id复制 设置uid 不变
阅读(1719) | 评论(0) | 转发(0) |