我们使用Linux操作系统的过程中,必然存在对有限资源使用的限制性,那么操作系统就必须提供一种途径来保证每个用户独立、合理的使用计算机,那么Linux采用的用户权限的管理机制是怎么样的呢?

首先,用户的权限有四个部分:普通权限、特殊权限、文件的特殊属性以及FACL--文件访问控制列表;


一、普通权限:

 在用户与群组中,我们提到了进程安全上下文(Secure Context),这里做一个回顾:

 进程运行的过程:

  1.判断进程的所有者是否为想要操作的文件的属主,如果是就按照属主的权限进行授权,如果不是,转2

  2.判断进程的所有者是否为想要操作的文件的属组中的成员,如果是 就按照属组的权限进行授权,如果不是 转3

  3.按照其他用户的权限进行授权。

这里所涉及到的授权,就是对用户进行权限的分配,那么权限到底是个什么东东呢?

   linux权限机制采用UGO模式。其中 u(user)表示所属用户、g(group)表示所属组、o(other)表示除了所属用户、所属组之外的情况。权限的构成是MODE+OWNERSHIP,即使用权和所有权;

  ★MODE(Permisson):使用权,包括三个部分(rwx 可读可写可执行)

  --对于目录来说:

     r:代表可以使用ls命令获取其中所有的文件名的列表;

     注意:不能使用 ls -l 命令获取目录中文件的详细属性信息,也不能用cd进入其中,也不能在          路径中引用该目录;

     w:表示可以修改此目录中的文件名或者文件名列表,即:可以在此目录中增删改文件名;

     x:可以使用ls -l获取文件的详细属性信息;****

   这里的 x权限是目录的最基本的权限,即任何目录都必须对任和用户开放x权限,不然的话用户

   将无法对该目录进行任何操作,没错,任何操作都不可以!所以说x权限很基本也很重要。

  --对文件来说:

     r:可以查看或者获取文件存放的数据

     w:可以修改文件存放的数据

     x:可以将此文件发起运行为进程;


 在文件的详细属性信息中:我们会看到这样的一个字段

 rw-r--r--  我们把这三组称为三个权限位,分别代表属主,属组,其他用户的权限,- 代表不具备r/w/x的权限;

我们可以用八进制 0-7分别表示权限位的分配情况

     权限标识三元组:

      --- 000  0

      --x 001  1

      -w- 010  2

      -wx 011  3 

      r-- 100  4 

      r-x 101  5

      rw- 110  6 

      -wx 111  7

举个例子~ rwxr-xr-x --> 111101101--> 755

了解了权限的构成,下面介绍有关使用权的管理命令:


修改使用权的命令:chmod

 1.chmod [option]... MODE[,MODE]... FILE... 符号表示法进行权限修改

   MODE 表示符号权限的标识

     u,g,o,a表示所有权,a是all 全部用户

     用+,-,= 加上具体权限rwx

      +:在原有的权限基础上增加新的权限

      -:在原有的权限基础上去除某些权限

      =:不考虑原有的权限,直接将权限设置为目标权限

 例如 chmod u+w FILE; chmod g+rw FILE; chmod u+x,g+wx,o-x FILE ......

      chmod +x file 默认的为a添加,即所有用户 添加可执行的权限

      chmod +w file 默认的只为属主添加写权限

注意:能不能删除某文件,主要查看登录用户是否对该文件所在的目录有w权限

再次强调,文件的执行权限,对linux系统而言是非常重要的安全标识; 因为一旦文件具备了执行权限,意味着该文件可以被发起直行为进程,所以默认情况下文件都不具备执行权限;


  2.chmod [option]... OCTAL -MODE FILE

   八进制数字标识,每次必须给足所有的权限位;如果给的权限位不完整,文件系统会自动补足,将给定的权限放在最右侧,左侧用0补足;

   例如 chmod 640 file

  3.chmod --reference=/PATH/TO/FILE DES_FILE

   这是一个仿照某个文件的权限设置给指定文件设置权限的命令;

   例如  chmod --reference=a b

