Skip to content

chmod的第四位数

前几天看到一个命令是chmod 2770 /srv/projecta,不禁纳闷。因为从来见到的都是三位数,表示用户,群组,其他用户的读写执行权限。如今出来第四位“2”就不能理解了。

其实这是文档和目录的另一个特殊标记,第四位也是一个八进制数字,其中的三个bit分别表示SUID,SGID,SBIT。也代表了一种权限。下面分别介绍。

SUID

UID我们懂,就是Linux系统中的用户ID,这里的S是set的意思。这个标识只对二进制可执行文件有效。我们可以试验一下。

我们的试验方法是写一个读/etc/shadow的PHP脚本。用非root用户来读,查看有无SUID的区别。我们的脚本是:

<?php
$myfile = fopen("/etc/shadow", "r") or die("Unable to open file!");
echo fgets($myfile);
fclose($myfile);

/etc/shadow的权限是 ———- 1 root root 739 Jan 24 11:56 /etc/shadow

先尝试SUID的时候执行

[[email protected]_0_10_centos projecta]# ls -l /usr/bin/php
-rwxr-xr-x 1 root root 4856520 Jan 12 18:10 /usr/bin/php
[[email protected]_0_10_centos projecta]# su elastic
[[email protected]_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![[email protected]_0_10_centos projecta]$

可以看到elastic用户执行结果是没有读取权限。接下来设置SUID再尝试。

[[email protected]_0_10_centos projecta]# chmod 4755 /usr/bin/php
[[email protected]_0_10_centos projecta]# ls -l /usr/bin/php
-rwsr-xr-x 1 root root 4856520 Jan 12 18:10 /usr/bin/php   
[[email protected]_0_10_centos projecta]# su elastic
[[email protected]_0_10_centos projecta]$ ll
total 28
-rwxrwx--- 1 root    www-exe 112 Jan 24 11:53 read.php
[[email protected]_0_10_centos projecta]$ php read.php
root:$1$s4o**************0rji1gV/:17917:0:99999:7:::
[[email protected]_0_10_centos projecta]$ exit
exit
[[email protected]_0_10_centos projecta]# chmod u-s /usr/bin/php
[[email protected]_0_10_centos projecta]# ll /usr/bin/php
-rwxr-xr-x 1 root root 4856520 Jan 12 18:10 /usr/bin/php

可以看执行chmod 4755之后,原来user权限由rwx变为rws。脚本的执行结果没有上次的报错并且读出了/etc/shadow的第一行。结束之后别忘了给PHP去掉SUID,我们用chmod u-s 的方式单独去掉这个标识,设置的时候也可以用u+s代替上面的4755执行会比较好,不会影响其他状态位。

现在咱们把SUID的作用说明一下:

  • SUID 权限仅对二进制可执行文件(binary program)有效;
  • 执行者对于该程序需要具有 x 的可执行权限;
  • 本权限仅在执行该程序的过程中有效 (run-time);
  • 执行者将具有该程序拥有者 (owner) 的权限。

所以只要elastic用户可以执行php,那么相当于是root用户执行的。

所以SUID可以解释为执行时候设置Set UID为程序拥有者。

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 才有权力删除该档案

分享到:
Published in程序猿的东西

Be First to Comment

发表评论