关于特殊文件权限: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。