Linux 基础命令(四)—— 文件的权限和访问控制列表(ACL)


Linux 基础命令(四)—— 文件的权限和访问控制列表(ACL)



 Published On July 24, 2017

前言

  文件的权限以及访问控制列表贯穿在整个的Linux使用过程中。我们知道,在Linux 中一切皆文件,因而文件的权限,就自然而然地成为了Linux使用过程中需要频繁接触到的知识内容。而文件权限这一部分地内容,又非常地复杂,因为我们将在这篇文章当中详细地介绍文件的权限,加深自己的理解,同时留作备忘。

本文将通过以下几个方面的内容来介绍文件的权限。

1.文件权限
  主要介绍文件的权限,以及每种权限代表着哪些含义。

2.修改文件权限
   介绍如何修改文件的权限

3.Linux 系统上特殊文件权限
   介绍Linux 系统上的文件的特殊权限,SUID,SGID,Sticky

4.访问控制列表
   介绍了如何使用ACL(访问控制列表)来设置复杂权限。

文件权限

关于文件权限可参考如下示意图,此图中列举出了文件的元数据,我们接下来将针对文件的权限进行详细的描述。

文件权限的定义

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

     Owner: 属主 u
     Group: 属组 g
     Other: 其他 o

  • 每个文件针对每一类的访问者都设定了三种权限

     r: Readable 读
     w: Writeable 写
     x: eXcutable 执行

不同类型文件的权限及其功能

  • 文件
       r: 可以使用文本查看类工具获取其内容。 但是对root用户不起作用。如果没有权限,file 文件将不可用,因为file文件需要读取文件头来获取文件信息。
       w: 可以修改其内容,但是对root用户不起作用。
       x: 可以将此文件提请内核启动一个进程。即二进制文件,可执行。对root用户有效。

  • 目录
       r: 可以使用ls命令查看目录内的文件列表。
       w: 可以在此目录中创建文件,也可以删除此目录中的文件。
       x: 可以使用ls -l 查看此目录中文件列表,可以cd 进入此目录。
       X: 只给目录x权限,目录内文件,如果本身就有x权限,则给ugo加上x权限,如果本身不具备x权限,则不给文件x权限。

   由上,我们可以知道,一个用户能否对某一个文件进行删除,取决于该用户在该文件所在的目录上的权限,而不取决于在该文件上的权限。
   如果用户对目录有写权限,用户就能够删除该目录下的文件。

文件权限操作

关于文件权限的所有操作,我们将参考如下表格,这张表清晰的列举了文件权限相对应的操作。

表文件权限

文件权限的修改

切换 属主,属组

就目前而言,一个用户对于文件一共有三种身份,分别是属主,属组,和其他。我们可以通过最基本的方式来给一个用户提供权限,就是修改文件的属主,属组。

  • 修改文件的属主:chown   选项   属主:属组   文件
       修改属主: chown USERNAME FILE
       修改属组: chown :GROUPNAME FILE
       修改属主和属组: chown USERNAME:GROUPNAME FILE
       命令中的冒号可以使用 . 来替代
       或者直接引用某个文件的属性来替换自己的元数据 chown [OPTION]… –reference=RFILE FILE…
       -R : 递归修改目录内的文件。
  • 实例
 //通过ll命令查看测试环境
    drwxr-xr-x. 2 root root 6 Jul 25 09:17 dir
    -rw-r--r--. 1 root root 0 Jul 25 09:17 f1
    -rw-r--r--. 1 root root 0 Jul 25 09:17 f2    
    -rw-r--r--. 1 root root 0 Jul 25 09:20 f3

    //修改f1属主  
    chown mage f1  

    -rw-r--r--. 1 mage root 0 Jul 25 09:17 f1  

    //修改f2属组  
    chown :mage f2  

    -rw-r--r--. 1 root mage 0 Jul 25 09:17 f2  

    //同时修改属主 属组  
    chown tom:mage f3  

    -rw-r--r--. 1 tom  mage 0 Jul 25 09:20 f3  

    //直接应用某个文件的属组属主来改变目标文件的属主属主  

    chown --reference=f3 f1  

    -rw-r--r--. 1 tom  mage 0 Jul 25 09:17 f1  


    //ll dir/  
    -rw-r--r--. 1 root root 0 Jul 25 09:35 f4
    -rw-r--r--. 1 root root 0 Jul 25 09:35 f5

    //递归修改目录内文件的属主和属组
    chown -R  mage:tom dir

    drwxr-xr-x. 2 mage tom  26 Jul 25 09:35 dir  

    -rw-r--r--. 1 mage tom 0 Jul 25 09:35 f4
    -rw-r--r--. 1 mage tom 0 Jul 25 09:35 f5
  • 修改文件的属组:chgrp   选项   属组   文件
       修改属组: chgrp GROUPNAME FILE
       命令中的冒号可以使用 . 来替代
       或者直接引用某个文件的属性来替换自己的元数据 chgrp [OPTION]… –reference=RFILE FILE…
       -R : 递归修改目录内的文件。

