zoukankan      html  css  js  c++  java
  • (转)CentOS7使用ACL精确控制文件和目录的访问权限

    原文:https://www.linuxidc.com/Linux/2018-01/150111.htm

    https://blog.csdn.net/maxiaoqiang1/article/details/6258390-----Linux系统中文件权限ACL功能(上)

    https://blog.csdn.net/xiangliangyu/article/details/22288531---linux下通过acl配置灵活目录文件权限(详细)

    Linux基本的权限控制仅可以对所属用户、所属组、其他用户进行的权限控制,而不能精确地控制每个用户的权限。ACL规则就是用来解决这个问题的。使用ACL规则,我们可以针对单一账户设置文件及目录的访问权限。


    实验用户和组环境

    组root:包含用户root
    组zenandidi:包含用户zenandidi
    组nannan:包含用户nannan、zenandidi


    实验文件内容

    [root: ~]# cat acl_test/test.sh 
    
    #/bin/bash
    echo "Success!"
    

    检查文件系统的ACL功能是否已经开启

    CentOS7默认已经开启ACL功能

    [root: ~]# tune2fs -l /dev/sda2 | grep acl
    
    Default mount options:    user_xattr acl
    

    如果有看到acl,说明已经开启。


    查看是否设定了ACL规则

    直接用ls -l查看,如果权限一栏后面有个加号,说明文件被设定了ACL规则。

    [root: acl_test]# ll 
    
    总用量 12K
    -rw-rwxr--+  1 root root   27 5月   7 08:03 test.sh
    

    使用getfacl查询ACL规则

    命令基本用法

    getfacl <文件>

    举例说明

    列出test.sh的ACL规则(下面分段说明)

    [root: acl_test]# getfacl test.sh 
    

    以下为文件的基本信息

    # file: test.sh     #文件名
    # owner: root       #所有者
    # group: root       #所属组
    

    以下为文件的用户权限设置

    user::rw-                   #Linux默认的所属用户权限
    user:zenandidi:rwx          #附加ACL用户权限,这里表示用户zenandidi有读、写、执行的权限
    

    以下为文件的组权限设置

    group::r--                  #Linux默认的所属组权限
    

    其他信息

    mask::r-x                   #权限掩码(最后详细说明)
    other::r--                  #Linux默认的其他用户权限
    
    

    使用setfacl设置ACL规则

    命令基本用法

    setfacl <选项> [规则] <文件>

    选项:

    -m 新增一条ACL规则
    -x 删除一条ACL规则
    -b 清空所有ACL规则

    举例说明


    例1 清空test.sh中所有ACL规则

    [root: acl_test]# setfacl -b test.sh 
    

    检查设置

    [root: acl_test]# getfacl test.sh 
    
    # file: test.sh
    # owner: root
    # group: root
    user::rw-
    group::r--
    other::r--
    
    
    [root: acl_test]# ll
    
    总用量 12K
    -rw-r--r--   1 root root   27 5月   7 08:03 test.sh
    #权限栏的加号已经消失,说明没有设定ACL规则
    

    例2 为test.sh添加一条ACL规则,使得用户zenandidi具有读、执行权限

    设置之前先看看能不能用用户zenandidi的身份执行

    [root: acl_test]# sudo -u zenandidi ./test.sh 
    
    sudo:./test.sh:找不到命令
    

    由于没有赋予用户zenandidi执行权限,默认使用其他用户的权限,所以不能执行。

    设置权限

    [root: acl_test]# setfacl -m u:zenandidi:rx test.sh 
    

    检查设置

    [root: acl_test]# getfacl test.sh 
    
    # file: test.sh
    # owner: root
    # group: root
    user::rw-
    user:zenandidi:r-x
    group::r--
    mask::r-x
    other::r--
    
    
    [root: acl_test]# ll
    
    总用量 12K
    -rw-r-xr--+  1 root root   27 5月   7 08:03 test.sh
    

    再看看能不能用zenandidi的身份执行

    [root: acl_test]# sudo -u zenandidi ./test.sh 
    
    Success!
    

    执行成功。

    好奇地看了下root的

    [root: acl_test]# ./test.sh 
    
    Success!
    

    咦?我好像没设置root可以执行,为什么也执行成功了捏?其实这是mask在作怪,最后再看吧。


    例3 为test.sh添加一条ACL规则,使得组nannan具有读、写权限

    设置之前先看看能不能用用户zenandidi、nannan的身份改文件名

    [root: acl_test]# sudo -u zenandidi mv test.sh test1.sh 
    
    mv: 无法将"test.sh" 移动至"test1.sh": 权限不够
    
    [root: acl_test]# sudo -u nannan mv test.sh test1.sh 
    
    mv: 无法将"test.sh" 移动至"test1.sh": 权限不够
    

    无法改文件名,因为没有赋予写权限。

    设置权限

    [root: acl_test]# setfacl -m g:nannan:rw test.sh 
    

    检查设置

    [root: acl_test]# getfacl test.sh 
    
    # file: test.sh
    # owner: root
    # group: root
    user::rw-
    user:zenandidi:r-x
    group::r--
    group:nannan:rw-        #effective:r--
    mask::r-x
    other::r--
    
    

    再看看能不能改文件名

    [root: acl_test]# sudo -u zenandidi mv test.sh test1.sh 
    
    mv: 无法将"test.sh" 移动至"test1.sh": 权限不够
    
    [root: acl_test]# sudo -u nannan mv test.sh test1.sh 
    
    mv: 无法将"test.sh" 移动至"test1.sh": 权限不够
    

    还是不行啊,怎么回事?还是那个mask的事。下面详细说明。


    关于mask的那点事

    1. mask值规定了允许的最大权限

    例如:
    mask为rwx,说明ACL规则可以设置全部权限。
    mask为rw-,说明ACL规则仅可设置读、写权限,无论是否设置执行权限,文件都不能被执行。

    如果getfacl输出中有#effective:xxx这个注释,说明ACL规则受mask限制,仅有xxx权限。应特别注意!

    例3的问题可以通过设置mask来解决。

    [root: acl_test]# setfacl -m mask:rwx test.sh 
    

    2. mask值会直接作为Linux基本权限中的组权限

    例1的问题就出在这里。

    设置ACL之前

    [root: acl_test]# ll
    
    总用量 12K
    -rw-r--r--  1 root root   27 5月   7 08:03
    
    

    设置ACL之后,组权限变成了mask值

    [root: acl_test]# ll
    
    总用量 12K
    -rw-r-xr--+  1 root root   27 5月   7 08:03 test.sh
    
    

    因为root处在root组之中,所以自然就有了执行的权限。

  • 相关阅读:
    Working with macro signatures
    Reset and Clear Recent Items and Frequent Places in Windows 10
    git分支演示
    The current .NET SDK does not support targeting .NET Core 2.1. Either target .NET Core 2.0 or lower, or use a version of the .NET SDK that supports .NET Core 2.1.
    Build website project by roslyn through devenv.com
    Configure environment variables for different tools in jenkins
    NUnit Console Command Line
    Code Coverage and Unit Test in SonarQube
    头脑王者 物理化学生物
    头脑王者 常识,饮食
  • 原文地址:https://www.cnblogs.com/liujiacai/p/9508655.html
Copyright © 2011-2022 走看看