在前一章当中我们讲述了文件的查找命令,分别是locate和find命令,二者的区别很大,前者依赖于索引数据库,查找速度很快,模糊性匹配,意思是只要该路径中符合查找字段,其结果也会显示,后者则是实时性的查找工具,且并不依赖于索引数据库,只不过查找速度与前者相比略慢一些,而且查找精确。那么在这一章当中,我们来讲述Linux上的特殊权限。

一、特殊权限

  我们首先查看一下passwd命令。

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

  再看一下/tmp命令。

   # ll -d /tmp/
   drwxrwxrwt. 13 root root 4096 Jan 13 15:44 /tmp/

  以上前几个字段和我们之前所看到的权限位的字符有些不同,那么以上我们所看到的就是特殊权限,我们之前看到的无论是属主还是属组以及其它人,都是由rwx组成的,那么现在看到的是由特殊权限组成的。
  特殊权限一共有三个:SUID、SGID和STICKY。我们之前讲过安全上下文的概念,一个进程是否可以访问该文件,取决于用户的发起者是否有该权限来进行访问的应用机制,而应用机制是首先去判断该用户的发起者是不是属于该文件的属主,如果是就应用属主的权限;否则,就去检查该用户的发起者是不是属于该文件的属组,如果是则应用属主的权限;否则,该用户的发起者既不是属主也不是属组主,则就应用于其它人的权限。

   特殊权限:SUID, SGID, STICKY

   安全上下文:
     1、进程以某个用户的身份运行;进程是发起此进程用户的代理,因此以此用户的身份和权限完成所有操作;
     2、权限匹配类型:
         (1) 判断进程的属主,是否被访问的文件属主;如果是,则应用属主的权限;否则就进入第二步;
         (2) 判断进程的属主,是否属于被访问的文件属组;如果是,则应用属组的权限;否则进入第三步;
         (3) 应用other权限;

  但是,发起该命令的用户是否能够发起该命令,这要取决于该命令的文件是否该有用户的执行权限;
  以上就是正常的匹配模型,那么现在我们就介绍其特殊模型。

1.1 SUID

  我们查看一个命令文件,例如为ls命令文件。

   # ls -l /bin/ls
   -rwxr-xr-x. 1 root root 117656 Nov  6  2016 /bin/ls

  如果是以一个普通用户的身份去运行该命令的话,可以看出,则执行的是其他人的权限,不过被某个用户启动之后,该进程的属主就是当前用户。由此进行总结为:

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

  但是,如果拥有SUID权限的文件,这个用户的运行者身份,并不是该发起者,而是变成了该文件的属主;所以,我们来总结它的功能作用。

   SUID的功用:用户运行某程序时,如果此用户拥有SUID权限,那么程序运行为进程时,进程的属主不是发起者,而是文件自己的属主;

  需要注意的是,除了passwd等命令以外,所有命令如果都加上该特殊权限的话,都会有意想不到的后果,例如:cat或vim等,如果加上特殊权限,则敏感文件都可以进行查看及编辑。
那么管理文件的SUID权限命令的格式如下:

   chmod u+|-s FILE...

  那么对此它的显示方式以及其特性在这里我们来总结一下:

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

1.2 SGID

  SGID最常见的用法在修改目录的属组权限上,通常应用在目录上,任何在此目录下创建文件的用户,在该目录下,无论是目录及文件,其属组不会是该用户的基本组,而是这个目录的基本组。
  操作试题:

   1、在/tmp目录中创建目录为test;
   2、新建用户:centos、fedora、gentoo、archlinux;
   3、新建组为mygrp,讲以上新建的用户附加到这个组中;
   4、将tests的属组改为mygrp;
   5、将该目录加上SGID,使用创建的用户创建a, b, c, d这四个文件,每个文件的后面都跟上自己的用户名;

  这样做的结果是,但凡该用户是该目录的属组,那么是这个属组a用户创建的该文件,属组b用户也可以更改,需要注意的是,只能是同一个组内可以修改编辑,组以外或其它人无权修改。
  好的,以上这就是SGID的介绍及功能特性,那么我们来总结一下SGID的功能作用:

   SGID:
     功用:当目录属组有写权限,且有SGID权限时,那么所有属于此目录的属组,且以属组身份再次目录中新建文件或目录时,新文件的属组不是用户的基本组,而是此目录的属组;

  那么管理文件的SGID权限命令格式如下:

   chmod g+|-s FILE...

  那么对此它的显示方式以及特性总结如下:

   显示位置:属组的执行权限位;
       如果属组原本有执行权限,显示为小写t;
       否则,则为大写T;

