Press "Enter" to skip to content

Linux系统的特殊权限(suid,guid)

SUID属性只能运用在可执行文件上,当用户执行该执行文件时,会临时拥有该执行文件所有者的权限。passwd命令启用了SUID功能,所以一般用户在使用passwd命令修改密码时,会临时拥有了passwd命令所有者root用户的权限,这样一般用户才可以将自己的密码写入/etc/shadow文件。在使用“ls -l”或“ll”命令浏览文件时,如果可执行文件所有者权限的第三位是一个小写的“s”就表明该执行文件拥有SUID属性。

[root@srv ~]# ll /usr/bin/passwd 
-rwsr-xr-x 1 root root 22960 Jul 17  2006 /usr/bin/passwd

SGID于SUID不同,SGID属性可以应用在目录或可执行文件上。当SGID属性应用在目录上时,该目录中所有建立的文件或子目录的拥有组都会是该目录的拥有组。比如“/charles”目录的拥有组是charles,当“/charles”目录拥有SGID属性时,任何用户在该目录中建立的文件或子目录的拥有组都会时charles;当SGID属性应用在可执行文件上时,其他用户在使用该执行文件时就会临时拥有该执行文件拥有组的权限。在使用“ls -l”或“ll”命令浏览文件或目录时,如果拥有组权限的第三位是一个小写的“s”就表明该执行文件或目录拥有SGID属性。

[root@srv tmp]# ll 
total 4 
drwxr-sr-x 2 root root 4096 Feb 15 22:25 fringe 
-r-xr-sr-x 1 root root  6144 Feb 15 22:25 jack 

Sticky属性只能应用在目录,当目录拥有Sticky属性所有在该目录中的文件或子目录无论是什么权限只有文件或子目录所有者和root用户能删除。比如当用户oliva在“/charles”目录中建立一个文件并将该文件权限配置为777,当/charles目录拥有Sticky属性时,只有root和oliva用户可以将该文件删除。在使用“ls -l”或“ll”命令浏览目录时,如果其他用户权限的第三位是一个小写的“t”就表明该执行文件或目录拥有Sticky
属性。

[root@srv tmp]# ll 
total 4 
drwxrwxrwt 2 root root 4096 Feb 15 22:34 fringe 

suid是一种特殊权限,设置了suid的程序文件,在用户执行该程序时,用户的权限是该程序文件属主的权限。guid与suid类似,只是执行程序时获得的是文件属组的权限。

举个例子,普通用户zhang3可以执行aaa文件,但aaa文件的所有者是root。如果此文件设置了suid权限,那么zhang3用户在执行之的时候也自动获得了root的相关权限。

如何设置suid/guid权限?
设置suid:chmod u+s file1,或者将相应的权限位之前的那一位设置为4;
设置guid:chmod g+s file1,那么就将相应的权限位之前的那一位设置为2;
如果同时设置两者,那么将相应的权限位之前的那一位设置为4+2,即chmod 6755 file1
要取消权限的话,把+号换成-号即可。

[zhang3@localhost ~]$ vim /etc/sysconfig/network-scripts/ifcfg-eth0
                        //普通用户调用vim直接修改网卡,会提示没有权限
[zhang3@localhost ~]$ su - root          //切换至root身份
[root@localhost ~]# ls -lh /usr/bin/vim      //确认vim的属主是root
-rwxr-xr-x 1 root root 2.7M 2009-06-12 /usr/bin/vim
[root@localhost ~]# chmod u+s /usr/bin/vim   //给vim设置SUID权限
[root@localhost ~]# ls -lh /usr/bin/vim      //查看权限
-rwsr-xr-x 1 root root 2.7M 2009-06-12 /usr/bin/vim

[root@localhost ~]# su - zhang3           //切换至普通用户身份
[zhang3@localhost ~]$ vim /etc/sysconfig/network-scripts/ifcfg-eth0
                        //普通用户再次调用vim直接修改网卡,可以修改成功

特别说明:
出于安全考虑,现代的大部分 UNIX 类系统都会忽略掉SHELL脚本的 suid ,只有二进制可执行程序的 suid 有效 。所以直接给脚本文件设置 suid 是达不到预期效果的。
所以如果确实需要给脚本文件设 suid,常见的做法是用 C 写一个封装程序,在这个程序里调用脚本。这样,给封装程序(二进制可执行程序)设上 suid (chmod 4755 a.out) 就可以达到给脚本文件设 suid 的效果了。

One Comment

  1. Anonymous 2017-08-04

    只要切到root@不用+s也可以执行的好吧

Leave a Reply to Anonymous Cancel reply

Your email address will not be published. Required fields are marked *