posts - 262,  comments - 221,  trackbacks - 0
【1.SUID与SGID】
前面我们知道了Linux中文件、目录一般有rwx三种权限,但是请看下面命令的结果,我们可以发现了多了2个权限:s,t:
[root@localhost ~]# ls -ld /tmp /usr/bin/passwd
drwxrwxrwt  
11 root root  4096  1月  5 21:36 /tmp
-r-s--x--x   
1 root root 19336 2004-09-07  /usr/bin/passwd
[root@localhost ~]# ls /usr/bin/passwd

其中s权限当出现于用户的x位置时被称为SUID,当s权限出现于组用户的x位置时被称为SGID (而SGID又分为作用于文件还是目录,SUID仅对文件有用)

那么这两个权限有什么作用呢?简单的概括起来:
 ①SUID允许执行该文件的用户在运行时暂时拥有所有者的权限
 ②SGID允许执行该文件的用户在运行时暂时拥有用户组的权限
 ③如果SGID作用于目录,则使用者在该目录下创建的文件,其用户组都和该目录一样

Example 1:修改passwd文件中用户paul的密码

我们知道/usr/bin/passwd文件的用户是root,用户组也是root,如果没有s权限,那么光凭用户paul的x权限我们只能执行而不能看到,更改这个文件的内容。但是实际上我们完全可以通过passwd命令来修改自己的密码。
[paul@localhost ~]$ passwd
Changing password for user paul.
Changing password for paul
(current) UNIX password:
New UNIX password:
Retype new UNIX password:
passwd: all authentication tokens updated successfully.
[paul@localhost ~]$

那么为什么我们不具备对passwd这个文件rw权限,却能够修改这个文件呢?原因就在于我们前面提到的s权限--SUID。从描述可以知道当paul用户执行该文件时(x权限),可以暂时地获得用户root对这个文件的权限,用户root对passwd是rwx权限,所以我们当然可以修改自己的密码了。

但一旦我们执行完毕时这个权限就还回去了,如果我们cat这个文件我们会发现没有权限显示
[paul@localhost ~]$ cat /usr/bin/passwd
cat: /usr/bin/passwd: 权限不够
[paul@localhost ~]$

不过SUID和SGID也不是随便那个人,那个文件都可以用的,必须满足下面两个条件
 ①用户对要执行的文件必须具备x权限
 ②SUID,SGID仅对二进制文件起作用

【2.SBIT】
SBIT权限就是前面我们看到的t权限,它只能作用于目录,它的作用是:但用户在该目录下建立文件或目录时,仅有用户自己或root用户有权删除。其他人无法删除,而用户也无法删除他人的目录或文件。
[paul@localhost ~]$ ls -ld /tmp
drwxrwxrwt  
11 root root 4096  1月  5 22:34 /tmp
[paul@localhost ~]$

我们看到/tmp目录的x位置被替换成t了,这意味着这个目录下的内容只有root用户和创建者有权删除。

Example 1:试验SBIT权限

首先我们以paul用户身份在/tmp目录下建立一个文件test,并设置成为777权限。让所有人可以修改文件。
[paul@localhost tmp]$ touch test
[paul@localhost tmp]$ ls -l test
-rw-rw-r--  
1 paul paul 0  1月  5 23:26 test
[paul@localhost tmp]$ chmod 777 test
[paul@localhost tmp]$ ls -l test
-rwxrwxrwx  
1 paul paul 0  1月  5 23:26 test
[paul@localhost tmp]$

然后我们以Oracle用户身份分别尝试删除该文件和修改该文件
[oracle@localhost ~]$ cd /tmp
[oracle@localhost tmp]$ ls -l /tmp/test
-rwxrwxrwx  
1 paul paul 0  1月  5 23:26 /tmp/test
[oracle@localhost tmp]$ rm test
rm: 无法删除‘test’: 不允许的操作
[oracle@localhost tmp]$ vi test
[oracle@localhost tmp]$ cat test
Modify this file

经过试验我们发现两个结果:
 ①我们不能以Oracle身份删除test文件,即便/tmp目录对其他用户开放w权限
 ②我们可以Oracle身份修改test文件,因为我们对test文件设置了777权限

这就是SBIT权限的好处,即不会限制正常的删除,又可以防止意外或恶意的删除。

【3.如何设置特殊权限】
如何设置权限我们已经在前面提到过了,设置特殊权限也是同样的。只是特殊权限在设置时是位于普通权限的前面,而且4代表SUID权限,2代表SGID权限,1代表SBIT权限。见下面例子:
[root@www ~]# cd /tmp
[root@www tmp]# touch test                  <==建立一個測試用空檔
[root@www tmp]# chmod 4755 test; ls -l test <==加入具有 SUID 的權限
-rwsr-xr-x 1 root root 0 Sep 29 03:06 test
[root@www tmp]# chmod 6755 test; ls -l test <==加入具有 SUID/SGID 的權限
-rwsr-sr-x 1 root root 0 Sep 29 03:06 test
[root@www tmp]# chmod 1755 test; ls -l test <==加入 SBIT 的功能!
-rwxr-xr-t 1 root root 0 Sep 29 03:06 test
[root@www tmp]# chmod 7666 test; ls -l test <==具有空的 SUID/SGID 權限
-rwSrwSrwT 1 root root 0 Sep 29 03:06 test

注意最后一个7666权限的例子,大写S和T和上面小写的s和t不同,这是空的特殊权限的表示。因为本身666已经断绝了所有人的执行权限,所以特殊权限也就没有意思了。

(来自《鸟哥的私房菜》的例子)


-------------------------------------------------------------
生活就像打牌,不是要抓一手好牌,而是要尽力打好一手烂牌。
posted on 2009-01-05 22:03 Paul Lin 阅读(858) 评论(0)  编辑  收藏 所属分类: Unix / Linux

只有注册用户登录后才能发表评论。


网站导航:
 
<2009年1月>
28293031123
45678910
11121314151617
18192021222324
25262728293031
1234567

常用链接

留言簿(21)

随笔分类

随笔档案

BlogJava热点博客

好友博客

搜索

  •  

最新评论

阅读排行榜

评论排行榜