1、文件权限


1.1、三类权限简述


   读、写、执行:rwx。


1.2、文件属性操作

    chown :设置文件的所有者(属主信息);
    chgrp :设置文件的属组信息;


1.3、修改文件的属主和属组

1.3.1、修改文件的属主及属组:chown


语法:

    chown [OPTION]... [OWNER][:[GROUP]] FILE...


用法:命令中的冒号可用.替换;

    OWNER:属主;    
    OWNER:GROUP:属主、属组;
    OWNER.GROUP:属主、属组;
    OWNER: :属主、属组;
    OWNER.:属主、属组;
    :GROUP:属组;
    .GROUP:属组;


选项:

    -R: 递归;    
    --reference:chown [OPTION]... --reference=RFILE FILE...


1.3.2、修改文件的属组: chgrp


语法:

    chgrp [OPTION]... GROUP FILE...


选项:

    -R: 递归;    
    --reference:chgrp [OPTION]... --reference=RFILE FILE...



1.4、文件权限三类及针对用户



文件的权限主要针对三类对象进行定义:

    owner: 属主, u;    
    group: 属组, g;
    other: 其他, o;
        注:a表示ugo三类用户的总和。

每个文件针对每类访问者都定义了三种权限

    r: Readable;    
    w: Writable;
    x: eXcutable;


20171203161015.png



1.5、文件、目录的权限


文件:

    r: 可使用文件查看类工具获取其内容;例如cat。    
    w: 可修改其内容;例如echo,vim。
    x: 可以把此文件提请内核启动为一个进程。


目录:

    r: 可以使用ls查看此目录中文件列表;    
    w: 可在此目录中创建文件,也可删除此目录中的文件;
    x: 可以使用ls -l查看此目录中文件列表,可以cd进入此目录。这是目录的基础权限,没有x权限,就谈不上rw权限。
    X:只给目录x权限,不给文件x权限。
        注意:但是如果这个目录中的某个文件对某类用户已经有了写权限,那么为整个目录添加X权限会导致已经有写权限的文件对三类用户都具有写权限。
x权限为目录的基础权限的原因解读:
    因为用户这个目录没有执行权限,所以无法cd进这个目录,那么也就看不到这个目录中的文件的iNode信息,那么自然也无法访问目录中的文件;所以对于目录如果用户没有x权限,那么就只能看到目录中的文件的名称,连进一步的详细信息都无法查看。对于目录的执行权限是指是否能cd进去,是否可以查看文件的内容;如果没有对于目录没有x权限,那么就无法cd进目录,也不能查看目录中文件的内容。


1.6、文件权限的数字表示法


文件权限使用八进制数字进行表示:

 --- 000 0
 --x 001 1
 -w- 010 2
 -wx 011 3
 r-- 100 4
 r-x 101 5
 rw- 110 6
 rwx 111 7


例如:

    640: rw-r-----    
    755: rwxr-xr-x


1.7、权限修改命令:chmod


语法:

    数值法:chmod [OPTION]... OCTAL-MODE FILE...
    模式法:chmod [OPTION]... MODE[,MODE]... FILE...


常用选项:

    -R: 递归修改权限



MODE法:

(1)修改一类用户的所有权限:u= g= o= ug= a= u=,g=。如u=rw,u=rwx;

(2)修改一类用户某位或某些位权限u+ u- g+ g- o+ o- a+ a- + -

(3)参考RFILE文件的权限,将FILE的修改为同RFILE
    chmod [OPTION]... --reference=RFILE FILE...


权限设置示例:

    chgrp sales testfile;    
    chown root:admins testfile;
    chown sunwukong testfile;
    
    chmod u+wx,g-r,o=rx file;
    chmod -R g+rwX /testdir;
    chmod 600 file;


权限设置总结:


    模式(mode)法:ugoa,+-=,rwx;
    数值(digit)法:
        rwx:4+2+1;
        r--:4, -w-:2, --x:1;
        rwxrwxrwx:777;
        原理是:
            rwxrwxrwx:每个权限有就是1,没有就是0,所以就是111 111 111,将111的二进制转换成十进制;所以每组rwx就是0-7;
            所以000:就是---------;777就是rwxrwxrwx;
            chmod 7是相当于007;所以设置的时候一般是三个数字一组。一般来说0,4,6,权限使用的比较多。
            对目录大多是5;在恢复数据的时候,要注意参考同类文件的权限;如用户家目录文件、目录,挂载点的目录权限。



2、umask


背景:

    新建文件和目录的默认权限是通过umask的定义的;


umask值:可以用来保留在创建文件权限。

    新建FILE权限: 666-umask;如果所得结果某位存在执行(奇数)权限,则将其权限+1。
    新建DIR权限: 777-umask。


    非特权用户umask是 002;
    root的umask是022。


