分类: LINUX
2011-08-25 14:58:10
程序的SUID/SGID属性
SUID的作用:当运行被设置了SUID属性的程序时,无论是谁都拥有程序所有者访问系统资源的权限。
如果一个目录设置了SGID位,那么如果任何一个用户对这个目录有写权限的 话,他在这个目录所建立的文件的组都会自动转为这个目录的属主所在的组,而 文件所有者不变,还是属于建立这个文件的用户。
一、概念:
SUID的作用:当运行被设置了SUID属性的程序时,无论是谁都拥有程序所有者访问系统资源的权限。
文件权限:确定用户读取、修改或执行文件的权力。
r -- 读访问
w -- 写访问
x -- 执行许可
s -- SUID/SGID
t -- sticky位
进程:进程是程序运行一次的过程,以完成预定的任务,它不同于程序。每个进程都有一个唯一的进程ID。此外,每个进程还有一些其他标识符:实际用户ID(user id=uid)、实际组ID(group id=gid)、有效用户ID(effective user id=euid)、有效组ID(effective group id=egid)。
内核主要是根据euid和 egid来确定进程对资源的访问权限。 一个进程如果没有SUID或SGID位,则euid=uid egid=gid,分别是运行这个程 序的用户的uid和gid。
SUID的优先级比SGID高,当一个可执行程序设置了SUID,则SGID会自动变成 相应的egid。
二、举例来说:
有两个用户: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