感谢支持
我们一直在努力

Linux SUID/SGID/SBIT权限

其实SUID和SGID的作用跟sudo是相似的。当用户A想执行一个原本属于用户B的可执行文件时,若B的文件设置了suid位,则A在执行时是以用户 B的身份来执行。

    其中一个suid的应用实例就是passwd,在linux中,存储密码的文件是/etc/passwd与/etc/shadow这两个文件,


   

  1. linuxidc@www.linuxidc.com:~/cpp$ ls -l /etc/passwd 
  2. -rw-r–r– 1 root root 1503 2011-03-22 15:03 /etc/passwd 
  3. linuxidc@www.linuxidc.com:~/cpp$  
  4.  
  5. linuxidc@www.linuxidc.com:~/cpp$ ls -l /etc/shadow 
  6. -rw-r—– 1 root shadow 1071 2011-03-22 15:03 /etc/shadow 
  7. linuxidc@www.linuxidc.com:~/cpp$  

这两天文件的所属用户 是root,也就是说,只有root用户可以修改这个文件。但是在一个多用户 的系统中,即便是普通用户,也有更改自己的密码的权限吧?但是更改密码就要更改到/etc/passwd这个文件,一般情况下是不被允许的。所以,这就是suid的作用了。


先看一下设置密码的命令:

  1. root@www.linuxidc.com:/tmp/aa# ls -l /usr/bin/passwd 
  2. -rwsr-xr-x 1 root root 37100 2011-02-15 06:12 /usr/bin/passwd 

可以看到,/usr/bin/passwd是设置 了sticky位的。也就是说,当普通用户在执行passwd命令时,其实使用是root管理员的身份,当更改完密码时,就恢复到普通用户的身份了。


我想了一个实验来看一下效果 


 

  1. cd /tmp/ 
  2. mkdir aa 
  3. cd aa 

写一个perl程序:


 

  1. #!/usr/bin/perl 
  2.  
  3. system(“touch test”); 

顺便说一下,需要先安装perl-suid才可以设置perl程序suid位。不然会报如下错误:


Can’t do setuid (cannot exec sperl)

设置suid位: 

  1. chmod u+s /tmp/aa/test.pl 
  2. chmod u+x /tmp/aa/test.pl 
  1. -rwsr-xr-x  1 linuxidc linuxidc   38 2011-03-22 15:00 test.pl* 

目前用用户linuxidc来执行: 

  1. linuxidc@www.linuxidc.com:/tmp/aa$ ll 
  2. 总计 12 
  3. drwxr-xr-x  2 linuxidc linuxidc 4096 2011-03-22 15:31 ./ 
  4. drwxrwxrwt 13 root    root    4096 2011-03-22 15:17 ../ 
  5. -rw-r–r–  1 linuxidc linuxidc    0 2011-03-22 15:31 test 
  6. -rwsr-xr-x  1 linuxidc linuxidc   38 2011-03-22 15:00 test.pl* 
  7. linuxidc@www.linuxidc.com:/tmp/aa$  

 

  1. linuxidc@www.linuxidc.com:/tmp/aa$ su 
  2. 密码:  
  3. root@www.linuxidc.com:/tmp/aa# rm -f test 
  4. root@www.linuxidc.com:/tmp/aa# ./test.pl  
  5. root@www.linuxidc.com:/tmp/aa# ll 
  6. 总计 12 
  7. drwxr-xr-x  2 linuxidc linuxidc 4096 2011-03-22 15:34 ./ 
  8. drwxrwxrwt 13 root    root    4096 2011-03-22 15:17 ../ 
  9. -rw-r–r–  1 linuxidc root       0 2011-03-22 15:34 test 
  10. -rwsr-xr-x  1 linuxidc linuxidc   38 2011-03-22 15:00 test.pl* 
  11. root@www.linuxidc.com:/tmp/aa#  

当我们用root的用户来执行test.pl这个程序时,touch出来的文件的所属主依然是linuxidc,证明确实是以linuxidc的身份来执行这个程序 的。 


SGID多用在团队合作上,实际应用我觉得很少,具体应用是不太清楚,但是,可以创建一个目录,作为团队合作的工作目录,设置 sgid,那么团队成员都会以这个组的身份来访问操作这个目录的,如果在这个目录下创建了文件,则所属的组是这个目录所属的组。这个,属于这个组的其它成员就都可以共享这个文件的内容了。 

  1. linuxidc@www.linuxidc.com:/tmp/aa$ mkdir bb 
  2. linuxidc@www.linuxidc.com:/tmp/aa$ chmod g+s bb 
  3. linuxidc@www.linuxidc.com:/tmp/aa$ ll 
  4. 总计 16 
  5. drwxr-xr-x  3 linuxidc linuxidc 4096 2011-03-22 15:44 ./ 
  6. drwxrwxrwt 13 root    root    4096 2011-03-22 15:17 ../ 
  7. drwxr-sr-x  2 linuxidc linuxidc 4096 2011-03-22 15:44 bb/ 
  8. -rw-r–r–  1 linuxidc root       0 2011-03-22 15:34 test 
  9. -rwsr-xr-x  1 linuxidc linuxidc   38 2011-03-22 15:00 test.pl* 
  10. linuxidc@www.linuxidc.com:/tmp/aa$ cd bb 
  11. linuxidc@www.linuxidc.com:/tmp/aa/bb$ su  
  12. 密码:  
  13. root@www.linuxidc.com:/tmp/aa/bb# touch one 
  14. root@www.linuxidc.com:/tmp/aa/bb# ll 
  15. 总计 8 
  16. drwxr-sr-x 2 linuxidc linuxidc 4096 2011-03-22 15:44 ./ 
  17. drwxr-xr-x 3 linuxidc linuxidc 4096 2011-03-22 15:44 ../ 
  18. -rw-r–r– 1 root    linuxidc    0 2011-03-22 15:44 one 
  19. root@www.linuxidc.com:/tmp/aa/bb#  

这样子,即使是root创建的文件,我的普通用户linuxidc也可以查看。 


最后一个,SBIT权限,这个是用在other权限位的,而且是应用 在目录上的操作。


在linux上,最典型的应用就是/tmp目录,当多个用户同时登录到系统上时,都会在/tmp目录下生成自己 的文件,为了不让别的用户随便删除自己的文件,所以在/tmp目录中设置了SBIT位。 

  1. linuxidc@www.linuxidc.com:/tmp/aa$ ll -dl /tmp 
  2. drwxrwxrwt 13 root root 4096 2011-03-22 15:17 /tmp/ 
  3. linuxidc@www.linuxidc.com:/tmp/aa$  

当设置了t位,只有创建这个文件的用户才可以删除自己的文件,其它用户 是不可以删除的。

赞(0) 打赏
转载请注明出处:服务器评测 » Linux SUID/SGID/SBIT权限
分享到: 更多 (0)

听说打赏我的人,都进福布斯排行榜啦!

支付宝扫一扫打赏

微信扫一扫打赏