umask值的设定与查看:

    umask –S 模式方式显示;
    umask –p 输出可被调用;
    全局设置: /etc/bashrc 
    用户设置: ~/.bashrc




3、Linux文件系统上的特殊权限


三类特殊权限:SUID, SGID, Sticky;

三种常用权限: r, w, x user, group, other;



安全上下文:

    安全上下文指的是一类定义某个进程允许做什么的许可和权限的集合。
    概念范围是很广的,权限、特权、访问令牌、完整性等级等等都包含在其中。




特殊权限的前提:

进程有属主和属组;文件有属主和属组。
    (1) 任何一个可执行程序文件能不能启动为进程,取决发起者(某类用户)对程序文件是否拥有执行权限;
    (2) 启动为进程之后,其进程的属主为发起者,进程的属组为发起者所属的组;
    (3) 进程访问文件时的权限,取决于进程的发起者。
        (a) 进程的发起者,同文件的属主:则应用文件属主权限;
        (b) 进程的发起者,属于文件属组;则应用文件属组权限;
        (c) 应用文件“其它”权限;




3.1、可执行文件上SUID权限



注意点:

 任何一个可执行程序文件能不能启动为进程:取决发起者对程序文件是否拥有执行权限。
 启动为进程之后,其进程的属主为原程序文件的属主(而非发起者)。
 SUID只对二进制可执行程序有效。
 SUID设置在目录上无意义。




权限设定:

chmod u+s FILE...
chmod u-s FILE...

    注意:如果某个二进制文件没有可执行权限那么,他显示的权限将不是s,而是S。



3.2、可执行文件上SGID权限

    任何一个可执行程序文件能不能启动为进程:取决发起者对程序文件是否拥有执行权限;
    启动为进程之后,其进程的属组为原程序文件的属组(而非发起者)。
    此时SGID只对二进制可执行程序有效。


权限设定:

    chmod g+s FILE...    
    chmod g-s FILE...



3.3、目录上的SGID权限


注意:

    默认情况下,用户创建文件时,其属组为此用户所属的主组;
    一旦某目录被设定了SGID,则对此目录有写权限的用户在此目录中创建的文件所属的组为此目录的属组;
    通常用于创建一个协作目录。


权限设定:

    chmod g+s DIR...    
    chmod g-s DIR...



3.4、Sticky 位


注意:

具有写权限的目录通常用户可以删除该目录中的任何文件,无论该文件的权限或拥有权;
在目录设置Sticky 位,只有文件的所有者或root可以删除该文件。
sticky 设置在文件上无意义。




权限设定:

    chmod o+t DIR...    
    chmod o-t DIR...


例如:

    ls -ld /tmp
    drwxrwxrwt 12 root root 4096 Nov 2 15:44 /tmp



3.5、权限位映射

(1)SUID: user,占据属主的执行权限位;

    s: 属主拥有x权限;    
    S:属主没有x权限;


(2)SGID: group,占据属组的执行权限位;

    s: group拥有x权限;
    S:group没有x权限;


(3)Sticky: other,占据other的执行权限位;

    t: other拥有x权限;
    T:other没有x权限;


3.6、特殊权限数字法


SUID SGID STICKY对应着二进制的三位,具有该权限就是1,没有该权限就是0;转换成10进制,那么就是0-7。

    000 0    
    001 1
    010 2
    011 3
    100 4
    101 5
    110 6
    111 7


示例:

    chmod 2777 /tmp/testdir    /添加/




3.7、设定文件特定属性


 chattr +i:不能删除,改名,更改;-i就是关闭该属性。
 chattr +a:只能追加内容;
   chattr +A:锁定accesstime的更新,即便是cat访问,但是使用touch FILE强制刷新文件的时间戳,那么他的时间还是会修改的。
       注意在复制一个文件的时候如果不使用-p,-a等选项的时候,目标文件的accesstime时间就会修改;
 lsattr:显示特定属性;



注意:

    (1)这种特殊属性一旦设置,即便是管理员也不能对文件进行超限的操作,那么管理员就需要关闭特殊属性后再进行操作。

    

    (2)因为传统权限和SUID、SGID、Sticky等特殊权限只对普通用户生效,不对root用户生效,如root用户为了避免了自己的误操作造成可怕后果,或者是避免其他用户使用SUID或者SGID对个别文件进行操作。那么可以使用chattr命令对文件进行权限设置,这时root用户也是无权限操作的。
     
    (3)如我们有这样一个需求,暂时不希望创建用户,即不希望任何人暂时修改/etc/passwd和/etc/shadow文件;因为创建新账户需要修改passwd文件。这往往是因为我们的系统比较稳定了,不再需要添加新的用户了,或者是防止其他人以管理员身份误操作,或者是***创建账户等。




