实际用户ID:有的文章中将其称为真实用户ID,这个ID就是我们登陆unix系统时的身份ID。 一、 文件的访问权限包括读写和执行。判断某个进程对文件有何权限时,内核会将非超级用户进程的有效ID与文件的所有者ID进行比较,当然,也可能需要比较有效组ID,这关系到具体的权限测试方法,先不在这里说明。而超级用户创建的进程是允许访问整个文件系统的。它的有效ID等于0。不过,这里还有一点需要说明的是,仅仅有合适的有效ID,还不一定就能获得所有或者部分权限。你需要得到被访问文件的允许,这就是文件访问权限位(用户读、用户写、组读等)的责任了。 这里又牵涉到一个“ID”,即文件的所有者ID。文件的所有者ID是什么呢?创建文件是由某用户的进程实现的吧?所以在创建新文件的时候,就将该进程的有效ID作为该文件的所有者ID了。APUE里面有时又将文件的所有者ID称为“文件的用户ID”。
设置用户ID:设置用户ID是由exec函数复制有效用户ID得来的。所以说设置用户ID是进程有效ID的副本。为什么要保留进程有效ID的副本呢?刚才讲到文件有设置用户ID位时,内核会将执行进程的有效ID临时更改为文件的所有者ID。执行完该文件后总要恢复成原来的有效用户ID吧?所以事先保留个副本啦! 关于对应的组ID,基本类似了,不再赘述。 2、 那么有效用户ID(euid) 与 实际用户ID(uid) 之间的关系呢 ? 一个进程如果没有SUID或SGID位,则euid=uid egid=gid。而如果设置了SUID与SGID,则euid和egid变成被运行的程序的所有者的uid和gid。 (eg
: kevin用户的uid和gid分别为204和202,foo用户的uid和gid为 200,201,myfile是属于foo用户的。 1. 如果myfile没有设置SUID,kevin运行myfile程序形成的进程的euid=uid=204,egid=gid=202,内核根据这些值来判断进程对资源访问的限制,其实就是kevin用户对资源访问的权限,和foo没关系。 ) 2. 如果myfile设置了SUID,则euid和egid变成被运行的程序的所有者的uid和gid,例如kevin用户运行myfile,euid=200,egid=201,uid=204,gid=202,则这个进程具有它的属主foo的资源访问权限。) 二. 两个例子(转贴) 有两个用户:foo uid=500
gid=501 foo创建了一个可执行文件 fooexe,用ls命令显示如下: -rwxr-xr-x 1 foo
foo 7734 Apr 05 17:07
fooexe 任何用户都可以执行这个程序。 1、在没有设置SUID/SGID的情况下,foo和kent分别执行这个程序,他们的情况如下
2、在设置SUID/SGID的情况下, 用ls命令显示如下 -rwsr-xr-x 1
foo foo 7734 Apr 05 17:07 fooexe 任何用户都可以执行这个程序。 foo和kent分别执行这个程序,他们的情况如下
程序结束后,foo赋予kent的权限也收回。 三、关于目录的SGID属性 如果一个目录设置了SGID位,那么如果任何一个用户对这个目录有写权限的 话,他在这个目录所建立的文件的组都会自动转为这个目录的属主所在的组,而 文件所有者不变,还是属于建立这个文件的用户。 -rwxr-xr-x 1 kent kent 7734
Apr 05 17:07 kentfile ;文件所有者和组都是kent 当/usr/foo目录设置了SGID属性,用户kent建立文件kentfile显示的属性是: -rwxr-xr-x 1 kent foo 7734
Apr 05 17:07 kentfile ;文件所有者是kent,组是foo 四、SUID/SGID设置 设置SUID/SGID标志与操作文件权限的命令是一样的, 都是 chmod. 有两种方法来设置:
如果该位为4, 则表示设置setuid chmod 4777 temp 是设suid
找出所有设置了suid的文件 五 使用注意: 1. SGID的风险比SUID小得多,所以出于系统安全的考虑,应该尽量用SGID代替SUID的程序,如果可能的话。 2. SUID的优先级比SGID高,当一个可执行程序设置了SUID,则SGID会自动变成相应的egid。 3. 目录的SGID属性使得在该目录下创建的任何文件及子目录属于该目录所拥有的组(还是SGID基本原理来分析) 4.
S与s之间区别,s表示有运行权限,而S没有。没有运行权限的S使得SGID与SUID实际变得没有效果(因为程序不能执行,euid与egid不能改变为文件的所有者id) |
|