欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

chmod的第四位数 4个数字 第1个数字 第一个数字 有大用

chmod的第四位数

前几天看到一个命令是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的区别。我们的脚本是:

<?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的时候执行,注意“#”和“$”的终端提示符,分别表示执行当前命令的是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 才有权力删除该档案

来自  https://czj.so/385/chmod%E7%9A%84%E7%AC%AC%E5%9B%9B%E4%BD%8D%E6%95%B0.html


普通分类: