Linux入门真经-023文件的特殊权限

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/syaziou/article/details/82080283

本节给大家介绍文件的特殊权限:SUID, SGID, STICKY BIT。

首先让我们先回忆一下文件的基本权限。

当进程以某个用户的身份去访问某一个文件时:

         (1)判断进程的属主,是否为被访问的文件属主;如果是,则应用属主的权限;否则:

         (2)判断进程的属主,是否属于被访问的文件属组;如果是,则应用属组的权限;否则:

         (3)应用other的权限;

这样一套机制看似已经严丝合缝了,但是在某些场景下仍然显得不够灵活。接下来介绍文件的特殊权限,先讲解各个特殊权限的应用场景,再介绍如何设置

1、SUID

直接去讲原理可能不太容易让人理解,以下已场景为引子,引出SUID权限的含义。

我们看一下/etc/shadow文件的权限。

[root@localhost ~]# ll /etc/shadow

----------. 1 root root 865 Aug 10 13:22/etc/shadow

可以看出,其实只有root用户才有权利往里面写东西的。

然而,我们每个用户都可以使用passwd命令来修改我们的密码对吗?每次改完,/etc/shadow中的内容又都会更新对不对?

既然普通用户无法对该文件进行写入,密码文件又是如何更新的呢。

默认情况下,用户发起的进程,进程的属主是其发起者;因此,其以发起者的身份在运行;

而SUID的作用,就是在用户运行某程序文件时,使得进程的属主不是发起者,而程序文件自己的属主;

[root@localhost ~]# ll /bin/passwd

-rwsr-xr-x. 1 root root 27832 Jun 10  2014 /bin/passwd

我们看到,/bin/passwd文件的用户权限的执行位上,是s而不是常见的x,这就是SUID的标志了,如果文件的属主原本有执行权限,则显示为小写s,否则显示为大写S。

因此,当普通用户使用passwd命令时,因为SUID的关系,其实是以root用户的身份去执行的,而root用户自然是可以往/etc/shadow中去写入信息的。

SUID仅仅针对二进制程序有效,且仅在执行过程中有效,而且,用户对这个二进制程序应该本身就具有执行权限。

2、SGID

         它常见的应用场景是这样的:

         比如有一个小团队(1、2、3号员工,共有一个属组A)去完成一项任务。目录的属组是属组A。但是当1号员工在目录中创建文件时,文件的属主默认为1号员工的基本组(默认与用户名同名的组)。因此,2号员工访问该文件时只能以other身份。同理,1号员工访问2号员工创建的文件,也只能用other身份,由此产生诸多不便。

         如果对这个目录使用了SGID权限,则组A中的1、2、3号员工在这个目录中创建文件或者目录时,新文件的属组不再是用户的基本组,而是目录的属组(A)。由于1、2、3号员工都属于属组A,所以他们具有了统一的权限。

(我就不用官话写了,例子比干巴巴的功能陈述更好懂)

此外,SGID还可以用于二进制文件。用于二进制文件时,只要用户对这个文件有执行权限,执行时则临时获得文件的属组身份。

SGID特殊权限显示在属组的执行位,如果文件的属组原本有执行权限,则显示为小写s,否则显示为大写S。

3、SBIT

这条权限是为了防止破坏份子乱删文件的。如果一个目录,某个群组具有写权限,那么群组内的成员是可以随意删除目录内的文件的。为了防止这一现象,可以在目录上添加SBIT权限。这样一来,虽然组内的用户可以自由的创建文件,但是删除文件的时候只能删除自己创建的文件。

SBIT特殊权限显示在other的执行位。如果设置了SBIT且原本other没有执行权限,则为s,否则若other有执行权限,则为S。

系统上的/tmp和/var/tmp目录默认均有sticky权限;

4、设置特殊权限

我们可以参照基本权限的设置方法来进行特殊权限的设置。

SUID我们可以使用如下方法赋值:

chmod u+s FILE 撤销可以用chmod u-s FILE

权限显示在属主执行位,属主原本没有x权限则显示为s,有x权限则显示为S

SGID我们可以使用如下方法赋值:

chmod g+|-s FILE...

权限显示在属组的执行权限位,如果属组原本有执行权限,显示为小写s。否则,显示为大写S;

                             

STID我们可以使用如下方法赋值:

         chmod o+|-t FILE...

         权限显示在other的执行权限位,如果其它用户原本有执行权限,显示为小写t; 否则,显示为大写T;

举例:

/tmp目录具有SBIT权限:

[root@localhost tmp]# ll -d /tmp

drwxrwxrwt. 12 root root 4096 Aug 15 10:46/tmp

创建一个目录,修改其权限使其具有SGID权限:

[root@localhost tmp]# mkdir work_dir

[root@localhost tmp]# ll -d work_dir

drwxr-xr-x. 2 root root 6 Aug 16 00:39 work_dir

[root@localhost tmp]# chmod g+s work_dir

[root@localhost tmp]# ll -d work_dir

drwxr-sr-x. 2 root root 6 Aug 16 00:39 work_dir

[root@localhost tmp]#

将特殊权限改为SBIT

[root@localhost tmp]# chmod g-s,o+twork_dir/

[root@localhost tmp]# ll -d work_dir/

drwxr-xr-t. 2 root root 6 Aug 16 01:16work_dir/

截止到目前,已经对linux文件权限作了大致全面的说明。不过你可能会发现,目前的所有权限都是针对某一类:如属主、属组、其他。文件能否对某个特定的用户指定独有权限呢,下一节为大家介绍。

关注本公众号获取每日更新

猜你喜欢

转载自blog.csdn.net/syaziou/article/details/82080283