具体实例可以参考修改文件属主的相关案例。

模式法修改文件或目录的权限

chmod 修改文件权限
使用方法为: chmod u+wr,g-r,o=rw file
chmod [OPTION]… –reference=RFILE FILE… 参考RFILE文件的权限,将FILE的修改为同RFILE
也可以使用 -R 递归选项

 //ll 命令列出实验环境  

    drwxr-xr--. 2 root root 26 Jul 25 10:04 dir
    -rw-r--r--. 1 root root  0 Jul 25 10:03 f1
    -rw-r--r--. 1 root root  0 Jul 25 10:03 f2
    -rw-r--r--. 1 root root  0 Jul 25 10:04 f3  
    -rw-r--r--. 1 root root  0 Jul 25 10:08 f4

    //ll dir/  列出实验环境  
    -rwxr--r--. 1 root root 0 Jul 25 10:04 f5
    -rw-r--r--. 1 root root 0 Jul 25 10:04 f6  


    //实验一: 设置f1 属组权限 为 wx 

    chmod g=wx f1  

    //实验二:设置 f2 其他用户权限为 rwx
    chmod o+wx f2  

    //实验三: 设置f3 所有用户的权限为rw

    chmod a=rw f3

    //实验四: 以f3文件为参考设置f4文件权限与f3一致 

    chmod --referenec=f3 f4

    //实验结果  
    -rw--wxr--. 1 root root  0 Jul 25 10:03 f1
    -rw-r--rwx. 1 root root  0 Jul 25 10:03 f2
    -rw-rw-rw-. 1 root root  0 Jul 25 10:04 f3
    -rw-rw-rw-. 1 root root  0 Jul 25 10:08 f4

    //实验五:递归修改dir路径权限,为o=wX  
    chmod -R o=wX dir  

    ll dir/  

    -rwxr---wx. 1 root root 0 Jul 25 10:04 f5
    -rw-r---w-. 1 root root 0 Jul 25 10:04 f6  

从实验五可以看出一点,就是X 权限只给目录x权限,目录内文件,如果本身就有x权限,则给ugo加上x权限,如果本身不具备x权限,则不给文件x权限。

数字法表示文件或目录的权限

在表示权限修改的方法上还可以使用数字法来表示文件的权限。可以参考表文件权限操作。

总的来说,如果一个属主,只具备r权限,那么该属主的权限位使用二进制表示为100.换算成十进制就是4 .同理如果同时具备rw权限,那么使用二进制可以表示为110.换算成十进制就是6.依次类推,我们知道可以使用数字4表示r,2表示w,1表示x,如果全部权限都具备的话,就是7。

