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组之中,所以自然就有了执行的权限。

  • 相关阅读:
    javascript函数的定义和调用(包括方法)
    iterable(遍历)
    循环
    C#基础知识 简单说明泛型的优点
    C#基础知识 yield与foreach
    C#基础知识 结构与类的区别
    Asp.net MVC 生成zip并下载
    Asp.net MVC 填充word并下载
    Asp.net MVC 简单实现生成Excel并下载
    CTF中怎么看phpinfo
  • 原文地址:https://www.cnblogs.com/liujiacai/p/9508655.html
Copyright © 2011-2022 走看看