背景介绍
在linux系统中,我们熟知有rwx三种权限,对应所有者,同组用户,其他用户三种用户的权限,一共9个位来指定一个文件的权限情况,通过chmod xxx 来更改权限属性,其中xxx是已八进制表示的三个数,正好对应9个权限位,比如,777代表所有用户可读写执行,755表示所有用户可读执行,但是只有所有用户才能写,等等。
一般而言,这三种权限已经能够满足需求,但是针对一些特殊情况,还需要有三种特殊权限来完善文件权限的管理。
1 SUID权限
SUID,全称为set UID,在高位起第三位上表现为s。
通过设置SUID这个属性,可以让可执行文件以当前用户为文件的所有者来执行(如果这个用户有执行权限的话)。举一个例子,如果一个文件的权限为-rwsr-xr-x,一个组外用户对该文件是具有执行权的,但是如果却无法享有该文件执行时,依赖内容继承的权利。
例如,linux下的/usr/bin/passwd文件,通过这个文件可以修改用户的密码,所属用户和组分别是root root,权限是-rwsr-xr-x,linux下,密码信息保存在/etc/shadow文件中,该文件权限----------,所有者为root root,只有root才能改变该文件。当一个普通用户(非root组)修改密码时,由于具有SUID权限,在该文件执行时,文件的执行者会变成该文件的所有者,即root,从而达到能够修改/etc/shadow文件的效果,而且该权限仅在执行时有效,即密码修改完成后,用户就会变为原来的用户。这样就能达到用户能够修改密码,但是无法查看shadow文件内容的效果。
简单来讲,就是一个没有root权的用户,代理root来执行该文件(/usr/bin/passwd)。
在实际应用中,如果一个可执行文件有后续依赖关系,而其他用户虽然有执行权利,但是由于后续权利不足而会导致无法继续执行的问题,通过添加SUID属性,可以解决该问题。
2 SGID权限
SGID和SUID类似,在高起第六位上表现为s。
SGID改变的是执行者的所属组,可以对可执行文件和目录设置。通过对目录设置SGID属性,可以使得访问在该目录下创建的所有文件的所有权,都继承原目录的所有者,而非创建者。因为一旦有用户进入到该目录下,由于具有SGID权限,进入目录后的用户就会变成该目录的所有者,在该目录下创建的所有文件,都以该目录的所有者的身份创建。
利用好这个权限位在很多团队合作的项目上更加方便管理。比如一个共同维护的数据文件夹,为了方便管理,只允许管理员对里面的数据具有改变和删除的权利,但是却有很多用户需要有在该目录下添加数据文件的权利,利用SGID可以很好的解决这一点。
3 SBID权限
SBID权限同样只对目录有效,在权限位的最低位表现为t。
通过对目录设置SBID权限,并且该目录的权限为777,则所有用户可以在该目录下都可以创建文件,并且文件所有者是自己。但是在SBID权限的目录下,只有root和文件的所有者才能删除该文件,即使文件的属性为777也不能被其他用户删除。
这个权限在共享过程中非常实用。共享的文件任何人都有读写的权利,但是只有文件的所有者才能删除该文件。
4 特殊权限的设置
1 数字位设置特殊权限:三个特殊权限虽然分别在原来9个位上表现,但是并不是通过这9个位来修改,而是有特殊的三位数据管理这三个特殊权限,从高位到地位的顺序依次为:SUID,SGID,SBID。这三个位同样组成一个八进制数,在使用chmod时,这个八进制数在原来的三个数之前设置。
需要注意的是,SUID,SGID,SBID权限都是在可执行权限的基础上添加的,如果原本的文件或者目录没有可执行权限,那么添加这三个特殊权限后,将会显示错误状态:大写标识(如-rwSr--r--,即原文件没有可执行权限,但是加上SUID,即显示大写S)。
具体使用:chmod 4777表示在-rwxrwxrwx的基础上设置SUID,即-rwsrwxrwx; chmod 2755表示在drwxr-xr-x的基础上设置SGID,即drwxrwsrwx等等。
利用数字位来设置特殊权限,但是不能用数字位取消特殊权限,例如,当一个文件的权限是-rwsr--r--时,不能通过chmod 0744来取消SUID权限。
2 利用符号设置特殊权限:三个特殊权限的符号表示分别为 u+s,g+s,o+t,u-s,g-s,o-t,其中,u+s,g+s,o+t用来设置特殊权限SUID,SGID,SBID;u-s,g-s,o-t用来取消特殊权限SUID,SGID,SBID。
具体使用:chmod u+s表示在原文件中添加SUID属性,chmod o-t表示取消原目录中的SBIT特殊属性。
参考资料:感谢百度贴吧linux吧小吧主fyyz_me的分享:http://tieba.baidu.com/p/3058046685