下面我们将使用数字法重新实现模式法中的实验。

 //ll 命令列出实验环境  

    drwxr-xr--. 2 root root 26 Jul 25 10:04 dir
    -rw-r--r--. 1 root root  0 Jul 25 10:03 f1
    -rw-r--r--. 1 root root  0 Jul 25 10:03 f2
    -rw-r--r--. 1 root root  0 Jul 25 10:04 f3  
    -rw-r--r--. 1 root root  0 Jul 25 10:08 f4

    //ll dir/  列出实验环境  
    -rwxr--r--. 1 root root 0 Jul 25 10:04 f5
    -rw-r--r--. 1 root root 0 Jul 25 10:04 f6  


    //实验一: 设置f1 属组权限 为 wx 

    chmod 634 f1  

    //实验二:设置 f2 其他用户权限为 rwx
    chmod 647 f2  

    //实验三: 设置f3 所有用户的权限为rw

    chmod 666 f3

    //实验四: 以f3文件为参考设置f4文件权限与f3一致 

    chmod --referenec=f3 f4

    //实验结果  
    -rw--wxr--. 1 root root  0 Jul 25 10:03 f1
    -rw-r--rwx. 1 root root  0 Jul 25 10:03 f2
    -rw-rw-rw-. 1 root root  0 Jul 25 10:04 f3
    -rw-rw-rw-. 1 root root  0 Jul 25 10:08 f4

通过数字法,我们可以发现,如果要设置单个权限的话,模式法更方便,可是如果要设置所有权限的话,使用数字法,会更加的方便快捷。

新建目录和文件的默认权限

新建目录和文件的默认权限是由系统中umask值来决定的。
新建FILE权限:666-umask (对位相减)    由数字法赋权限的过程中,我们能够发现,凡是奇数权限,总是包含执行权限的。而一个文件如果默认就包含执行权限其实是非常危险的。因此如果所得结果中某位存在执行(奇数)权限,则将其权限加1.
新建DIR权限:777-umask
非特权用户umask 是002
root的umask是022 设定umask: umask # ,比如 umask 022
umask -S 模式方式显示
umask -p 输出可被调用
全局设置: /etc/bashrc 用户设置 ~/.bashrc

真正作用就是:将umask指定的权限从文件或目录的最大权限中减去。

 假设umask 值为135 

    文件默认最大权限      110 110 110   666
    减去umask 指定权限    001 011 101     135  
    权限对位相减          110 100 010     642  


    文件默认最大权限        666
    减去umask 指定权限    135  
    权限对位相减          642  
    也可以直接使用数字对位相减,得到的奇数+1;

为了便于理解,这里再重复一下,就是说,文件默认最大权限(666) 中,如果存在umask中指定的要删除的权限,就将该权限删掉,如果不存在,那就不用变化就好了。

Linux 系统中的特殊权限 SUID, SGID, Sticky

普通权限在一般情况下应用是没有问题。可是在一些特殊场景下,仅仅设置普通权限,并不能满足实际生产需要。

如果一个文件具有SUID,SGID,Sticky权限,那么相应u,g,o 的x权限位会被替换成s权限。

SUID,SGID,权限是用来提升权限的。权限是累加的。也就是说,用户本身的权限,加上SUID,SGID的权限。

SUID

我们先来看一个实例

 ll /usr/bin/passwd  

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

我们能够看到在,passwd 属主的权限为: rws
这里的s 就是特殊权限SUID。
它表现为,当任何用户在使用passwd命令时,它的身份将临时切换为root用户,并具有root用户的权限,而不用考虑该用户对passwd的权限。也可以理解为,某二进制文件如果具有SUID权限,则任何使用该二进制文件的用户,其权限将临时集成该二进制文件属主的权限。


SUID特殊权限使用前提:进程有属主和属组;文件有属主和属组

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