【选项】:

   -R,--Recursive:将目标目录的文件及子目录及子目录中的文件统一设置为指定的权限标识;

  ★OWNERSHIP:所有权 ugo

      属主:资源掌控的某个特定用户:owner(user)--u

      属组:资源掌控的某些特地用户;group--g

      其他用户:未曾掌控资源的用户;other--o

      全部用户 all--a

所有权比较好理解,前面也稍微提到过;所以直接来介绍它的相关命令:


①chown : 修改文件的属主和属组

 用法:chown [opt]... [owner][:[group]] FILE

     chown OWNER FILE

     chown :GROUP FILE

     chown OWNER: FILE // 将目标文件的属主改为owner 同时将属组修改为ower的基本组

     chown OWNER:GROUP FILE // 属主和主组改为OWNER和GROUP;

     chown [opt]... --reference=RFILE FILE...

【选项】

  -R,将目标目录的文件及子目录及子目录中的文件统一设置为指定的所有权;

  注意:修改OWNERSHIP操作只有root可以完成


②chgrp:只用来修改文件的所属组 

##这里补充两个小命令

  1.install命令:

    安装:复制文件并给文件增加执行权限;

    单源复制:

     install [options] [-s] [--strip] source dest

    多源复制:

     install [options] [-s] [--strip] source... directory

    创建目录:

     install [options]... -d DIR

 【常用选项】

    -m:指定目标文件的权限,默认755

    -o:设定目标文件的属主;仅超级用户可用;

    -g:设定目标文具店的属组;仅超级用户可用;

  注意:此命令不能复制目录,即其源不能是目录,如果源是目录,则install会进入目录,依次复制其中的所有非目录文件到目标位置;


  2.mktemp:创建临时文件

   一般来讲,临时文件到会创建在/tmp或/var/tmp,无需手动删除,系统会定期自动清除这两个目录的文件;

  -d,--directory:可以创建临时目录;

  例: mktemp /PATH/TO/TMP.XXXXXXX(至少三个X) [-d] X越多,碰撞的几率就越小


二、特殊权限--SUID SGID STICKY

  默认情况下,用户发起执行一个进程,该进程的属主是其发起者,也就是说,该进程是以其发起者的身份在运行

  1.SUID:

   功能:用户发起执行一个进程时,该程序文件如果拥有SUID权限,那么此程序发起的进程,其属主为该程序文件的属主而不是其发起者;

   suid权限所显示的位置在文件的属主权限中的执行权限位; 如果属主本来就有执行权限,显示为s,否则显示为S;


   管理文件的SUID权限,例如chmod u+|-s FILE...


  2.SGID:

    功能:如果某个目录对于一些用户有写权限,并且设置了SGID,则所有对此目录有写权限的用户在创建新文件或目录以后,新文件或目录的属组不再是创建用户的基本组而是继承该目录的属组;


   SGID权限显示的位置 在文件的属组权限中的执行权限位;如果属组本来有执行权限,显示为s,否则显示为S;


   管理文件的SGID权限 例如 chmod g+/-s FILE...


  3.STICKY:粘滞位

 如果某个目录中,超过一个用户有写权限,则这多个用户都可以在该目录中随意增删改文件名;

  功能:如果为上述类似的目录设置了STICKY权限,则每个用户仍旧能够在这类目录里创建、修改文件名,但是,每个用户只能删除那些属主为其自身的文件名;

  位置显示在文件权限的其他用户权限中的执行权限位,如果原来有执行权限,显示为t,否则显示为T;


  管理文件的STICKY权限 例如chmod o+/-t FILE...


 suid  sgid  sticky的三个特殊权限也可以视作一个 三元组


 ---  000  0

 --t  001  1

 -s-  010  2

 -st  011  3

 s--  100  4

 s-t  101  5

 ss-  110  6

 sst  111  7


