[一天几个linux命令] SUID SGID SBIT

来源:互联网 发布:js 时间范围选择控件 编辑:程序博客网 时间:2024/06/08 05:46

前言

我们前面一直提到关于文件的重要权限,那就是r, w, x这三个读,写,执行的权限。但是,眼尖的朋友,一定注意到了一件事,那就是,怎么我们的/tmp权限有些奇怪?还有,那个/usr/bin/passwd也有些奇怪?怎么回事呢?

ls -ld /tmp; ls -l /usr/bin/passwddrwxrwxrwt root root 4096 Sep 27 18:23 /tmp-rwxr-xr-x root root 22984 Jan 72007 /usr/bin/passwd

不是应该只有r, w, x吗? 还有其他的特殊权限(s跟t)?因为s与t这两个权限的意义与系统的帐号及系统的进程较为相关,所以等到后面的章节谈完后你才会比较有概念。下面的说明先看看就好,如果看不懂也没有关系,先知道s放在哪里称为SUID/SGID以及如何设置即可

SetUID

当s这个标志出现在文件所有者的x权限上时,例如刚才提到的/usr/bin/passwd这个文件的权限状态“-rwsr-xr-x”,此时就被称为Set UID,简称为SUID的特殊权限。那么SUID的权限对于一个文件的特殊功能是什么呢?基本上SUID有这样的限制与功能:

  • SUID权限仅对二进制程序(binary program)有效
  • 执行者对于该程序需要具有x的可执行权限
  • 本权限仅在执行该程序的过程中(run-time)有效
  • 执行者将具有该程序所有者(owner)的权限

讲这么生硬的东西你可能对于SUID还是没有概念,没关系,我们举个例子来说明好了。我们的Linux系统中,所有帐号的密码都记录在/etc/shadow 这个文件里面,这个文件的权限为"-r-------- 1 root root",意思是这个文件仅有root可读且仅有root可以强制写入而已。既然这个文件仅有root可以修改,那么鸟哥的vbird这个一般帐号用户能否自行修改自己的密码呢?你可以使用你自己的帐号输入“passwd”这个命令来看看,一般用户当然可以修改自己的密码了!

有没有冲突?明明/etc/shadow 就不能让vbird 这个一般账户去访问的,为什么vbird还能够修改这个文件内的密码呢?这就是SUID的功能啦!通过上述的功能说明,我们可以知道:

  1. vbird 对于/usr/bin/passwd 这个程序来说是具有x权限的,表示vbird能执行passwd
  2. passwd的拥有者是root这个账号
  3. vbird执行passwd的过程中,会”暂时“获得root的权限
  4. /etc/shadow 可以被vbird所执行的passwd所修改

但如果vbird使用cat去读取/etc/shadow时,能够读取吗?因为cat不具有SUID的权限,所以vbird执行”cat /etc/shadow”时,是不能读取/etc/shadow的。

我们用一张示意图来说明如下:
这里写图片描述

另外,SUID仅可用在二进制程序上,不能够用在shell script上面。这是因为shell script只是将很多的二进制执行文件调进来执行而已。所以SUID的权限部分,还是得要看shell script 调用进来的程序的设置,而不是shell script本身。当然,SUID对于目录也是无效的,这点要特别留意

Set GID

当s标志在文件所有者的x项目为SUID, 那么在用户组的x时则称为Set GID, SGID, 是这样没错。举例来说,你可以用下面的命令来查看具有SGID权限的文件:

ls -l /usr/bin/locate-rwx--s--x root slocate 23856 Mar 15 2007 /usr/bin/locate

与SUID不同的是,SGID可以针对文件或目录来设置。如果是对文件来说,SGID有如下的功能:

  • SGID对于二进制程序有用
  • 程序执行者对于该程序来说,需要具备x的权限
  • 执行者在执行的过程中将会获得该用户组的支持

除了二进制程序之外,事实上SGID也能够用在目录上,这也是常见的一种用途。当一个目录设置了SGID的权限后,它将具有如下的功能:

  • 用户若对于此目录具有r与x的权限时,该用户能够进入此目录
  • 用户在此目录下的有效用户组将会变成该目录的用户组
  • 若用户在此目录下具有w的权限,则用户所创建的新文件的用户组与此目录的用户组相同

SGID对于项目开发来说是非常重要的。

Sticky Bit

这个Sticky Bit(SBIT)目前只针对目录有效,对于文件已经没有效果了。SBIT对于目录的作用是:

  • 当用户对于此目录肯有w, x权限时,即具有写入的权限时
  • 当用户在该目录下创建文件或目录时,仅有自己与root才有权利删除该文件

换句话说:当甲这个用户于A目录是具有用户组或其他人的身份,并且拥有该目录w的权限,这表示甲用户对该目录内任何人新建的目录或文件均可进行删除,重命名,移动等操作。

不过,如果将A目录加上了SBIT的权限项目时,则甲只能够针对自己创建的文件或目录进行删除、重命名,移动等操作,而无法删除他人的文件。

举例

我们的/tmp本身的权限是”drwxrwxrwt”,在这样的权限内容下,任何人都可以在/tmp内添加,修改文件,但仅有该文件/目录创建者与root能够删除自己的目录或文件。这个特性也是挺重要的,你可以这样做个简单的测试:

  1. 以root登陆系统,并且进入/tmp当中
  2. touch test,并且修改权限为777
  3. 以一般用户登录,并进入/tmp
  4. 尝试删除test这个文件

SUID SGID SBIT权限设置

前面介绍过SUID 与 SGID的功能,那么如何配置文件使其成为具有SUID与SGID的权限呢?这就需要chmod更改权限的函数了。现在你应该已经知道数字形态更改权限的方式为“三个数字“的组合,那么如果在这三个数字之前再加上一个数字的话,最前面的那个数字就代表这几个权限了

  • 4 为 SUID
  • 2 为 SGID
  • 1 为 SBIT

举例

假设要将一个文件的权限改为”-rwsr-xr-x“时,由于s在用户权利中,所以是SUID,因此,在原先的755之前还要加上4,也就是用”chmod 4755 filename”来设置。此外,还有S 与 T 的 产生

综合举例

创建一个测试用的空文件,加入有具SUID的权限

cd /tmptouch testchmod 4755 test; ls -l test-rwsr-xr-x 1 root root  ... test

加入具有SUID/SGID的权限

chmod 6755 test; ls -l test-rwsr-sr-x 1 root root ... test

加入SBIT的功能

chmod 1755 test; ls -l test-rwxr-xr-t 1 root root ... test

具有空的SUID/SGID权限

chmod 7666 test; ls -l test-rwSrwSrwT 1 root root ... test

最后一个例子就要特别小心,怎么会出现大写的S与T呢?不都是小写的吗?因为s与t都是替代x这个权限的,但是你没有发现,我们是执行7666。也就是说,user,group以及others都没有x这个可执行的标志(因为666),所以,这个S, T代表的就是”空的“。怎么说?SUID是表示该文件在执行的时候具有文件拥有者的权限,但是文件拥有者都无法执行了,哪里来的权限给其他人使用?当然是空的。
除了数字法之外,你也可以通过符号法来处理。其中SUID为u+s,而SGID为 g+s, SBIT则是o+t,来看看如下的范例:

设置权限成-rws--x--x的模样

chmod u=rwx go=x test; ls -l test-rws--x--x 1 root root ... test

承上,在上述的文件权限中加上SGID 与 SBIT

chmod g+s o+t test; ls -l test-rws--s--t 1 root root ... test

参考文献

《鸟哥的私房菜-基础学习篇》