1. 程式人生 > 實用技巧 >ACL控制

ACL控制

目錄

ACL訪問控制概述

對檔案進行自定義許可權控制

UGO設定基本許可權: 只能一個使用者,一個組和其他人
ACL設定基本許可權: r、w、x
設定acl只能是root管理員使用者. 相關命令: getfacl , setfacl

acl基本使用

//環境準備
[root@lqz ~]# cp /etc/passwd /root/passwd
//檔案在沒有設定acl, 看到的和傳統許可權是一樣
[root@lqz ~]# ll passwd
-rw-r--r-- 1 root root 0 10-26 13:59 /home/test.txt

//使用getacl檢視許可權
[root@lqz ~]# getfacl passwd 
# file: passwd
# owner: root
# group: root
user::rw-   //檔案owner許可權
group::r--  //檔案擁有組許可權
other::r--  //其他人許可權

設定acl許可權

-rw-r--r-- 1 root root 1380 Feb 27 11:25 passwd

alice 擁有讀寫許可權    rw
bgx  沒有任何許可權     -
jack 組擁有讀許可權     r
匿名使用者擁有讀寫許可權  rw


//建立相關使用者
[root@lqz ~]# useradd alice
[root@lqz ~]# useradd bgx
[root@lqz ~]# useradd jack

//增加使用者 alice 許可權
[root@lqz ~]# setfacl -m u:alice:rw passwd

//增加使用者 bgx 許可權
[root@lqz ~]# setfacl -m u:bgx:- passwd

//增加匿名使用者許可權
[root@lqz ~]# setfacl -m o::rw passwd

//增加組許可權
[root@lqz ~]# setfacl -m g:jack:r passwd


注意: 如果使用者同時屬於不同的兩個組,並且兩個組設定了acl訪問控制
    1.根據acl訪問控制優先順序進行匹配規則
    2.如有使用者擁有多個組的許可權不同的許可權,優先使用最高許可權(模糊匹配)

檢視acl許可權

root@lqz ~]# ll passwd
-rw-rw-rw-+ 1 root root 1531 Jan 26 07:52 passwd

[root@lqz ~]# getfacl passwd
# file: passwd
# owner: root
# group: root
user::rw-
user:bgx:---
user:alice:rw-
group::r--
group:jack:r--
mask::rw-
other::rw-

移除acl許可權

//移除jack組的acl許可權
[root@lqz ~]# setfacl -x g:jack passwd

//移除bgx使用者的acl許可權
[root@lqz ~]# setfacl -x u:bgx passwd

//移除檔案和目錄所有acl許可權
[root@lqz ~]# setfacl -b passwd

//移除預設的acl
[root@lqz ~]# setfacl -k dir

檢視acl幫助

//EXAMPLES 示例文件
[root@lqz ~]# man setfacl

//複製 file1 的 ACL 許可權給 file2
[root@lqz ~]# setfacl -m u:alice:rw,u:bgx:r,g:jack:rw file1
[root@lqz ~]# getfacl file1 |setfacl --set-file=- file2

ACL高階特性MASK

mask用於臨時降低使用者或組的許可權,但不包括檔案的所有者和其他人。
mask最主要的作用是用來決定使用者的最高許可權。

**mask預設不會對匿名使用者降低許可權,所以為了便於管理檔案的訪問控制,建議匿名使用者的許可權置為空
**

//臨時降低使用者或組許可權
[root@lqz ~]# setfacl -m mask::rw filename

ACL高階特性Default

default: 繼承(預設)

alice能夠對/opt目錄以及以後在/opt目錄下新建的檔案有讀、寫、執行許可權

//賦予 alice 對/home 讀寫執行許可權 
[root@lqz ~]## setfacl -R -m u:alice:rwX /opt
//賦予 alice 對以後在/home 下新建的檔案有讀寫執行許可權(使 alice 的許可權繼承) 
[root@lqz ~]## setfacl -m d:u:alice:rwX /opt

//檢查對應的許可權
[root@linux-node1 ~]# getfacl /opt/
getfacl: Removing leading '/' from absolute path names
# file: opt/
# owner: root
# group: bgx
user::rwx
user:alice:rwx
group::rwx
mask::rwx
other::rwx
default:user::rwx
default:user:alice:rwx
default:group::rwx
default:mask::rwx
default:other::rwx

ACL訪問控制實踐案例

案例1: 將新建檔案的屬性修改tom:admin, 許可權預設為644
要求: tom對該檔案有所有的許可權, mary可以讀寫該檔案, admin組可以讀寫執行該檔案, jack只讀該檔案, 其他人一律不能訪問該檔案

