实际用户ID,有效用户ID及设置用户ID

来源:互联网 发布:java怎样创建接口对象 编辑:程序博客网 时间:2024/05/21 01:57

实际用户ID:有的文章中将其称为真实用户ID,这个ID就是我们登陆unix系统时的身份ID。
有效用户ID:定义了操作者的权限。有效用户ID是进程的属性,决定了该进程对文件的访问权限。

 一、

文件的访问权限包括读写和执行。判断某个进程对文件有何权限时,内核会将非超级用户进程的有效ID与文件的所有者ID进行比较,当然,也可能需要比较有效组ID,这关系到具体的权限测试方法,先不在这里说明。而超级用户创建的进程是允许访问整个文件系统的。它的有效ID等于0。不过,这里还有一点需要说明的是,仅仅有合适的有效ID,还不一定就能获得所有或者部分权限。你需要得到被访问文件的允许,这就是文件访问权限位(用户读、用户写、组读等)的责任了。

 

这里又牵涉到一个“ID”,即文件的所有者ID。文件的所有者ID是什么呢?创建文件是由某用户的进程实现的吧?所以在创建新文件的时候,就将该进程的有效ID作为该文件的所有者ID了。APUE里面有时又将文件的所有者ID称为文件的用户ID”


一般情况下,进程的有效用户ID就被设成执行该进程的实际用户ID。比如,用户usr01执行了进程processprocess的有效用户ID就设成了用户usr01ID(实际用户ID)。但是有的时候,一个进程可能要去执行其他用户创建的文件。这时,该进程的有效ID和该文件的所有者ID是不同的(记住文件的所有者Id就是最初创建它的进程有效ID哦)。但是如果文件设置了设置用户ID或者设置组ID,那么该进程在执行该文件的时候,就会将进程的有效ID临时更改为文件的所有者ID

 

设置用户ID:设置用户ID是由exec函数复制有效用户ID得来的。所以说设置用户ID是进程有效ID的副本。为什么要保留进程有效ID的副本呢?刚才讲到文件有设置用户ID位时,内核会将执行进程的有效ID临时更改为文件的所有者ID。执行完该文件后总要恢复成原来的有效用户ID吧?所以事先保留个副本啦!

 

关于对应的组ID,基本类似了,不再赘述。

 

2

那么有效用户IDeuid  实际用户IDuid 之间的关系呢 

       一个进程如果没有SUIDSGID位,则euid=uid egid=gid。而如果设置了SUIDSGID,则euidegid变成被运行的程序的所有者的uidgid

       (eg : kevin用户的uidgid分别为204202foo用户的uidgid 200201myfile是属于foo用户的。

              1. 如果myfile没有设置SUID,kevin运行myfile程序形成的进程的euid=uid=204egid=gid=202,内核根据这些值来判断进程对资源访问的限制,其实就是kevin用户对资源访问的权限,和foo没关系。 )

              2. 如果myfile设置了SUID,euidegid变成被运行的程序的所有者的uidgid,例如kevin用户运行myfileeuid=200egid=201uid=204gid=202,则这个进程具有它的属主foo的资源访问权限。)

. 两个例子(转贴)

有两个用户:foo  uid=500 gid=501
                         kent  uid=503 gid=504

foo创建了一个可执行文件 fooexe,用ls命令显示如下:

-rwxr-xr-x  1 foo  foo   7734  Apr  05  17:07  fooexe  任何用户都可以执行这个程序。

1、在没有设置SUID/SGID的情况下,fookent分别执行这个程序,他们的情况如下

用户

uid

gid

euid

egid

进程访问系统资源权限

foo

500

501

euid=uid=500

egid=gid=501

由foo的访问权限决定

kent

503

504

euid=uid=503

egid=gid=504

由kent的访问权限决定,与foo无关

 

2、在设置SUID/SGID的情况下,

ls命令显示如下

-rwsr-xr-x  1 foo  foo   7734  Apr  05  17:07  fooexe  任何用户都可以执行这个程序。

fookent分别执行这个程序,他们的情况如下

用户

uid

gid

euid

egid

进程访问系统资源权限

foo

500

501

euid=uid=500

egid=gid=501

由foo的访问权限决定

kent

503

504

euid=foouid=500

egid=foogid=501

由foo的访问权限决定

程序结束后,foo赋予kent的权限也收回。

 

三、关于目录的SGID属性

    如果一个目录设置了SGID位,那么如果任何一个用户对这个目录有写权限的 话,他在这个目录所建立的文件的组都会自动转为这个目录的属主所在的组,而 文件所有者不变,还是属于建立这个文件的用户。
例如:/usr/foo目录的属主是foo,没有设置SGID属性。用户kent进入这个目录创建了文件kentfile ,则这个文件的属性显示如下:

-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. 有两种方法来设置: 
1
、采用字符来设置:
chmod u+s temp -- temp文件加上suid标志. (setuid 只对文件有效
chmod g+s tempdir -- tempdir目录加上sgid标志 (setgid 只对目录有效)


2) 
采用数字方式设置:
在一般文件权限设置的3位数字前再加上一位数字,成为4位数字。

如果该位为4, 则表示设置setuid 
如果该位为2, 则表示设置setgid 
所以,假设文件或目录的原来权限位设置是777,要加上SUID/SGID,如下设置:

chmod 4777 temp 是设suid
chmod 2777 tempdir是设置sgid


    设置完这些标志后可以用 ls -l 来查看如果有这些标志则会在原来的执行标志位置上显示 
rw
srw-r-- 表示有setuid标志 
rwxrw
srw- 表示有setgid标志 
如果本来在”s”位上有x标志则这些特殊标志显示为小写字母 (s, s, t). 否则显示为大写字母 (S, S, T)

常用操作

找出所有设置了suid的文件
find / -perm -4000 -type f

五 使用注意:

    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)



 在Unix进程中涉及多个用户ID和用户组ID,包括如下:

1、实际用户ID和实际用户组ID:标识我是谁。也就是登录用户的uid和gid,比如我的Linux以simon登录,在Linux运行的所有的命令的实际用户ID都是simon的uid,实际用户组ID都是simon的gid(可以用id命令查看)。

2、有效用户ID和有效用户组ID:进程用来决定我们对资源的访问权限。一般情况下,有效用户ID等于实际用户ID,有效用户组ID等于实际用户组ID。当设置-用户-ID(SUID)位设置,则有效用户ID等于文件的所有者的uid,而不是实际用户ID;同样,如果设置了设置-用户组-ID(SGID)位,则有效用户组ID等于文件所有者的gid,而不是实际用户组ID。


0 0
原创粉丝点击