文件所有者ID(st_uid和st_gid),进程的有效ID(有效用户ID和有效组ID)以及附加组ID,设置用户ID

其中文件所有者ID为文件的性质,而后面两个有效ID和附加组ID则是进程的性质,进程每次打开,删除,创建一个文件时,都要惊醒文件访问权限测试:

1)如果进程的有效用户ID是0(超级用户,比如根用户),则允许访问,给予超级用户整个文件系统进行处理的权限

2)如进程有效用户ID等于文件所有者ID,那么按照进程打开方式的权限访问,,比如进程为读而打开文件,用户读位应为1;若进程为写而打开文件,则用户写位应为1,等

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

 

概念:

1)实际用户ID:告诉我们实际是谁,一般是用户登陆时,取自口令文件的ID

2)有效用户ID:主要是进程用于校验文件的使用权限

3)保存的设置用户ID:执行程序时保存有效用户ID的副本。

其中设置用户ID位和设置用户ID是两个概念,前者是一个为标志,后者用于保护有效用户ID的副本

原理:

如果某个执行文件设置了设置用户ID位,那么当某个用户执行此文件时,进程的有效用户ID位会被临时设置为执行文件的用户ID,也就拥有该用户的执行权限。比如:

例如假设Y用户有一执行码test,此时test的设置-用户-ID(set-user-ID)位没有设置。X用户执行Y用户的执行码test时,此时test实际用户ID等于X用户ID,有效用户ID等于X用户ID,保存的设置用户ID等于X用户ID,三类组ID同理。由于,有效用户ID决定了执行码的用户权限,所以test执行码是X用户权限,有权限读取和修改X用户的文件,而对Y用户的文件则不一定有权限。

    当test的设置-用户-ID(set-user-ID)位进行了设置时,X用户执行Y用户的执行码test,此时test实际用户ID等于X用户ID,有效用户ID等于Y用户ID,保存的设置-用户-ID等于Y用户ID,三类组ID同理。此时test执行码为Y用户权限,有权限读取和修改Y用户的文件,而对X用户的文件不一定有权限。如果要让test某一段时间内有X用户的权限,则可用seteuid(getuid())方法把有效用户ID修改为实际用户ID(即X用户ID);随后test又想恢复Y用户权限,则可把有效用户ID重置,因为设置-用户-ID是以前有效用户ID的副本,在非特权用户下系统会根据设置-用户-ID的值判断此有效用户ID设置是否允许。在非特权用户下,有效用户ID重新设置时只能等于实际用户ID或保存的设置-用户-ID。

 

关于内核所维护的三个用户ID的说明:

①    只有超级用户进程可以更改实际用户ID。通常,实际用户ID是在用户登录时,由login程序设置的,而且决不会改变它。因为login是一个超级用户进程,当它调用setuid时,设置所有三个用户ID。

②    仅当对程序文件设置了设置-用户-ID位时,exec函数会设置有效用户ID。如果设置-用户-ID位没有设置,则exec函数不会改变有效用户ID,而将其维持为原先值。任何时候都可以调用setuid,将有效用户ID设置为实际用户ID或保存的设置-用户-ID。

③    “保存的设置-用户-ID是进程exec时从有效用户ID复制而来,复制后并将此副本保存起来。

posted on 2015-07-29 15:13  菜鸟基地  阅读(1045)  评论(0)    收藏  举报

导航