4、访问控制列表


4.1、ACL意义及开关


ACL: Access Control List,可以实现灵活的权限管理。除了文件的所有者,所属组和其它人,可以对更多的用户设置权限。


版本区别:

    CentOS7 默认创建的xfs和ext4文件系统具有ACL功能;
    CentOS7 之前版本,默认手工创建的ext4文件系统无ACL功能,需手动增加。

   tune2fs –o acl /dev/sdb1    
   mount -o acl /dev/sdb1 /mnt/test


ACL生效顺序:

    ACL生效顺序,文件、目录属主-->文件、目录属组、自定义用户、自定义组(都要参照mask)-->other用户。
        ACL权限不仅可以对文件设置,也可以对目录进行设置。



4.2、为多用户或者组的文件和目录赋予访问权限rwx

 

     mount -o acl /directory
     
     getfacl file |directory    
     setfacl -m u:wang:rwx file|directory    /为自定义用户设置ACL权限/
     setfacl -Rm g:sales:rwX directory        /为自定义组设置ACL权限,这里的权限是基于目录的SGID权限;/
     
     setfacl -M file.acl file|directory    /参考文件中的权限,为目录或者文件设置权限;/
     setfacl -m g:salesgroup:rw file| directory    /-m的作用相当于是添加权限;/
     setfacl -m d:u:wang:rx directory    /为某目录设置默认的ACL权限/
     
     setfacl -x u:wang file |directory    /清除目录或者文件的ACL权限;/
     setfacl -X file.acl directory


一些选项:


-b和-x清除一个文件或者目录的ACL权限的方法和区别:

    setfacl -b是比较彻底的一种做法;
    当然了也可以使用setfacl -x u:USER FILE|DIR,setfacl -x g:GRP FILE|DIR,setfacl -x mask FILE|DIR,三步可以清除ACL规则。        
    没有删除用户或者组的ACL权限的话,直接清除mask是清除不掉的。
    
    -b在实现完全清除ACL权限,往往要借助于-R递归清除该目录及其下级目录及文件的ACL权限。


-M FILE:

   支持将ACL的权限放在一个文件中;即如果还有别的类似的目录也想设置类型的权限;
   那么我们可以将这个权限事先放在一个文件中。
   
   -M就是调用ACL权限文件;这个文件的格式是有要求的,但是文件命名是没有要求的。
   这个文件中可以放多条规则,可以对文件目录、用户和组等设置权限。
   这种通过文件实现批量处理的命令有:file -f FILE_LIST,newusers FILE_LIST,setfacl -M FILE_LIST;


-X FILE:

    如果我们想多次取消一个规则的时候,也没必要每个都重复的手动写一次;使用-X调用这个文件。


-d:

    setfacl -m d:u:wang:rx directory:d是指defaults,默认的意思。
    因为使用“setfacl -R -m u:wang:rx directory”对一个目录及其下面的所有文件设置ACL权限,
    但是在这个目录下新建的文件并不会继承这个ACL权限控制,但是使用"d:"之后就可以实现新建的文件也继承ACL权限。
    使用-m -d后:目录中的老文件的ACL控制权限消失了,但是目录上出现了默认的ACL权限;
    
    需要注意:默认ACL权限设置不能设置在文件上,只能设置在目录上。
    [root@centos7x app]#setfacl -m d:apache:rw html/html1 
    setfacl: html/html1: Only directories can have default ACLs
    
    虽然老文件的ACL标记转移到他的父目录中了,但是新建立的文件会从设置了默认ACL控制的目录中继承ACL权限,
    并且新建立的文件和目录是有ACL标记的,这是与默认ACL目录中的老文件在ACL标记上的区别;
    即便是子子目录下新建的文件或者目录也会继承设置了默认ACL控制的目录的ACL权限。


-k:

    使用#setfacl -k DIR可以清除当前目录上的默认权限,于是目录下的文件也就无法从这个目录中继承ACL权限;
    但是这个目录下的子目录中的ACL默认权限并没有清除,所以在清除默认的ACL权限的时候尽量搭配-R递归清除。
    注意:
        使用#setfacl -k DIR可以清除一个目录上设置的默认ACL权限,但是也只是清除了默认的ACL权限,
        如果此前使用setfacl -m设置过ACL权限,那么这个举动是不会将ACL权限清除的,不论是下级的目录还是文件。
        所以说取消默认权限取消的是该目录的默认ACL权限,下级文件因而无法继承,但是下级目录一旦继承上后,
        即便取消了父目录的默认ACL权限,子目录的默认ACL权限是不能取消的,所以要搭配-R递归清除。
        要想清除ACL权限或者是默认ACL权限彻底一些,那么就使用-b权限完全清除。