//實驗前, 建立幾個普通使用者
[root@lqz ~]# useradd tom
[root@lqz ~]# useradd bean
[root@lqz ~]# useradd mary
[root@lqz ~]# useradd jack
[root@lqz ~]# useradd sutdent
[root@lqz ~]# groupadd admin
[root@lqz ~]# gpasswd -a mary admin
[root@lqz ~]# gpasswd -a bean admin

//檢查使用者屬性
[root@linux-node1 ~]# id tom
uid=1004(tom) gid=1004(tom) groups=1004(tom)
[root@linux-node1 ~]# id mary
uid=1006(mary) gid=1006(mary) groups=1006(mary),1007(admin)
[root@linux-node1 ~]# id bean
uid=1005(bean) gid=1005(bean) groups=1005(bean),1007(admin)
[root@linux-node1 ~]# id jack
uid=1002(jack) gid=1002(jack) groups=1002(jack)
[root@linux-node1 ~]# id sutdent
uid=1007(sutdent) gid=1008(sutdent) groups=1008(sutdent)

//準備相關檔案
[root@linux-node1 ~]# cp /etc/passwd /root/
[root@linux-node1 ~]# chown tom:admin passwd
[root@linux-node1 ~]# chmod 644 passwd

//檢查設定前的acl列表
[root@linux-node1 ~]# getfacl passwd
# file: passwd
# owner: tom
# group: admin
user::rw-
group::r--
other::r--

//設定acl許可權
[root@linux-node1 ~]# setfacl -m u::rwx,u:mary:rw,u:jack:r,g:admin:rwx,o::- passwd

//檢查acl許可權
[root@linux-node1 ~]# getfacl passwd
# file: passwd
# owner: tom
# group: admin
user::rwx
user:jack:r--
user:mary:rw-
group::r--
group:admin:rwx
mask::rwx
other::---


acl的控制規則是從上往下匹配
1.tom由於是檔案的擁有者,所以直接按照user::rwx指定的許可權去操作
2.mary使用者從上往下尋找匹配規則,發現user:mary:rw-能夠精確匹配mary使用者,儘管mary屬於admin組,同時admin組有rwx的許可權,但是由於mary使用者的規則在前面,所有優先生效。
3.bean由於找不到精確匹配的規則,而bean是屬於admin組,根據檔案的定義,該檔案是屬於admin組,所以bean的許可權是按照group:admin:rwx的許可權去操作。
4.jack使用者從上往下尋找匹配規則,發現user:jack:r--能夠精確匹配jack使用者。
5.student使用者找不到精確匹配的user定義規則, 也找不到相關組的定義規則,最後屬於other。
""
案例2:
controller組成員有:student
sodor組成員有:thomas,james

目錄: /shares/steamies
檔案: /shares/steamies/file
指令碼: /shares/steamies/test.sh

controller屬於該目錄的所屬組, 新建檔案必須屬於controller組
sodor組的成員對該目錄擁有rwx許可權
sodor組成員james對該目錄及子目錄(包括以後新建立的檔案)沒有任何許可權
""


/準備使用者
[root@linux-node1 ~]# groupadd controller
[root@linux-node1 ~]# groupadd sodor
[root@linux-node1 ~]# useradd student -G controller
[root@linux-node1 ~]# useradd thomas -G sodor
[root@linux-node1 ~]# useradd james -G sodor

//準備目錄
[root@linux-node1 ~]# mkdir /shares/steamies -p
[root@linux-node1 ~]# echo "file" >> /shares/steamies/file
[root@linux-node1 ~]# echo "echo 123" >> /shares/steamies/test.sh
[root@linux-node1 ~]# chmod 755 /shares/steamies/test.sh
[root@linux-node1 ~]# chown -R  :controller /shares/steamies/
[root@linux-node1 ~]# chmod g+s /shares/steamies/


//設定許可權(X表示,如果原本有執行許可權就保留,如果沒有則不新增)
[root@linux-node1 ~]# setfacl -R -m g:sodor:rwX,u:james:- /shares/steamies/

//設定繼承規則
[root@linux-node1 ~]# setfacl -R -m d:g:sodor:rwX,d:u:james:- /shares/steamies/


[root@linux-node1 steamies]# getfacl /shares/steamies/
getfacl: Removing leading '/' from absolute path names
# file: shares/steamies/
# owner: root
# group: controller
# flags: -s-
user::rwx
user:james:---
group::r-x
group:sodor:rwx
mask::rwx
other::r-x
default:user::rwx
default:group::r-x
default:group:sodor:rwx
default:mask::rwx
default:other::r-x