红联Linux门户
Linux帮助

Linux粘滞位使用

发布时间:2016-09-07 09:39:47来源:linux网站作者:feike24
粘滞位(Stickybit),又称粘着位,是Unix文件系统权限的一个旗标。最常见的用法在目录上设置粘滞位,也只能针对目录设置,对于目录内文件有效。则设置了粘滞位后,只有目录内文件的所有者或者root才可以删除或移动该文件。如果不为目录设置粘滞位,任何具有该目录写和执行权限的用户都可以删除和移动其中的文件。实际应用中,粘滞位一般于/tmp目录,以防止普通用户删除或移动其他用户的文件。
 
在Linux系统中比较典型的例子就是“/tmp”、 “/var/tmp”目录。这两个目录作为Linux系统的临时文件夹,权限为“rwxrwxrwx”,即允许任意用户、任意程序在该目录中进行创建、删除、移动文件或目录等操作。
粘滞位权限便是针对此种情况设置,当目录被设置了粘滞位权限以后,即便用户对该文录有写入权限,也不能删除该目录中其他用户的文件数据,只有该文件的所有者和root用户才有权将其删除。设置了粘滞位之后,正好可以保持一种动态的平衡:允许各用户在目录中任意写入、删除数据,但是禁止随意删除其他用户的数据。
 
需要注意的是, 粘滞位权限只能针对目录设置,对于文件无效。
设置了粘滞位权限的目录,使用ls命令查看其属性时,其他用户权限处的“x”将变为“t”。
例如,查看/tmp、 /var/tmp目录的权限,确认存在“t”标记。
Linux粘滞位使用
 
粘滞位权限都是针对其他⽤户( other)设置,使用chmod命令设置目录权限时,“o+t”、 “o-t”权限模式可分别用于添加、移除粘滞位权限。
例如,为/file目录设置粘滞位权限。
Linux粘滞位使用
  
Linux 文件权限的表示方法
文件权限用 12 个二进制位表示,如果该位的值是 1,表示有相应的权限:
11 10 9 8 7 6 5 4 3 2 1 0
S G T r w x r w x r w x
第 11 位为 SUID 位,第 10 位为 SGID 位,第 9 位为 sticky 位,第 8-0 位对应于上面的三组 rwx 位。
-rwsr-xr-x的值为: 1 0 0 1 1 1 1 0 1 1 0 1
-rw-r-Sr–的值为: 0 1 0 1 1 0 1 0 0 1 0 0
 
给文件加 SUID 和 SUID 的命令如下:
chmod u+s filename 设置SUID位
chmod u-s filename 去掉SUID设置
chmod g+s filename 设置SGID位
chmod g-s filename 去掉SGID设置
另外一种方法是 chmod 命令用八进制表示方法的设置。
 
SUID 和 SGID 的详细解析
由于 SUID 和 SGID 是在执行程序(程序的可执行位被设置)时起作用,而可执行位只对普通文件和目录文件有意义,所以设置其他种类文件的 SUID 和 SGID 位是没有多大意义的。
首先讲普通文件的 SUID 和 SGID 的作用。
如果普通文件 file 是属于 foo 用户的,是可执行的,现在没设 SUID 位,ls 命令显示如下:
-rwxr-xr-x 1 foo staff 7734 Aug 26 17:07 file
任何用户都可以执行这个程序。UNIX 的内核是根据什么来确定一个进程对资源的访问权限的呢?是这个进程的运行用户的(有效)ID,包括 user id 和 group id。用户可以用 id 命令来查到自己的或其他用户的 user id 和 group id。
除了一般的 user id 和 group id 外,还有两个称之为 effective 的 id,就是有效 id,上面的四个 id 表示为:uid,gid,euid,egid。内核主要是根据 euid 和 egid 来确定进程对资源的访问权限。一个进程如果没有 SUID 或 SGID 位,则 euid=uid egid=gid,分别是运行这个程序的用户的 uid 和 gid。例如 kevin 用户的 uid 和 gid 分别为 204 和 202,foo 用户的 uid 和 gid 分别为 200 和 201,kevin 运行 myfile 程序形成的进程的 euid=uid=204,egid=gid=202,内核根据这些值来判断进程对资源访问的限制,其实就是 kevin 用户对资源访问的权限,和 foo 没关系。
如果一个程序设置了 SUID,则 euid 和 egid 变成被运行的程序的所有者的 uid 和 gid,例如 kevin 用户运行 myfile,euid=200,egid=201,uid=204,gid=202,则这个进程具有它的属主 foo 的资源访问权限。
SUID 的作用就是这样:让本来没有相应权限的用户运行这个程序时,可以访问他没有权限访问的资源。passwd 就是一个很鲜明的例子。
SUID 的优先级比 SGID 高,当一个可执行程序设置了 SUID,则 SGID 会自动变成相应的 egid。
下面讨论一个例子:
UNIX 系统有一个 /dev/kmem 的设备文件,是一个字符设备文件,里面存储了核心程序要访问的数据,包括用户的口令。所以这个文件不能给一般的用户读写。
这是一个设置了 SGID 的程序,而 ps 的用户是 bin,不是 root,所以不能设置 SUID 来访问 kmem,但大家注意了,bin 和 root 都属于 system 组,而且 ps 设置了 SGID,一般用户执行 ps,就会获得 system 组用户的权限,而文件 kmem 的同组用户的权限是可读,所以一般用户执行 ps 就没问题了。但有些人说,为什么不把 ps 程序设置为 root 用户的程序,然后设置 SUID 位,不也行吗?这的确可以解决问题,但实际中为什么不这样做呢?因为 SGID 的风险比 SUID 小得多,所以出于系统安全的考虑,应该尽量用 SGID 代替 SUID 的程序,如果可能的话。下面来说明一下 SGID 对目录的影响。SUID 对目录没有影响。如果一个目录设置了 SGID 位,那么如果任何一个用户对这个目录有写权限的话,他在这个目录所建立的文件的组都会自动转为这个目录的属主所在的组,而文件所有者不变,还是属于建立这个文件的用户。
 
本文永久更新地址:http://www.linuxdiyf.com/linux/23945.html