--set选项:

    会把原有的ACL项都删除,用新的替代,需要注意的是一定要包含UGO的设置,不能象-m一样只是添加
    ACL就可以。示例:setfacl --set u::rw,u:wang:rw,g::r,o::- file1
    注意--set与-m的区别在于,-m是对一个文件的ACL控制进行设置或增加;但是--set则是对一个文件的ACL权限是先覆盖
    使用--set的时候,需要将文件或者目录对于用户、组、other的权限都写一遍,一个不能落下。
        u::MOD是属主的权限;g::MOD是属组的权限;u:USER:MOD是自定义用户的权限,g:GRP:MOD是自定义组的权限;
        o::MOD,other::MOD是other用户的权限。所以使用ugo或者user、group、other等都是可以的;


    [root@centos7x app]#setfacl --set u::r,u:wang:rw,g::r,o::- f1    
    [root@centos7x app]#getfacl f1
    # file: f1
    # owner: root
    # group: root
    user::r--
    user:wang:rw-
    group::r--
    mask::rw-
    other::---
  注意:
      属主属组other用户是必写的,自定义用户和组是选写的,不写的一类用户是没有权限的。
      所以--set是重设的意思,相当于chmod的=;--set在写脚本的时候是十分有用的。
    [root@centos7x app]#setfacl --set user::-,u:wang:rw,g::w,g:devs:r,o::- f1;getfacl f1    
    # file: f1
    # owner: root
    # group: root
    user::---
    user:wang:rw-
    group::-w-
    group:devs:r--
    mask::rw-
    other::---



4.3、ACL用法


 ACL文件上的group权限是mask 值(自定义用户,自定义组,拥有组的最大权限),而非传统的组权限。
 getfacl可看到特殊权限:flags。
 通过ACL赋予目录默认x权限,目录内文件也不会继承x权限
 base ACL 不能删除;
 setfacl -k dir 删除默认ACL权限;
 setfacl –b file1清除所有ACL权限;
 getfacl file1 | setfacl --set-file=- file2 复制file1的acl权限给file2。

   对某类用户不设置任何权限的话,可以写做“-,---,0,000”,四种写法都是可以的。
   多个自定义组的生效顺序是没有优先级的,他们是或的关系。
   如果一个用户加入多个组的时候,那么用户所具有的权限是多个组所具有权限的或计算。
   
   注意:我们修改f1文件属组的权限,之所以不使用chmod g+r f1进行修改,
         是因为ll f1显示的结果中中属组的权限已经不是真正属组的权限,而是mask的权限。



    mask只影响除所有者和other的之外的人和组的最大权限Mask需要与用户的权限进行逻辑与运算后,    
    才能变成有限的权限(Effective Permission)。
    
    用户或组的设置必须存在于mask权限设定范围内才会生效。
    
    设置mask权限的方法:setfacl -m mask::rx file
    
    --set选项会把原有的ACL项都删除,用新的替代,需要注意的是一定要包含UGO的设置,不能象-m一样只是添加ACL就可以。
        示例:setfacl --set u::rw,u:wang:rw,g::r,o::- file1


4.4、备份和恢复ACL


主要的文件操作命令cp和mv都支持ACL,只是cp命令需要加上-p 参数。但是tar等常见的备份工具是不会保留目录和文件的ACL信息。


    注意:使用cp命令默认复制的时候,ACL权限是会丢失的,但是使用-p或者-a权限的时候是可以保留文件的ACL权限的;但是并不是所有的命令都是像cp命令一样支持保存文件的ACL权限的,比如说打包命令,我们将一个目录打包到另一个服务器上去,这时ACL权限是会丢失的;所以我们对文件或者目录的ACL权限进行备份是十分有效的手段。

    getfacl -R /tmp/dir1 > acl.txt 
       
    setfacl -R -b /tmp/dir1    /递归清除ACL权限/
    setfacl -R --set-file=acl.txt /tmp/dir1    /递归设置ACL权限/
    setfacl --restore acl.txt    /递归恢复ACL权限/
    
    getfacl -R /tmp/dir1



4.5、续:ACL权限设置上的一些注意



user::rw     u::rw    /设置属主的权限/
group::rw    g::rw    /设置属组的权限/
other::rw    o::rw    /设置其他用户的的权限/

mask::rwx    /设置mask的权限/

u:USER_NAME:r    /设置自定义用户的的权限/
g:GRP_NAME:r    /设置自定义组的权限/
o:GRP_NAME:-   /设置其他类用户的无任何权限/