特殊权限的另一种修改方式:

 将特殊权限对应的八进制数字放置于普通权限八进制数字的前面即可


 例如:给某个目录加上粘滞位

  chmod 1755 DIR


umask

  权限遮罩玛:在创建文件或者目录的时候默认的权限生成标准

  root:0022

    第一个0表示不考虑特殊权限位, 

    对于新建文件或目录,不遮挡属主的任何权限,但是遮挡了属组的写权限。和其他用户的写权限


    mkdir test --> rwxr-xr-x 755

    touch test.txt --> rw-r--r-- 644


   理解遮罩码,将遮罩码的值变成二进制,凡是有1的位置,在创建文件时 这个权限位不予设置;

   默认情况下,文件的遮罩码已经有了一个0111 在此基础上再次应用umask来遮罩权限;


三、.文件的特殊属性:

 查看文件的特殊属性 

  lsattr命令:

   显示文件在Linux第二扩展文件系统上的特有属性

   lsattr [ -RVadv ] [ files...  ]


  修改设置文件的特殊属性

    chattr [ -RV ] [ -v version ] [ mode ] files...


     mode:会使用+-=的方式来设置;

       +:在原有属性设定的基础上,添加新的属性;

       -:从原有属性设置中移除某些指定的属性;

       =:不考虑原有属性设置,直接将文件的属性更新为指定的属性内容;

     整个chattr最关键核心的设置就是mode部分

       [aAcCdDeijsStTu]都是所需要的属性;

       

        a:append; 设置这个属性的文件,其内容不能被更改和删除,只能以追加的方式向文件中写数据;

          多数的服务器日志类文件会设置此属性

        A:atime,  文件的访问时间戳;IO瓶颈  

          设置A属性时,可以使得文件在被访问时不更改文件的访问时间戳,从而可以有效的防止IO瓶颈的发生;

        c: 设置文件是否自动压缩后再进行存储;

        C:设置文件是否开启“写时复制”属性;

        d:设置文件在使用dump进行备份的时候,不会成为备份目标;

        D:设置文件在文件系统中的异步写错左;

        i:设置文件不能被删除、修改、设定链接关系;只读!

        s:设置文件的保密性删除,一旦设置了此属性的文件被删除,其对应存储设备中的使用空间会一并删除;

        u:与s属性相反,如果这样的文件被删除,其存储于存储设备中的数据会被留存;


       其中最常用的属性是i和a;


       chattr +/-/= i FILE...


    同样也有-R选项  递归的设置指定目录中的所有文件和子目录的特殊属性;


四、为文件赋予额外的权限机制:FACL file access control list(并不是每个文件系统都支持)

  

  在原有的u,g,o权限位之外,让普通用户能够控制权限赋予另外用户和组的一种授权机制。CentOS7和RHEL7之后的发行版 逐渐成熟,CentOS5之前不支持;


  与FACL有关的命令:

    1.getfacl

      etfacl [-aceEsRLPtpndvh] file ...

        user:USERNAME:MODE

        group:GROUPNAME:MODE

        other::MODE


    2.setfacl

      setfacl [-bkndRLPvh] [{-m|-x} acl_spec] [{-M|-X} acl_file] file ...


      acl_spec: acl_specification,指定的访问控制列表

        u:USERNAME:MODE

        g:GROUPNAME:MODE

          MODE:一般使用符号权限标识法


     为用户赋予额外权限:

       setfacl -m u:USERNAME:MODE FILE ...

     撤销为用户赋予的额外权限:

       setfacl -x u:USERNAME

     


     为组赋予额外权限:

       setfacl -m u:GROUPNAME:MODE FILE ...


     撤销为组赋予的额外权限:

       setfacl -x u:GROUPNAME

注意:如果设置了facl之后再修改目标文件的使用权限,那么facl中设置的条目就可能会受到影响,而导致与要求不符;因此,如果真的需要设置facl,就要在已经确定目标文件的使用权限以后再进行设置;