关于SUID、SGID、SBIT

在linux里提到操作权限的时候往往是说对应三种角色(所有者、本组人、其他人)分别有三种权限(r、w、x),这样组合起来,就是3*3=9种。分别用9个标志位来记录。用ls –l来观察文件属性会显示这9个标志位。为方便表述,假设我们从右边第一位算起。分别记作1、2、3位,存储其他人的权限;4、5、6位存储本组人权限;7、8、9位存储所有者权限。当然还有一位第10位表示文件类型。1-9位上是1,就表示有这个权限,是0就表示没有这个权限。


这是常规情况,还有一些特殊情况并没有包含在内。这个特殊情况是只针对x位来说的。也就是第7、4、1位。那么把这三位单提出来看,还是可以有000—111等8种组合。显然在原位置上已经没法表示了,于是在授权的时候再多写一个不大于7的数,之后与原值进行分别“叠加”(叠加只是个形象说法,不要理解为与操作)。举例来说,命令chmod 4644 aaa ,最前面的一位4,写成二进制是100,也就是把这个100分别和原有的第7、4、1位进行“叠加”。


“叠加”的效果是什么呢?如果原本是0,也就是没有执行权限,那么即便叠加上一个1,也还是不起任何作用。644表示成三个二进制数:110100100,第7、4、1位都是0,所以第7位叠上一个1也没用。但显示会变——象上面的授权命令,chmod 4666 aaa,执行完再显示aaa属性,第7位会显示为大写的S。这是没有什么影响的。如果是chmod 2666 aaa呢,那么第4位显示为大写S(2的二进制010,中间的1和第4位的0进行叠加),如果是chmod 1666 aaa,那么第一位显示为大写的T(1的二进制001,最末的1和第1位进行叠加)。


如果原位上是1,也就是有执行权限,那么就有效果了,叠加完第7位会显示小写的s;第4位也会显示小写的s;第1位会显示小写的t。对应命令chmod 4766 aaa 、chmod 2655 aaa、chmod 1665 aaa可以达到这个效果。


说了半天,好象一直在玩二进制数字游戏,这有什么用呢。如果第7位被设置成s,就表示SUID(set uid),它的作用是,当这个程序被执行时,执行者将被当作文件所有者(set 成uid)看待。如果第4位被设置成s,那么当这个程序被执行时,执行者将被当作文件所属组成员(set 成gid)看待。如果第1位被设置成t,那么对于文件不起什么作用。对于目录有这样的效果:在其下创建的的文件或目录,仅能自己和root可以删除。


另外SUID 和SGID只对二进制程序起作用,对shell脚本不起作用。设置了SUID和SGID后会增加执行风险,需要谨慎操作。

你可能感兴趣的:(系统/运维)