任何一个可执行程序文件能不能启动为进程:取决发起者对程序文件是否拥有执行权限
启动为进程之后,其进程的属主为原程序文件的属主
SUID只对二进制可执行程序有效
SUID设置在目录上无意义
权限设定:
chmod u+s FILE…
chmod u-s FILE…

 //将 /usr/bin/passwd s权限去掉  

    chmod u-s /usr/bin/passwd   

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

    //此时,如果切换普通用户,将不具备写权限。  也就修改不了自己的密码 

    Changing password for user mage.
    Changing password for mage.
    (current) UNIX password: 
    passwd: Authentication token manipulation error



    //将权限恢复  切换回root用户

    chmod 4755 /usr/bin/passwd   

SUID是一种特殊权限,用s 表示。如果一个二进制文件具有SUID权限的话,其属主x权限将被s替代。而且在使用数字法进行权限修改的时候,其数字位单独用4表示。

SGID

任何一个可执行程序文件能不能启动为进程:取决发起者对程序文件是否拥有执行权限
启动为进程之后,其进程的属主为原程序文件的属组
权限设定:chmod g+s FILE…    chmod g-s FILE…

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

通过以上描述我们可以发现,如果我们给一个目录设置了SGID权限,然后有多个用户在该目录下创建了不同的文件,而这些文件的属组都是该目录的属组。此时问题出现了,在该目录下的不同用户可以相互删除对方的文件。那么此时,我们就需要使用另外一个特殊权限,来解决这个问题。

Sticky

具有写权限的目录通常用户可以删除该目录中的任何文件,无论该文件的权限或拥有权
在目录设置Sticky 位,只有文件的所有者或root可以删除该文件
sticky 设置在文件上无意义
权限设定:chmod o+t DIR…    chmod o-t DIR…

权限位映射

我们首先来看一组实例

 //实验环境中创建两个文件,注意,f1没有x权限,f2有x权限
    -rw-r--r--. 1 root root 0 Jul 25 14:30 f1
    -rwxr--r--. 1 root root 0 Jul 25 14:31 f2  

    //下面分别给两个文件加上SUID权限。
    chmod u+s f1
    chmod u+s f2  

    //执行ll 命令查看两个文件的权限变化  
    -rwSr--r--. 1 root root 0 Jul 25 14:30 f1
    -rwsr--r--. 1 root root 0 Jul 25 14:31 f2

从上面的实例我们可以看出
SUID: user,占据属主的执行权限位
   s: 属主拥有x权限
   S:属主没有x权限


下面我们来看另外一组实例

 //实验环境中创建两个目录文件,注意属组的权限区别  

    drwxr-xr-x. 2 root root 6 Jul 25 14:36 dir1
    drwxr--r-x. 2 root root 6 Jul 25 14:36 dir2  


    //下面分别给两个目录加上SGID权限  
    chmod g+s dir1
    chmod g+s dir2  

    //执行 ll 命令观察两个目录文件的权限变化  

    drwxr-sr-x. 2 root root 6 Jul 25 14:36 dir1
    drwxr-Sr-x. 2 root root 6 Jul 25 14:36 dir2  

从上面的实例中,我们可以看出
SGID: group,占据属组的执行权限位
  s: group拥有x权限
  S:group没有x权限


最后一组实例

 //实验环境中创建两个目录文件,注意 o 的权限区别  
    drwxr-xr-x. 2 root root 6 Jul 25 14:41 dir3
    drwxr-xr--. 2 root root 6 Jul 25 14:41 dir4  

    //下面分别给两个目录加上sticky权限  

    chmod o+t dir3  
    chmod o+t dir4  


    // 执行ll 命令观察两个目录的权限变化  
    drwxr-xr-t. 2 root root 6 Jul 25 14:41 dir3
    drwxr-xr-T. 2 root root 6 Jul 25 14:41 dir4  

通过上面的实例
Sticky: other,占据other的执行权限位
t: other拥有x权限
T:other没有x权限

设定文件的特殊属性

chattr +i 不能删除,改名,修改 chattr -i
chattr +a 只能追加内容
lsattr 显示特定属性

访问控制列表 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生效顺序:所有者,自定义用户,自定义组,其他人