1.3、STICKY

  以上的拥有SGID的用户,或者说附加该组的既可以该自己的文件,又可以该其他人的文件,但即使能更改,同时也可以删除,因为该目录属组的有写权限的话,该目录下面的所有文件都可以删除,不管是否为该用户创立,只要拥有属组的权限,则可以进行修改并删除,为了避免这样的操作,就有了Sticky的权限。
  只要某个目录拥有了该Sticky权限,在组内的任何人创建的文件,除了自己可以删除,其他人则删除不了。那么我们总结一下SGID的功能其作用。

   Sticky:
     功用:对于属组或全局可写的目录,组内的所有用户或系统上的所有用户对在此目录中都能创建新文件或删除已有的文件;如果为此类目录设置为Sticky权限,则每个用户都能创建新文件,且只能删除自己的新文件;

  管理文件的Sticky权限命令格式如下:

   chmod o+|-t FILE...

  对此,它的显示方式以及功能特性总结如下:

   显示位置:属组的执行权限位;
       如果属组原本有执行权限,显示为小写t;
       否则,显示为大写T;

  需要注意的是,系统上的/tmp和/var/tmp目录默认均有sticky权限。
  操作试题:

   1、在以上的SGID的题目中,往test目录中设置Sticky,看看有什么结果发生。

二、管理特殊权限的另一种方式

  所谓的另一种特殊权限的方式为以数字来进行表示,和之前权限复制要差不多,suid、sgid和sticky,有刚好组成三位一组,示例如下:

   suid sgid Sticky  八进制权限
    0   0   0         0
    0   0   1         1
    0   1   0         2
    0   1   1         3
    1   0   0         4
    1   0   1         5
    1   1   0         6
    1   1   1         7

  那么我们可以用以上的八进制的权限位来进行表示,比如:

   # chmod 1777

  这表示那个1为特殊权限,777属于正常权限,相当于赋予Sticky权限,因为该权限显示在执行权限位。
  所以,基于八进制方式赋权时,可于默认的三位八进制数字左侧再加一位八进制数字即可。

三、facl

  facl的名称为访问权限控制列表,每一个用户都没办法修改该文件的属主属组,作为一个普通用户,想让某一个用户对该文件拥有写权限时,正常来说只能修改other权限,但是这是非常危险的操作,因为该用户可读写,说明其他的用户也可以读写,那么facl的作用在于是一个额外新增的权限机制,在原有的权限之内,可以额外赋权机制。

   文件的额外赋权机制:
       在原有的u, g, o之外,另一层让普通用户能控制给另外的用户或组的赋权机制;

  getfacl命令是查看该文件中是否有额外权限,命令格式如下:

   getfacl命令:
       getfacl FILE...
          user:USERNAME:MODE
          group:GROUPNAME:MODE

  setfacl命令为赋予额外权限给用户或组,如何进行赋权及撤销的使用方法及命令格式如下:

   setfacl命令:
       赋权给用户:
          setfacl -m u:USERNAME:MODE FILE...
       赋权给组:
          setfacl -m g:GROUPNAME:MODE FILE...
    
       撤销赋权:
          setfacl -x u:USERNAME FILE...
          setfacl -x g:GROUPNAME FILE...

  不过,一旦有了该访问控制列表之后,那么其权限模型就会改变,那么对于新的安全上下文我们来总结一下:

   总结新的安全上下文:
     用户发的命令进程去访问该文件时,首先检查该进程是否为文件的属主,如果是,则应用属主权限,否则就检查额外专门给这个用户的访问控制列表,如果有该权限,则应用特殊的访问控制列表权限;
    
     如果不是,则检查该进程的属主是否为该文件的属组,如果是,则应用属组权限;不是,则检查该用户组是否为访问控制列表的权限,如果有该权限则应用访问控制列表中的权限。
    
     不是则为other。