在前面的博文中已经说明了文件的类型和权限(
http://blog.chinaunix.net/uid-16813896-id-4615798.html);
本文中将介绍另外两个重要的概念:
0、什么是SUID和SGID
SUID: Set User ID; 设置用户ID
SGID: Set Group ID; 设置用户组ID
1、可以通过chmod命令设置文件的SUID和SGID,命令如下:
chmod u+s filename :设置文件的SUID位
chmod u-s filename: 删除文件的SUID位
chmod g+s filename: 设置文件的SGID位
chmod g-s filename: 删除文件的SGID位
2、如果一个文件被设置了SUID或SGID位,会分别表现在所有者或同组用户的权限的可执行位(x)上。
-
gwwu@hz-dev2.wgw.com:~/test/socket>ls -al
-
-rw-rw-r-- 1 gwwu gwwu 6 Nov 12 14:48 test.c
-
gwwu@hz-dev2.wgw.com:~/test/socket>chmod u+s test.c
-
gwwu@hz-dev2.wgw.com:~/test/socket>ls -al
-
-rwSrw-r-- 1 gwwu gwwu 6 Nov 12 14:48 test.c
-
gwwu@hz-dev2.wgw.com:~/test/socket>chmod g+s test.c
-
gwwu@hz-dev2.wgw.com:~/test/socket>ls -al
-
-rwSrwSr-- 1 gwwu gwwu 6 Nov 12 14:48 test.c
-
gwwu@hz-dev2.wgw.com:~/test/socket>chmod g-s test.c
-
gwwu@hz-dev2.wgw.com:~/test/socket>ls -al
-
-rwSrw-r-- 1 gwwu gwwu 6 Nov 12 14:48 test.c
-
gwwu@hz-dev2.wgw.com:~/test/socket>chmod u-s test.c
-
gwwu@hz-dev2.wgw.com:~/test/socket>ls -al
-
-rw-rw-r-- 1 gwwu gwwu 6 Nov 12 14:48 test.c
-
gwwu@hz-dev2.wgw.com:~/test/socket>chmod u+x test.c
-
gwwu@hz-dev2.wgw.com:~/test/socket>ls -al
-
-rwxrw-r-- 1 gwwu gwwu 6 Nov 12 14:48 test.c
-
gwwu@hz-dev2.wgw.com:~/test/socket>chmod u+s test.c
-
gwwu@hz-dev2.wgw.com:~/test/socket>ls -al
-
-rwsrw-r-- 1 gwwu gwwu 6 Nov 12 14:48 test.c
1)-rwSrw-r--:表示SUID位被设置,但是所有者权限中的可执行位(x)没有被设置
2)-rwsrw-r--:表示SUID位和所有者权限中的可执行位(x)都被设置了
3)-rw-rwS-r--:表示GUID位被设置,但是同组用户权限中的可执行位(x)没有被设置
4)-rw-rws-r--:表示GUID位和同组用户权限中的可执行位(x)都被设置了
5)-rw-rw--r--:表示SUID/GUID位,所有者和同组用户权限中的可执行位(x)都没有设置
其实在UNIX的实现中,文件权限用12个二进制位表示,如果该位置上的值是1,表示有相应权限:
S G T r w x r w x r w x
第11位为SUID位,第10位为SGID位,第9位为sticky位,第8-0位对应于上面的三组rwx位。
11 10 9 8 7 6 5 4 3 2 1 0
上面的-rwsr-xr-x的值为: 1 0 0 1 1 1 1 0 1 1 0 1
-rw-r-Sr--的值为: 0 1 0 1 1 0 1 0 0 1 0 0
3、实例
在文件模式字中有两个特殊的标志,如果设置了这两个标志,那么当执行此文件时,可以将进程的有效ID和有效组ID设置成为文件所有者的用户ID和组ID,这两个标志分别是SUID和SGID。
UNIX内核是根据什么来确定一个进程对资源的访问权限的呢?
主要是根据EUID和EGID,即有效用户ID和有效组ID。
如果没有设置SUID和SGID,那么EUID和EGID一般是等于实际用户ID和实际组ID,
如果设置了SUID和SGID,那么在文件运行的时候,EUID和EGID就等于了文件所有者的ID和组ID。
1)linux中有一个很好的例子能用来说明这个问题,那就是普通用户修改密码。
在正常情况下,普通用户无法访问修改口令的文件/etc/passwd或/etc/shadow,而只有超级用户才有这个权限,那普通用户应该如何修改呢?
UNIX提供了一个passwd命名允许任一用户改变其口令,该程序是设置一个用户ID程序,但是最终要访问上面两个口令文件的话,还是需要超级用户权限啊?这个时候就可以使用到SUID的功能了。
在/usr/bin下,可以看到默认情况下,passwd文件就是设置了SUID和所有者root的可执行权限。
gwwu@hz-dev2.wgw.com:/usr/bin>ls -al passwd
-rwsr-xr-x. 1 root root 30768 Feb 22 2012 passwd
这样的话,普通用户执行passwd命令时,由于设置了SUID,那么该普通用户的有效用户ID就被设置成为了文件所有者的用户ID,也就是root,而且root拥有可执行权限,所以普通用户就可以修改密码了。
2)假设unix系统有一个/dev/kmsg的设备文件,是一个字符设备文件,里面存储了核心程序要访问的数据,所以这个文件不能给一般的用户读写,权限设置为:cr--r----- 1 root system 2, 1 May 23 2014 kmsg
,但是有个程序wx要读这个文件,而wx的权限为:
-r-xr-sr-x bin system 555 Apr 03 2014 wx
当用户bin执行wx时,由于设置了SGID,那么执行时的Egid就变成了system,而kmsg的用户组也是system,那么wx就可以读取kmsg文件了。
3)SGID对目录的影响
SUID对目录没有影响,而SGID有影响。如果一个目录设置了SGID,并且某个用户对该目录有写权限,那么该用户在这个目录所建立的文件的组都自动转为这个目录的所属主所在的组,而文件所有者不变,还是属于建立这个文件的用户。
阅读(1798) | 评论(0) | 转发(0) |