关于特殊文件权限:suid、sgid和sticky-bit

  用 ls –l 命令时,能看到三个八进制数字,表示文件的权限。其实文件的权限应该用4个八进制文件来表示,没有显示的那个是第一位,用来设定一些特殊的权限,这个八进制数字的三个位是:SUID、SGID、stick-bit。

SUID:当设置了SUID 位的文件被执行时,该文件将以所有者的身份运行,也就是说无论谁来执行这个文件,他都有文件所有者的特权。如果所有者是 root 的话,那么执行人就有root权限了。这时该位将变成一个安全漏洞,因此不要轻易设置该位。

SGID:该权限只对目录有效。目录被设置该位后, 任何用户在此目录下创建的文件都具有和该目录所属的组相同的组。

Sticky-bit:该位可以理解为防删除位。一个文件是否可以被某用户删除, 主要取决于该文件所属的组是否对该用户具有写权限。 如果没有写权限, 则这个目录下的所有文件都不能被删除, 同时也不能添加新的文件。如果希望用户能够添加文件但同时不能删除文件, 则可以对文件使用sticky bit位。设置该位后, 就算用户对目录具有写权限, 也不能删除该文件。

有两种方法可以来设置这些权限:

1、直接设置标志位

chmod u+s temp 为temp文件加上suid标志

chmod g+s tmp  为tmp目录加上sguid标志

chmod o+t temp 为temp文件加上sticky标志

2、采用八进制数字来设置标志位

用四位八进制数表示当前文件的权限,第一位八进制数如用abc表示

a - setuid位, 如果该位为1,则这个8进制数为4,则表示设置setuid

b - setgid位, 如果该位为1, 则表示设置setgid 

c - sticky位, 如果该位为1, 则表示设置sticky 

使用 chmod 4xxx,2xxx,1xxx。。。。等来设置标志位就是一样的效果了。

设置完这些标志后, 可以用 ls -l 来查看。如果有这些标志, 则会在原来的执行标志位置上显示。原来的执行标志x到哪里去了呢? 系统规定, 如果本来在该位上有x, 则这些特殊标志显示为小写字母 (s, s, t),若无执行权限则显示为大写字母 (S, S, T)。

如:

rwsrw-r-- 表示有setuid标志

rwxrwsrw- 表示有setgid标志

rwxrw-rwt 表示有sticky标志

补:

如drwxr-xr-x的10位字段,表示的是该文件的文件类型和其权限。下表描述了各个标志位的含义

9 6 - 8 3 - 5 0 - 2
文件类型 拥有者访问权限 所在用户组访问权限 其它用户访问权限

p 管道文件

d 目录文件

l 符号连接文件

- 普通文件

s socket文件

c 字符设备文件

b 块设备文件

分别为读写执行权限,

-表示没有该位上的权限

读取权限: r

写入权限: w

执行权限: x

              s,S 表示设置了SUID位.

              s表示该位原标志为x,

              S表示该位原标志为-

分别为读写执行权限,

-表示没有该位上的权限

读取权限: r

写入权限: w

执行权限: x

              s,S 表示设置了GUID位.

              s表示该位原标志为x,

              S表示该位原标志为-

分别为读写执行权限,

-表示没有该位上的权限

读取权限: r

写入权限: w

执行权限: x

              s,S 表示设置了Sticky位.

              s表示该位原标志为x,

              S表示该位原标志为-

表1 Linux文件权限标识符

    特殊权限SGID标志位:普通文件设置了该标志位,则表示该进程的egid变成被运行的程序的所有者的gid。没有设置该位,则进程的egid为运行该程序的用户的gid。
    特殊权限SUID标志位:普通文件设置了该标志位,则表示该进程的euid变成被运行的程序的所有者的uid。没有设置该位,则进程的euid为运行该程序的用户的uid。 
    特殊权限Sticky标志位:旧的UNIX系统定义该位为指示操作系统在程序退出后,保留程序的代码段到swap空间。而在linux系统当中,该位表示防删除位,意味着该位被设置之后,只有文件的拥有者和root用户才能删除该文件。[1][2]

    SGID和SUID的存在意义在于,当一个非特权进程可以通过执行设置了SGID和SUID标志的程序,来获得特定权限。例如su,当它没有设置SGID和SUID标志位的时候,实际上它是不能创建一个具有root权限的shell进程的。

    以上的文件权限标识符在Linux当中实际上是使用二进制来表示的,例如rwxrw-rw-,转成二进制形式就是111110110,但实际情况下,我们为了更方便阅读,我们使用的是八进制进行标识,也就是766。但是文件标识符当中除了基本读写执行之外,再算上特殊权限,实际上Linux权限访问控制使用的是12位二进制数字(3位特殊权限 + 9位基础权限)来表示访问权限。比如rwsrw-rw-,转化成八进制表示方式,就是4766。

原文地址:https://www.cnblogs.com/cqufengchao/p/6780941.html