Linux 权限设置和 SUID, SGID 以及粘滞位sticky bit

suid是指在执行suid程序的过程中,去访问其他文件时拥有suid程序属主的权限,而不是指对suid程序本身拥有suid程序属主的权限!

 

一. 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 命令用八进制表示方法的设置。如果明白了前面的 12 位权限表示法也很简单。

 

二. SUID 和 SGID 的详细解析

    由于 SUID 和 SGID 是在执行程序(程序的可执行位被设置)时起作用,而可执行位只对普通文件和目录文件有意义,所以设置其他种类文件的 SUID 和 SGID 位是没有多大意义的。

    首先讲普通文件的 SUID 和 SGID 的作用。

    如果普通文件 file 是属于 foo 用户的,是可执行的,现在没设 SUID 位,ls 命令显示如下:

        -rwxr-xr-x 1 foo staff 7734 Apr 05 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 的设备文件,是一个字符设备文件,里面存储了核心程序要访问的数据,包括用户的口令。所以这个文件不能给一般的用户读写,权限设为:

        cr--r----- 1 root system 2, 1 May 25 1998 kmem

    但 ps 等程序要读这个文件,而 ps 的权限设置如下:

        -r-xr-sr-x 1 bin system 59346 Apr 05 1998 ps

    这是一个设置了 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 位,那么如果任何一个用户对这个目录有写权限的话,他在这个目录所建立的文件的组都会自动转为这个目录的属主所在的组,而文件所有者不变,还是属于建立这个文件的用户。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。