[Linux]权限s权限和t权限

问题

     在《Unix高级编程》第4.9章节中描述了函数chmod()的参数mode常量值

当中S_ISUID、S_ISGID、S_ISVTX三个常量让人困惑.

分析

通过查阅文档,发现这几个权限叫做强制位(s权限)和粘滞位(t权限)

一、s权限

     包含S_ISUID、S_ISGID两个常量在内,叫做强制位权限;

     S_ISUID只能应用于二进制可执行文件*;

     S_ISGID可应用于二进制可执行文件*和目录;

     *shell脚本不可以,因为shell脚本并不是二进制文件.

     S_ISUID、S_ISGID用在二进制文件时:

     如果S_ISUID为真,则把此进程的有效用户ID设置为此文件拥有者的用户ID.

     如果S_ISGID为真,则把此进程的有效用户组ID设置为此文件的组ID.

     由于进程有用户/组ID影响文件访问权限,于是就相当于临时拥有文件所有者的身份. 典型的文件是passwd. 如果一般用户执行该文件, 则在执行过程中, 该文件可以获得root权限, 从而可以更改用户的密码.

     S_ISGID用在目录时:

     当前用户执行chdir切换至该目录后,用户进程的有效用户组ID(effective group)将会设置为该目录的用户组.若用户在此目录下具备w权限,则用户进程所创建的新文件的用户组ID与该目录用户组ID相同.

   

ls -al /usr/bin/passwd
-rwsr-xr-x 1 pythontab pythontab 32988 2018-03-16 14:25 /usr/bin/passwd

     两个常量的值是:

  oct dec
S_ISUID 4000 2048
S_ISGID 2000 1024

     即分别是第12位和第11位的掩码.

     设置suid:将相应的权限位之前的那一位设置为4;

     设置guid:将相应的权限位之前的那一位设置为2;

     两者都置位:将相应的权限位之前的那一位设置为4+2=6.

     设置一个文件运行时具备文件拥有者UID的身份:

chmod 4755 test

     设置一个文件运行时具备文件拥有者GID的身份:

chmod 2755 test

     设置一个文件运行时以上两者兼备的身份:

chmod 6755 test

注意:在设置s权限时文件属主、属组必须先设置相应的x权限,否则s权限并不能正真生效(c h m o d命令不进行必要的完整性检查,即使不设置x权限就设置s权限,chmod也不会报错,当我们ls -l时看到rwS,大写S说明s权限未生效)

 

二、t权限

     这个常量的值是:

  oct dec
S_ISVTX 1000 512

     即是第10位的掩码,不过有一点挺奇怪是,在centos7.0下标准头文件sys/stat.h却没有定义这个常量,但是在文件系统中这个标志位是真实存在的.

     设置一个文件夹运行时具备t权限:

chmod 1777 test

     t权限:要删除一个文档,您不一定要有这个文档的写权限,但您一定要有这个文档的上级目录的写权限。也就是说,您即使没有一个文档的写权限,但您有这个文档的上级目录的写权限,您 也能够把这个文档给删除,而假如没有一个目录的写权限,也就不能在这个目录下创建文档。

怎样才能使一个目录既能够让任何用户写入文档,又不让用户删除这个目录下他人的文档,t权限就是能起到这个作用。t权限一般只用在目录上,用在文档上起不到什么作用。

在一个目录上设了t权限位后(如/home,权限为1777),只有在以下三种情况下你才能够删除目录中的文件:

  • *拥有此文件(指要删除的这个文件)
  • *拥有此目录(例中指/home这个目录)
  • 是root用户

(*拥有的意思是指该文件所有者用户ID等于該进程的有效用户ID(不明确,有可能是实际用户ID),并不是指具备操作权限的用户)

任何具备写权限的用户都能够在这个目录下创建文档,但只能删除自己创建的文档(root除外),这就对任何用户能写的目录下的用户文档 启到了保护的作用。

可以通过chmod +t filename 来设置t权限

 

三、在可视化权限代码上的表示方式

在可视化权限代码中s和t权限分别共用了所属用户、所属组、其他用户的x权限表示的位置;

1.S_ISUID的表示方式

所属用户的S_IXUSR(x位)为S_ISUID所共用,当S_IXUSR和S_ISUID共存时,用小写s表示,当只设置了S_ISUID时,用大写S表示:

[_ rws ___ ___]  //S_IXUSR和S_ISUID均具备
[_ rwS ___ ___]  //只具备S_ISUID

2.S_ISGID的表示方式

所属用户的S_IXGRP(x位)为S_ISGID所共用,当S_IXGRP和S_ISGID共存时,用小写s表示,当只设置了S_ISGID时,用大写S表示:

[_ ___ rws ___]  //S_IXGRP和S_ISGID均具备
[_ ___ rwS ___]  //只具备S_ISGID

3.S_ISVTX的表示方式

所属用户的S_IXOTH(x位)为S_ISVTX所共用,当S_IXOTH和S_ISVTX共存时,用小写t表示,当只设置了S_ISVTX时,用大写T表示:

[_ ___ ___ rwt]  //S_IXOTH和S_ISVTX均具备
[_ ___ ___ rwT]  //只具备S_ISVTX

 

四、移除s/t权限位

我们可以通过类似于文章开头的4个8进制数字当中的第一个添加或修改s/t权限位,但是想要完全抹去s/t权限位,或者说是想把s/t权限为置为0,运用这种方法是不可行的,例如下面的代码是不生效的:

chmod 0755 test

假设test之前的权限位是1755,那么以上的命令相当于没有对test作出任何改变;

我们需要用到代号的形式去修改或删除s/t权限位:

chmod

u

g

o

+

-

s

s

t

file or dir

 示例:

chmod u-s test //移除设置用户ID位
chmod g-s test //移除设置组ID位
chmod o-t test //移除粘着位

 

在这再总结一下

s或S(SUID/SGID,Set UID/GID):

可执行的文件搭配这个权限,便能得到特权,任意存取该文件的所有者能使用的全部系统资源。请注意具备SUID/SGID权限的文件,黑客经常利用这种权限,以SUID/SGID配上root帐号拥有者,无声无息地在系统中开扇后门,供日后进出使用。

t或T(Sticky):

/tmp和 /var/tmp目录供所有用户暂时存取文件,亦即每位用户皆拥有完整的权限进入该目录,去浏览、删除和移动文件。

posted @ 2018-11-30 23:23  yiyide266  阅读(21002)  评论(0编辑  收藏  举报