SUID、SGID、SBIT

SUID 是一种对二进制程序进行设置的特殊权限,可以让二进制程序的执行者临时拥有属 主的权限(仅对拥有执行权限的二进制程序有效)。例如,所有用户都可以执行 passwd 命令 来修改自己的用户密码,而用户密码保存在/etc/shadow 文件中。仔细查看这个文件就会发现 它的默认权限是 000,也就是说除了 root 管理员以外,所有用户都没有查看或编辑该文件的 权限。但是,在使用 passwd 命令时如果加上 SUID 特殊权限位,就可让普通用户临时获得程 序所有者的身份,把变更的密码信息写入到 shadow 文件中。这很像我们在古装剧中见到的手 持尚方宝剑的钦差大臣,他手持的尚方宝剑代表的是皇上的权威,因此可以惩戒贪官,但这 并不意味着他永久成为了皇上。因此这只是一种有条件的、临时的特殊权限授权方法。 查看 passwd 命令属性时发现所有者的权限由 rwx 变成了 rws,其中 x 改变成 s 就意味着 该文件被赋予了 SUID 权限。另外有读者会好奇,那么如果原本的权限是 rw-呢?如果原先权 限位上没有 x 执行权限,那么被赋予特殊权限后将变成大写的 S。

SGID 主要实现如下两种功能: 让执行者临时拥有属组的权限(对拥有执行权限的二进制程序进行设置);在某个目录中创建的文件自动继承该目录的用户组(只可以对目录进行设置)。 SGID 的第一种功能是参考 SUID 而设计的,不同点在于执行程序的用户获取的不再是文 件所有者的临时权限,而是获取到文件所属组的权限。举例来说,在早期的 Linux 系统中, /dev/kmem 是一个字符设备文件,用于存储内核程序要访问的数据,权限为: cr--r----- 1 root system 2, 1 Feb 11 2017 kmem 大家看出问题了吗?除了 root 管理员或属于 system 组成员外,所有用户都没有读取该文件 的权限。由于在平时我们需要查看系统的进程状态,为了能够获取到进程的状态信息,可在用 于查看系统进程状态的 ps 命令文件上增加 SGID 特殊权限位。查看 ps 命令文件的属性信息: -r-xr-sr-x 1 bin system 59346 Feb 11 2017 ps 这样一来,由于 ps 命令被增加了 SGID 特殊权限位,所以当用户执行该命令时,也就临 时获取到了 system 用户组的权限,从而可以顺利地读取设备文件了。 前文提到,每个文件都有其归属的所有者和所属组,当创建或传送一个文件后,这个文 件就会自动归属于执行这个操作的用户(即该用户是文件的所有者)。如果现在需要在一个部 门内设置共享目录,让部门内的所有人员都能够读取目录中的内容,那么就可以创建部门共 享目录后,在该目录上设置 SGID 特殊权限位。这样,部门内的任何人员在里面创建的任何 文件都会归属于该目录的所属组,而不再是自己的基本用户组。此时,我们用到的就是 SGID 的第二个功能,即在某个目录中创建的文件自动继承该目录的用户组(只可以对目录进行设 置)。

SBIT 特殊权限位可确保用户只能删除自己的文件,而 不能删除其他用户的文件。换句话说,当对某个目录设置了 SBIT 粘滞位权限后,那么该目录 中的文件就只能被其所有者执行删除操作了。

与前面所讲的 SUID 和 SGID 权限显示方法不同,当目录被设置 SBIT 特殊权限位后,文 件的其他人权限部分的 x 执行权限就会被替换成 t 或者 T,原本有 x 执行权限则会写成 t,原 本没有 x 执行权限则会被写成 T。

原文地址:https://www.cnblogs.com/pooopun/p/13384218.html