通过实例来了解 为多用户或者组的文件和目录赋予访问权限rwx

 // 查看文件或者目录的ACL权限 使用 getfacl FILE|DIR  
    getfacl f1 

    # file: f1
    # owner: root
    # group: root
    user::rw-
    group::r--
    other::r--  


    //给文件f1加上mage的运行权限  
    setfacl -m u:mage:w f1    

    //可以发现,在权限位的后面加上了一个加号,这就说明该文件被赋予了ACL权限  
    -rw-rwxr--+ 1 root root 0 Jul 25 15:31 f1  
    // 查看f1的ACL权限  
    # file: f1
    # owner: root
    # group: root
    user::rw-
    user:mage:w
    group::r--
    mask::rwx
    other::r--  


    //如果此时mage用户去读f1文件,他是不能读取的。  



    //指定admins组里的成员对f2文件有读写权限  

    setfacl -m g:admins:rw f2 

    # file: f2
    # owner: root
    # group: root
    user::rw-
    group::r--
    group:admins:rw-
    mask::rw-
    other::r--  

    //此时mage用户可以对f2文件机型写入吗   
    //切换到mage用户   
    echo HelloWorld >> f2 

下面这些命令可以自己尝试一下
setfacl -m u:wang:rwx file|directory
setfacl -Rm g:sales:rwX directory //递归
setfacl -M file.acl file|directory //增加权限
setfacl -m g:salesgroup:rw file| directory
setfacl -m d:u:wang:rx directory //设置目录的默认权限
setfacl -x u:wang file |directory
setfacl -X file.acl directory 删除权限

 //增加权限和删除权限的文件格式是不一样的。  

    //定义一个文件用来增加权限  
    nano file.acl

    u:mage:rwx
    g:admins:rw

    //先查看一下f1 的ACL  
    # file: f1
    # owner: root
    # group: root
    user::rw-
    group::r--
    other::r--


    //执行修改权限命令
    setfacl -M file.acl f1 

    //查看一下该文件的ACL
    # file: f1
    # owner: root
    # group: root
    user::rw-
    user:mage:rwx   //新增了权限
    group::r--
    group:admins:rw-  //新增了权限  
    mask::rwx
    other::r--


    //我们修改一下 file.acl 将刚才添加的权限删除掉   注意格式有所不同的

    nano file.acl

    u:mage
    g:admins


    // 执行修改权限命令  
    setfacl -X file.acl f1

    # file: f1
    # owner: root
    # group: root
    user::rw-
    group::r--
    mask::r--
    other::r--

通过上面的实例可以看出,权限的修改是可以批量进行的,但是-X 并不能清除ACL的所有权限。

ACL mask 值

现在我们可以重新来梳理一下,一个文件的权限通常涉及到哪几类用户。 属主,属组,自定义用户,自定义组,Other,一共五类使用者。 而ACL就是对这五类用户的权限进行控制 。
ACL文件上的group权限是mask 值(自定义用户,自定义组,拥有组的最大权限),而非传统的组权限

 //设置文件的mask 值  

    getfacl f1  

    # file: f1
    # owner: root
    # group: root
    user::rw-
    user:mage:rwx
    group::r--
    group:admins:rw-
    mask::rwx  
    other::r--  

    //设置文件的mask值位 r--  

    setfacl -m mask::r-- f1  

    # file: f1
    # owner: root
    # group: root
    user::rw-
    user:mage:rwx           #effective:r--
    group::rw-              #effective:r--
    group:admins:rw-        #effective:r--
    mask::r--
    other::r--  
  • 设置mask值之后我们会发现,自定义用户,自定义组,以及默认的属组,都被mask值限定住了。
    可以将mask值理解为最高权限,除了所有者,Other之外,其他的都在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
 //getfacl 可看到特殊权限:flags
    //如果一个文件或目录设置特殊权限,SGID,SUID,Sticky 

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

博客转载自曲良同学 http://www.pojun.tech

你可能感兴趣的:(曲良同学)