zoukankan      html  css  js  c++  java
  • linux学习-主机的细部权限规划:ACL 的使用

    传统的权限仅有三种身份 (owner, group, others) 搭配三种权限 (r,w,x) 而已,并没有办法单纯的针对某一个使用者或某一个群 组来设定特定的权限需求,此时就得要使用 ACL 这个机制啦!

    什么是 ACL 与如何支持启动 ACL

    ACL 是 Access Control List 的缩写,主要的目的是在提供传统的 owner,group,others 的 read,write,execute 权限之外的细部权限设定。ACL 可以针对单一使用者,单一文件或目录来进行 r,w,x 的权限规范,对于需要特殊权限的使用状况非常有帮助。

    主要可以针对几个项目:

    • 使用者 (user):可以针对使用者来设定权限;

    • 群组 (group):针对群组为对象来设定其权限;

    • 默认属性 (mask):还可以针对在该目录下在建立新文件/目录时,规范新数据的默认权限;

    传统的 Linux 权限只能针 对一个用户、一个群组及非此群组的其他人设定权限而已,无法针对单一用户或个人来设计权限。 而 ACL 就是为了要改变这个问题啊!好了,稍微了解之后,再来看看如何让你的文件系统可以支持 ACL 吧!

    • 如何启动 ACL

    原本 ACL 是 unix-like 操作系统的额外支持项目,但因为近年以来 Linux 系统对权限细部 设定的热切需求, 因此目前 ACL 几乎已经预设加入在所有常见的 Linux 文件系统的挂载参数中 (ext2/ext3/ext4/xfs 等等)!

    ACL 的设定技巧: getfacl, setfacl

    如何设定与观察 ACL 呢? 很简单, 利用这两个指令就可以了:

    • getfacl:取得某个文件/目录的 ACL 设定项目;

    • setfacl:设定某个目录/文件的 ACL 规范。


    • setfacl 指令用法介绍及最简单的『 u:账号:权限 』设定
    
    [root@study ~]# setfacl [-bkRd] [{-m|-x} acl 参数] 目标文件名
    选项与参数:
    -m :设定后续的 acl 参数给文件使用,不可与 -x 合用;
    -x :删除后续的 acl 参数,不可与 -m 合用;
    -b :移除『所有的』 ACL 设定参数;
    -k :移除『预设的』 ACL 参数,关于所谓的『预设』参数于后续范例中介绍;
    -R :递归设定 acl ,亦即包括次目录都会被设定起来;
    -d :设定『预设 acl 参数』的意思!只对目录有效,在该目录新建的数据会引用此默认值
    

    如何设定 ACL 的特殊权限呢?特殊权限的设定方法有很多, 我们先来谈谈最常见的,就是针对单一使用者的设定方式:

    # 1. 针对特定使用者的方式:
    # 设定规范:『 u:[使用者账号列表]:[rwx] 』,例如针对 vbird1 的权限规范 rx :
    [root@study ~]# touch acl_test1
    [root@study ~]# ll acl_test1
    rw-r--r--. 1 root root 0 Jul 21 17:33 acl_test1
    [root@study ~]# setfacl -m u:vbird1:rx acl_test1
    [root@study ~]# ll acl_test1
    -rw-r-xr--+ 1 root root 0 Jul 21 17:33 acl_test1
    # 权限部分多了个 + ,且与原本的权限 (644) 看起来差异很大!但要如何查阅呢?
    
    [root@study ~]# setfacl -m u::rwx acl_test1
    [root@study ~]# ll acl_test1
    -rwxr-xr--+ 1 root root 0 Jul 21 17:33 acl_test1
    # 设定值中的 u 后面无使用者列表,代表设定该文件拥有者,所以上面显示 root 的权限成为 rwx 了!
    

    • getfacl 指令用法
    [root@study ~]# getfacl filename
    选项与参数:
    getfacl 的选项几乎与 setfacl 相同!
    
    # 请列出刚刚我们设定的 acl_test1 的权限内容:
    [root@study ~]# getfacl acl_test1
    # file: acl_test1 <==说明档名而已!
    # owner: root <==说明此文件的拥有者,亦即 ls -l 看到的第三使用者字段
    # group: root <==此文件的所属群组,亦即 ls -l 看到的第四群组字段
    user::rwx <==使用者列表栏是空的,代表文件拥有者的权限
    user:vbird1:r-x <==针对 vbird1 的权限设定为 rx ,与拥有者并不同!
    group::r-- <==针对文件群组的权限设定仅有 r
    mask::r-x <==此文件预设的有效权限 (mask)
    other::r-- <==其他人拥有的权限啰!
    

    • 特定的单一群组的权限设定:『 g:群组名:权限 』
    # 2. 针对特定群组的方式:
    # 设定规范:『 g:[群组列表]:[rwx] 』,例如针对 mygroup1 的权限规范 rx :
    [root@study ~]# setfacl -m g:mygroup1:rx acl_test1
    [root@study ~]# getfacl acl_test1
    # file: acl_test1
    # owner: root
    # group: root
    user::rwx
    user:vbird1:r-x
    group::r--
    group:mygroup1:r-x <==这里就是新增的部分!多了这个群组的权限设定!
    mask::r-x
    other::r--
    

    • 针对有效权限设定:『 m:权限 』

    你应该会觉得奇怪的是, 那个 mask 是什么东西啊?其实他有点像是『有效权限』的意思!他的意义 是: 使用者或群组所设定的权限必须要存在于 mask 的权限设定范围内才会生效,此即『有效权限 (effective permission)』我们举个例子来看,如下所示:

    # 3. 针对有效权限 mask 的设定方式
    # 设定规范:『 m:[rwx] 』,例如针对刚刚的文件规范为仅有 r :
    [root@study ~]# setfacl -m m:r acl_test1
    [root@study ~]# getfacl acl_test1
    # file: acl_test1
    # owner: root
    # group: root
    user::rwx
    user:vbird1:r-x #effective:r-- <==vbird1+mask 均存在者,仅有 r 而已,x 不会生效
    group::r--
    group:mygroup1:r-x #effective:r--
    mask::r--
    other::r--
    

    vbird1 与 mask 的集合发现仅有 r 存在,因此 vbird1 仅具有 r 的权限而已,并不存在 x 权 限!这就是 mask 的功能了!我们可以透过使用 mask 来规范最大允许的权限,就能够避免不小心 开放某些权限给其他使用者或群组了。

    接下来让我们来测试一下,如果我 用 root 或者是 pro1 的身份去 /srv/projecta 增加文件或目录时,该文件或目录是否能够具有 ACL 的设定? 意思就是说,ACL 的权限设定是否能够被次目录所『继承?』先试看看:

    [root@study ~]# cd /srv/projecta
    [root@study ~]# touch abc1
    [root@study ~]# mkdir abc2
    [root@study ~]# ll -d abc*
    -rw-r--r--. 1 root projecta 0 Jul 21 17:49 abc1
    drwxr-sr-x. 2 root projecta 6 Jul 21 17:49 abc2
    

    你可以明显的发现,权限后面都没有 + ,代表这个 acl 属性并没有继承喔!如果你想要让 acl 在目录底下的数据都有继承的功能,那就得如下这样做了!


    • 使用默认权限设定目录未来文件的 ACL 权限继承『 d:[u|g]:[user|group]:权限 』
    # 4. 针对预设权限的设定方式:
    # 设定规范:『 d:[ug]:使用者列表:[rwx] 』
     
    # 让 myuser1 在 /srv/projecta 底下一直具有 rx 的预设权限!
    [root@study ~]# setfacl -m d:u:myuser1:rx /srv/projecta
    [root@study ~]# getfacl /srv/projecta
    # file: srv/projecta
    # owner: root
    # group: projecta
    # flags: -s-
    user::rwx
    user:myuser1:r-x
    group::rwx
    mask::rwx
    other::---
    default:user::rwx
    default:user:myuser1:r-x
    default:group::rwx
    default:mask::rwx
    default:other::---
    

    如果想要让 ACL 的属性全部消失又要如何处理?透过『 setfacl -b 檔名 』 即可!但是不能取消已存在的文件等acl权限

  • 相关阅读:
    java.lang.NoSuchMethodError
    asm相关内容想下载(包括 jar 包)
    Initialization of bean failed; nested exception is java.lang.NoClassDefFoundError: org/objectweb/asm/Type
    用Navicat连接mysql报错:2003-Can't connect to MySql server on '10.100.0.109'(10039)
    The type java.lang.reflect.AnnotatedElement cannot be resolved. It is indirectly referenced from required .class files
    The type java.lang.CharSequence cannot be resolved. It is indirectly referenced from required .class files
    交通测速方式
    卡口和电子警察的区别
    Myeclipse连接Mysql数据库时报错:Error while performing database login with the pro driver:unable
    在window上安装mysql
  • 原文地址:https://www.cnblogs.com/uetucci/p/7657244.html
Copyright © 2011-2022 走看看