zoukankan      html  css  js  c++  java
  • 🍖权限管理之高级权限 ACL

    引入

    • 前一篇所说的基础权限 u, g, o 以及特殊权限都是针对一类用户设置的

    • 但如果咱们想要自定义用户分配,也就是更精细化的控制权限分配

    • 比如 :让某一个用户对某个文件具有某种权限

    • 这时咱们就可以使用到文件的访问控制列表 ACL(Access Control List)

    ⛅"u g o"只能设置一个用户, 一个组或者other
    ⛅"ACL" 可以对 "r w x" 进行用户设置(允许谁和不允许谁)
    
    ⛅"ACL"只能是 "root" 来设置
    ⛅相关命令: getfacl(查看), setfacl(设置)
    

    一.ACL 的基本使用方式

    • 命令
    getfacl 查看权限
    setfacl 设置权限
    • 选项
    -m 设定ACL的权限
    -x 删除某一用户或组的ACL权限
    -b 删除所有的ACL权限
    -R 递归的设定ACL权限
    d:(default) 继承,设定默认的ACL权限,在父目录下新建的文件都会继承此权限
    mask: 决定用户的最高权限
    • 语法
    修改属主的权限 setfacl -m u: :[权限] [文件]
    修改属组的权限 setfacl -m g: :[权限] [文件]
    修改其他人权限 setfacl -m o: :[权限] [文件]
    修改某一用户的权限 setfacl -m u:[用户名]:[权限] [文件]
    修改具体某一个组的权限 setfacl -m g:[组名]:[权限] [文件]
    继承 setfacl -m d:u:[用户名]:[权限] [父目录]
    修改最大权限mask setfacl -m mask::[权限] [文件]

    1.让咱们先设置好一个实验环境,让使用方式更易懂

    ⛅先创建一个目录和文件作为演示对象
    [root@shawn ~]# mkdir /cccc/
    [root@shawn ~]# touch /cccc/a.txt
    [root@shawn ~]# echo 123 > /cccc/a.txt 
    
    ⛅创建三个用户和一个组
    [root@shawn ~]# useradd song1
    [root@shawn ~]# useradd song2
    [root@shawn ~]# useradd song3
    [root@shawn ~]# groupadd ggg1
    

    1.getfacl : 查看权限

    ⛅使用"getfacl"命令查看ACL权限
    [root@shawn ~]# getfacl /cccc/a.txt
    getfacl /cccc/a.txt
    getfacl: Removing leading '/' from absolute path names
    # file: cccc/a.txt
    # owner: root
    # group: root
    user::rwx
    group::r-x
    other::r-x
    

    2.setfacl : 设置权限

    注意: 当使用 setfacl 设置权限时就不要再使用 chmod设置了,会影响 mask

    • setfacl设置权限置空
    ⛅置空属主的权限
    [root@shawn ~]# setfacl -m u::- !$
    setfacl -m u::- /cccc/a.txt
    
    ⛅置空属组的权限
    [root@shawn ~]# setfacl -m g::- !$
    setfacl -m g::- /cccc/a.txt
    
    ⛅置空其他人的权限
    [root@shawn ~]# setfacl -m o::- !$
    setfacl -m o::- /cccc/a.txt
    
    ⛅再次查看ACL权限,已经全部置空
    [root@shawn ~]# getfacl !$
    getfacl /cccc/a.txt
    getfacl: Removing leading '/' from absolute path names
    # file: cccc/a.txt
    # owner: root
    # group: root
    user::---
    group::---
    other::---
    
    • 需求: 用户 "song1" 只能对 "a.txt" 进行 "r" 操作
    ⛅对"song1"没有设置"ACL"权限时
    [song1@shawn root]$ cat /cccc/a.txt 
    cat: /cccc/a.txt: 权限不够
    [song1@shawn root]$ echo 123 > /cccc/a.txt 
    bash: /cccc/a.txt: 权限不够
    
    ⛅使用"root"进行设置"r"权限
    [root@shawn ~]# setfacl -m u:song1:r /cccc/a.txt 
    [root@shawn ~]# su song1
    
    ⛅切到"song1"可读但不可写
    [song1@shawn root]$ cat /cccc/a.txt 
    123
    [song1@shawn root]$ echo 333 > !$
    echo 333 > /cccc/a.txt
    bash: /cccc/a.txt: 权限不够
    
    • 用户 "song2" 只能对 "a.txt" 可以 "w" 操作
    ⛅对"song2"没有设置"ACL"权限时
    [song2@shawn root]$ cat /cccc/a.txt 
    cat: /cccc/a.txt: 权限不够
    [song2@shawn root]$ echo 123 > /cccc/a.txt 
    bash: /cccc/a.txt: 权限不够
    
    ⛅使用"root"进行设置"w"权限
    [root@shawn ~]# setfacl -m u:song2:w /cccc/a.txt 
    [root@shawn ~]# su song2
    
    ⛅切到"song2"可写但不可读
    [song2@shawn root]$ echo 3333 > /cccc/a.txt
    [song2@shawn root]$ cat /cccc/a.txt 
    cat: /cccc/a.txt: 权限不够
    
    ⛅咱们使用"root"查看是否写进去了
    [root@shawn ~]# cat /cccc/a.txt 
    3333
    
    • "ggg1""a.txt" 具有 "rw" 操作

    • 用户 "song3" 为其他人,当其加入组 "ggg1"

    ⛅"song3"作为其他人时没有任何权限
    [song3@shawn root]$ cat /cccc/a.txt 
    cat: /cccc/a.txt: 权限不够
    [song3@shawn root]$ echo 4444 > !$
    echo 4444 > /cccc/a.txt
    bash: /cccc/a.txt: 权限不够
    
    ⛅使用"root"将组"ggg1"设置"rw"权限
    [root@shawn ~]# setfacl -m g:ggg1:rw /cccc/a.txt 
    
    ⛅将"song3"加入到组"ggg1"中
    [root@shawn ~]# gpasswd -a song3 ggg1
    正在将用户“song3”加入到“ggg1”组中
    [root@shawn ~]# id song3
    uid=1002(song3) gid=1002(song3) 组=1002(song3),1003(ggg1)
    
    ⛅再次使用"song3"对"a.txt"发现可读可写
    [song3@shawn root]$ echo 1234 > /cccc/a.txt 
    [song3@shawn root]$ cat !$
    cat /cccc/a.txt
    1234
    
    • 经过以上步骤"getfacl"看看ACL权限
    ⛅再次查看"ACL"权限咱们可以发现多出了个"mask",??这是什么??
    [root@shawn ~]# getfacl /cccc/a.txt 
    getfacl: Removing leading '/' from absolute path names
    # file: cccc/a.txt
    # owner: root
    # group: root
    user::---
    user:song1:r--
    user:song2:-w-
    group::---
    group:ggg1:rw-
    mask::rw-
    other::---
    

    3.最大有效权限mask

    mask相当于一个权限筛子, 用户和组的权限受它的影响, 不包括文件所有者和 other

    mask最主要的作用就是用来决定用户和组的最高权限

    • mask权限进行按位与运算得到最终权限
    • "r" 为例, 有权限 : 1 无 : 0
    用户/组权限 mask权限 最终权限
    1 1 1
    1 0 0
    0 1 0
    0 0 0
    • 举例
    song1权限 : rwx		r--         rw-		-wx		....
    mask权限 :  rw-		rw-         -w-		rwx		....
    最终权限 :  rw-		r-	    -w-	        -wx	        ....
    
    • 演示 : mask 为空效果
    ⛅设置"mask"权限为空
    [root@shawn ~]# setfacl -m mask::- /cccc/a.txt 
    
    ⛅查看"ACL"权限
    [root@shawn ~]# getfacl !$
    getfacl /cccc/a.txt
    getfacl: Removing leading '/' from absolute path names
    # file: cccc/a.txt
    # owner: root
    # group: root
    user::---
    user:song1:r--			#effective:---
    user:song2:-w-			#effective:---
    group::---
    group:ggg1:rw-			#effective:---
    mask::---
    other::---
    
    • 分别使用三个用户来试试自己的权限
    ⛅"song1"失败
    [root@shawn ~]# su song1
    [song1@shawn root]$ cat /cccc/a.txt 
    cat: /cccc/a.txt: 权限不够
    [song1@shawn root]$ echo 222 >!$
    echo 222 >/cccc/a.txt
    bash: /cccc/a.txt: 权限不够
    
    ⛅"song2"失败
    [root@shawn ~]# su song2
    [song2@shawn root]$ cat /cccc/a.txt 
    cat: /cccc/a.txt: 权限不够
    [song2@shawn root]$ echo 444>/cccc/a.txt 
    bash: /cccc/a.txt: 权限不够
    
    ⛅"song2"失败
    [root@shawn ~]# su song3
    [song3@shawn root]$ cat /cccc/a.txt
    cat: /cccc/a.txt: 权限不够
    [song3@shawn root]$ echo 1234 > /cccc/a.txt 
    bash: /cccc/a.txt: 权限不够
    
    • 小结
    1. mask会影响除了文件所有者和other之外的人
    2. mask权限决定了用户访问文件时的最高权限
    3. mask用于临时降低用户访问文件的权限

    4.继承权限 :default

    • 想要对一个目录以及对这个目录以后创建的文件具有指定的权限, 就需要设置 default

    • 注意 : 对当前目录下已经存在的文件没有相应权限

    • -R是对当前已存在的文件及目录生效, 对后面创建的不生效

    ⛅咱们先创一个"/cccc/bbbb"
    [root@shawn ~]# mkdir /cccc/bbbb/
    
    ⛅分别对"song1"做递归权限,对"song2"做继承权限
    [root@shawn ~]# setfacl -R -m u:song1:rwx /cccc/
    [root@shawn ~]# setfacl -m d:u:song2:- /cccc/
    
    ⛅来看看当前已存在文件和目录的"ACL"权限
    ⛅可以发现这个父目录对"song1"权限生效,也对"song2"设置了继承
    [root@shawn ~]# getfacl /cccc/
    getfacl: Removing leading '/' from absolute path names
    # file: cccc/
    # owner: root
    # group: root
    user::rwx
    user:song1:rwx
    group::r-x
    mask::rwx
    other::r-x
    default:user::rwx
    default:user:song2:---
    default:group::r-x
    default:mask::r-x
    default:other::r-x
    
    ⛅来看"/cccc/bbbb",发现对已存在的文件递归设置生效,继承不生效
    [root@shawn ~]# getfacl /cccc/bbbb/
    getfacl: Removing leading '/' from absolute path names
    # file: cccc/bbbb/
    # owner: root
    # group: root
    user::rwx
    user:song1:rwx
    group::r-x
    mask::rwx
    other::r-x
            
    ⛅我们再来创建新的文件
    [root@shawn ~]# mkdir /cccc/dddd
    
    ⛅发现对后创建的文件递归无效了,继承生效了(继承了"song2"对父目录的权限)
    [root@shawn ~]# getfacl /cccc/dddd
    getfacl: Removing leading '/' from absolute path names
    # file: cccc/dddd
    # owner: root
    # group: root
    user::rwx
    user:song2:---
    group::r-x
    mask::r-x
    other::r-x
    default:user::rwx
    default:user:song2:---
    default:group::r-x
    default:mask::r-x
    default:other::r-x
    

    无了

  • 相关阅读:
    数据库客户端们
    tcl调用tuxedo的一个demo
    tcl实现http请求
    CHAP算法C++实现
    归一化数值
    PPPoE名词解释
    Prism MEF example
    为什么我们要开源
    WPF Issues
    WPF & EF & Prism useful links
  • 原文地址:https://www.cnblogs.com/songhaixing/p/13908235.html
Copyright © 2011-2022 走看看