前几天看到一个命令是chmod 2770 /srv/projecta,十分不解。我们知道chmod三位数分别表示用户,群组,其他用户的读写执行权限。如今出来第四位就不能理解了。
上例多出来的第四位是“2”,它也是一个八进制数,也代表了一种权限。但不同的是他不表示“读、写、执行”,它的三个bit的含义分别是SUID,SGID,SBIT。下面分别介绍:
SUID
UID我们懂,就是Linux系统中的用户ID,这里的S是set的意思。这个标识只对二进制可执行文件有效。
SUID的作用如下:
SUID 权限仅对二进制可执行文件(binary program)有效;
执行者对于该程序需要具有 x 的可执行权限;
本权限仅在执行该程序的过程中有效 (run-time);
执行者将具有该程序拥有者 (owner) 的权限。
接下来我们试验一下。试验方法是写一个读/etc/shadow的PHP脚本,这个文件存了系统的用户,是一个敏感文件。我们用非root用户来读,查看有无SUID的区别。我们的脚本是:
/etc/shadow的权限是 ———- 1 root root 739 Jan 24 11:56 /etc/shadow
先尝试SUID的时候执行,注意“#”和“$”的终端提示符,分别表示执行当前命令的是root和非root用户。
[root@VM_0_10_centos projecta]# ls -l /usr/bin/php
-rwxr-xr-x 1 root root 4856520 Jan 12 18:10 /usr/bin/php
可以看到php解析器是属于root用户的。下面切换到一个非root用户来执行。
[root@VM_0_10_centos projecta]# su elastic
[elastic@VM_0_10_centos projecta]$ php read.php
PHP Warning: fopen(/etc/shadow): failed to open stream: Permission denied in /srv/projecta/read.php on line 2
Unable to open file![elastic@VM_0_10_centos projecta]$
可以看到elastic用户执行结果是没有读取权限。接下来我们用root用户给php解析器(注意不是php脚本)设置SUID再做尝试。
[root@VM_0_10_centos projecta]# chmod 4755 /usr/bin/php
[root@VM_0_10_centos projecta]# ls -l /usr/bin/php
-rwsr-xr-x 1 root root 4856520 Jan 12 18:10 /usr/bin/php
[root@VM_0_10_centos projecta]# su elastic
[elastic@VM_0_10_centos projecta]$ php read.php
root:$1$s4o**************0rji1gV/:17917:0:99999:7:::
可以看执行chmod 4755之后,原来user权限由rwx变为rws。脚本的执行结果没有上次的报错并且读出了/etc/shadow的第一行。回顾上面讲到的SUID的功能,也就是只要elastic用户可以执行php,那么相当于是root用户执行的。
所以SUID可以解释为执行时候设置Set UID为程序拥有者。
结束之后别忘了给PHP去掉SUID,我们用chmod u-s 的方式单独去掉这个标识,设置的时候也可以用u+s代替上面的4755执行会比较好,不会影响其他状态位。
[root@VM_0_10_centos projecta]# chmod u-s /usr/bin/php
[root@VM_0_10_centos projecta]# ll /usr/bin/php
-rwxr-xr-x 1 root root 4856520 Jan 12 18:10 /usr/bin/php
SUID有两个使用限制:
SUID设置在文件夹无效。
SUID对脚本无效,所以这个试验中只能加给PHP,加给read.php没用。
SGID
SGID的含义与SUID的套路差不多。具有如下功能:
SGID 对二进制可执行程序有用;
程序执行者对于该程序来说,需具备 x 的权限;
执行者在执行的过程中将会获得该程式群组的支援!
如果设置在文件夹时具有如下功能:
使用者若对于此目录具有 r 与 x 的权限时,该使用者能够进入此目录;
使用者在此目录下的有效群组(effective group)将会变成该目录的群组;
用途:若使用者在此目录下具有 w 的权限(可以新建档案),则使用者所建立的新档案,该新档案的群组与此目录的群组相同。
SBIT
这里的S跟前面的S不是一个意思了,这里是Sticky前面是Set,也就是粘住的意思。SBIT只对目录有效。
当使用者对于此目录具有 w, x 权限,亦即具有写入的权限时;
当使用者在该目录下建立档案或目录时,仅有自己与 root 才有权力删除该档案