实际用户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执行了进程process,process的有效用户ID就设成了用户usr01的ID(实际用户ID)。但是有的时候,一个进程可能要去执行其他用户创建的文件。这时,该进程的有效ID和该文件的所有者ID是不同的(记住文件的所有者Id就是最初创建它的进程有效ID哦)。但是如果文件设置了“设置用户ID位”或者“设置组ID位”,那么该进程在执行该文件的时候,就会将进程的有效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
kent uid=503 gid=504
foo创建了一个可执行文件 fooexe,用ls命令显示如下:
-rwxr-xr-x 1 foo foo 7734 Apr 05 17:07 fooexe 任何用户都可以执行这个程序。
1、在没有设置SUID/SGID的情况下,foo和kent分别执行这个程序,他们的情况如下
用户
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 任何用户都可以执行这个程序。
foo和kent分别执行这个程序,他们的情况如下
用户
uid
gid
euid
egid
进程访问系统资源权限
foo
500
501
euid=uid=500
egid=gid=501
由foo的访问权限决定
kent
503
504
euid=foo的uid=500
egid=foo的gid=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 来查看. 如果有这些标志, 则会在原来的执行标志位置上显示. 如
rwsrw-r-- 表示有setuid标志
rwxrwsrw- 表示有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。
- 实际用户ID,有效用户ID及设置用户ID
- 实际用户ID,有效用户ID及设置用户ID
- 实际用户ID,有效用户ID及设置用户ID
- 实际用户ID,有效用户ID及设置用户ID
- 实际用户ID,有效用户ID及设置用户ID
- 实际用户ID,有效用户ID及设置用户ID
- 实际用户ID,有效用户ID及设置用户ID
- 实际用户ID,有效用户ID及设置用户ID
- 实际用户ID,有效用户ID及设置用户ID
- 实际用户ID,有效用户ID及设置用户ID
- 实际用户ID,有效用户ID及设置用户ID
- 实际用户ID,有效用户ID及设置用户ID
- 实际用户ID,有效用户ID及设置用户ID
- 实际用户ID,有效用户ID及设置用户ID
- 实际用户ID,有效用户ID和设置用户ID
- 实际用户ID 有效用户ID 保存设置用户ID
- 实际用户ID,有效用户ID,设置用户ID
- 实际用户ID,有效用户ID,设置用户ID
- Java机制和面向对象开发方法
- x264源代码简单分析:宏块分析(Analysis)部分-帧间宏块(Inter)
- The method replace(int, Fragment) in the type FragmentTransaction is not applica
- Python strip() 函数
- 堆和栈的区别(转)
- 实际用户ID,有效用户ID及设置用户ID
- css3动画在安卓上不生效
- uva 673
- 关于Python中的del的一点思考
- Linux基本命令详解-1.0
- PlaceHolder的两种实现方式,表单
- Android开发需要的软件及环境
- 字符串转换整形数据+结构体数组排序
- python struct 解析服务器数据