Linux ACL訪問控制


在Linux一般權限管理中,對文件的訪問可以通過控制該文件的(目錄)屬主、屬組和其他人三個用戶角色進行;每種用戶身份擁有讀(read)、寫(write)和執行(execute)三種權限。但是在實際工作中,這三種身份實在是無法滿足精細的權限控制要求。請看下面的例子。

drwxrwx--- 45 user1 group1 12288 Feb 25 16:48  /project/

以上根目錄下有一個 /project/ 目錄,user1用戶和在group1組中的用戶都有訪問和修改權限,但如果有另外一個用戶user2需要有訪問權限(rx)且不能有修改權限如該何操作呢?給other用戶rx權限和將user2加入到group1組都不是好的選擇。能不能單獨給user2授權/project/目錄的訪問權限呢?是可以的,這時就要用到ACL權限了。

 

ACLAccess Control List(訪問控制列表)的縮寫,在Linux系統中,ACL用於設定用戶針對文件的權限。路由器中也有ACL的概念,但和我們這里講的ACL並不相同。 

開啟ACL權限

ACL需要文件系統支撐,ACL的開啟由掛載參數決定的。在 CentOS 6.x 系統中 ACL 權限默認是開啟的,不需要手工開啟。那該如何查看 ACL 權限是否開啟了呢?可以這樣查看:

 1 [root@CentOS release 6.5 ~]# dumpe2fs -h /dev/mapper/vg_root-lv_root
 2 dumpe2fs 1.41.12 (17-May-2010)
 3 Filesystem volume name:   <none>
 4 Last mounted on:          /
 5 Filesystem UUID:          391a5a62-13d3-4f4f-a312-d46490508500
 6 Filesystem magic number:  0xEF53
 7 Filesystem revision #:    1 (dynamic)
 8 Filesystem features:      has_journal ext_attr resize_inode dir_index filetype needs_recovery extent flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize
 9 Filesystem flags:         signed_directory_hash 
10 Default mount options:    user_xattr acl 11 Filesystem state:         clean
12 Errors behavior:          Continue
13 Filesystem OS type:       Linux
略……

#dumpe2fs是查詢指定分區文件系統詳細信息的命令,只支撐ext*類的文件系統。

其中,dumpe2fs 命令可選的選項及其含義如下:

  • -h:僅顯示超級塊中的信息,而不顯示磁盤塊組的詳細信息;

使用 dumpe2fs 命令可以査看到這個分區文件系統的詳細信息。dmpe2fs命令輸出結果中 Default mount options: user_xattr acl 顯示分區/dev/mapper/vg_root-lv_root的默認掛載選項包括acl,所以不需要額外操作。

 

如果我們的Linux文件系統不支持ACL權限可以加用如下命令添加:

[root@localhost ~]# mount -o remount,acl /
#重新掛載對應分區,並加入ACL權限參數

使用 mount 命令重新掛載加入 的ACL 權限,臨時有效,系統重啟后掛載參數還是原來的。要想永久生效,需要修改 /etc/fstab 文件,命令如下:

[root@localhost ~]#vi /etc/fstab
UUID=56e5d02a-2fa6-40a8-b4ac-374407905c59 /ext4 defaults,acl 1 1
#defaults后加入ACL權限,用逗號分隔
[root@localhost ~]# mount -o remount /
#重新掛載文件系統或重啟系統,使修改生效

建議采用修改/etc/fstab再remount的方式,可以驗證fstab配置對不對,有問題可及時修改,避免fstab配置有錯誤導致重啟無法開機或分區無法掛載等意外情況。

 

ACL權限設置

1、ACL權限管理命令

現在分區已經支持ACL了,管理ACL權限主要涉及兩個命令查看ACL(getfacl)和設置ACL(setfacl),下面我們先了解下這兩個命令的語法:

[root@localhost ~]# getfacl 文件名    #查看ACL權限
[root@localhost ~]# setfacl 選項 文件名    #設定ACL權限
setfacl 選項
  • -m:設定 ACL 權限。如果是給予用戶 ACL 權限,則使用"u:用戶名:權限"格式賦予;如果是給予組 ACL 權限,則使用"g:組名:權限" 格式賦予;
  • -x:刪除指定的 ACL 權限;
  • -b:刪除所有的 ACL 權限;
  • -d:設定默認 ACL 權限。只對目錄生效,指目錄中新建立的文件擁有此默認權限;
  • -k:刪除默認 ACL 權限;
  • -R:遞歸設定 ACL 權限。指設定的 ACL 權限會對目錄下的所有子文件生效;
# setfacl -h
setfacl 2.2.51 -- set file access control lists
Usage: setfacl [-bkndRLP] { -m|-M|-x|-X ... } file ...
  -m, --modify=acl        modify the current ACL(s) of file(s)
  -M, --modify-file=file  read ACL entries to modify from file
  -x, --remove=acl        remove entries from the ACL(s) of file(s)
  -X, --remove-file=file  read ACL entries to remove from file
  -b, --remove-all        remove all extended ACL entries
  -k, --remove-default    remove the default ACL
      --set=acl           set the ACL of file(s), replacing the current ACL
      --set-file=file     read ACL entries to set from file
      --mask              do recalculate the effective rights mask
  -n, --no-mask           don't recalculate the effective rights mask
  -d, --default           operations apply to the default ACL
  -R, --recursive         recurse into subdirectories
  -L, --logical           logical walk, follow symbolic links
  -P, --physical          physical walk, do not follow symbolic links
      --restore=file      restore ACLs (inverse of `getfacl -R')
      --test              test mode (ACLs are not modified)
  -v, --version           print version and exit
  -h, --help              this help text

 

2、給用戶添加ACL權限

 針對某個文件或目錄設置特定用戶對其的特定訪問權限。

[root@localhost ~]# ll -d /project/    #查看 /project/ 當前的權限狀態
 drwxrwx--- 2 root sys 4096 1月19 05:21 /project/ 
#給user2分配rx權限
[root@localhost ~]# setfacl -m u:user2:rx /project/     #給用戶user2賦予r-x權限,使用"u:用戶名:權限" 格式

[root@localhost ~
]# ll -d /project/ drwxrwx---+ 3 root sys 4096 1月19 05:22 project/   #使用ls-l査詢時會發現,在權限位后面多了一個"+",表示此目錄擁有ACL權限 [root@localhost ~]# getfacl /project  #查看/prpject目錄的ACL權限 #file: /project <-文件名 #owner: root   <-文件的屬主 #group: sys  <-文件的屬組 user::rwx   <-用戶名欄是空的,說明是屬主的權限 user:user2:r-x   <-用戶user2的權限 group::rwx   <-組名欄是空的,說明是屬組的權限 mask::rwx   <-mask權限 other::---   <-其他人的權限

可以看到雖然user2不是/project目錄的屬主、屬組和other用戶,作為一個特殊的用戶對該目錄擁有了訪問權限。

3、給用戶組添加ACL權限

 除了可以給用戶添加ACL權限,也可以給用戶組添加ACL權限,用於控制這個組中的用戶對某個文件或目錄的權限。

[root@localhost /]# setfacl -m g:group2:rwx project/    #為組group2紛配ACL權限,使用"g:組名:權限"格式
[root@localhost /]# ll -d project/
drwxrwx---+ 2 root sys 4096 1月19 06:21 project/
#屬組並沒有更改
[root@localhost /]# getfacl project/
#file: project/
#owner: root
#group: sys
user::rwx
user:user2:r-x
group::rwx
group:group2:rwx   <-用戶組group2擁有了rwx權限
mask::rwx
other::--

 

4、最大有效權限mask

 mask 是用來指定最大有效權限的。mask 的默認權限是 rwx。其他用戶或組的有效權限都是和mask權限相與得到的。如果mask權限是r--,則不管user2的權限是多少那么他的最大權限也不會超過r--。例:user2的權限是r-x,其有效權限是r-- 與 r-x結果是r--,這個比較容易理解。

修改mask權限的命令:

[root@localhost /]# setfacl -m m:rx /project    #設定mask權限為r-x,使用"m:權限"格式
[root@localhost /]# getfacl /project
#file:project/
#owner:root
#group:sys
user::rwx
group::rwx      #effective:r-x
mask::r-x      #mask權限變為r-x
other::--

 

5、默認ACL權限

給 /project 目錄設定了 ACL 權限,在這個目錄中新建一些子文件和子目錄,是不會繼承父目錄的 ACL 權限的。如果我們希望在這個目錄下新創建文件也有對應的ACL權限,除了手動授權以外,還有更好的方法。

默認 ACL 權限的作用是:如果給父目錄設定了默認 ACL 權限,那么父目錄中所有新建的子文件都會繼承父目錄的 ACL 權限。默認 ACL 權限只對目錄生效。命令如下:

[root@localhost /]# setfacl -m d:u:user2:rx /project/    #使用"d:u:用戶名:權限"格式設定默認ACL權限
[root@localhost project]# getfacl project/
# file: project/
# owner: root
# group: sys
user:: rwx
user:user2:r-x
group::rwx
group:group2:rwx
mask::rwx
other::-- default:user::rwx   <-多出了default字段
default:user:st:r-x
default:group::rwx
default:mask::rwx
default:other::--
[root@localhost /]# cd project/
[root@localhost project]# touch testfile
[root@localhost project]# mkdir testdir 
[root@localhost project]# ll 總用量8-rw-rw----+ 1 root root 02月19 06:33 testfile
drwxrwx---+ 2 root root 4096 1月19 06:34 testdir

 可以看到在/project/下新創建的文件和目錄testfile、testdir 繼承了父目錄用戶user2的ACL權限。

6、遞歸ACL權限

 遞歸是指父目錄在設定 ACL 權限時,所有的子文件和子目錄也會擁有相同的 ACL 權限

[root@localhost project]# setfacl -m u:user2:rx -R /project/    #-R遞歸

 

7、刪除ACL權限

刪除指定的ACL權限:

[root@localhost /]# setfacl -x u:user2 /project/    #刪除指定用戶和用戶組的ACL權限
[root@localhost /]# getfacl project/
# file:project/
# owner: root
# group: sys
user::rwx
group::rwx
group:group2:rwx
mask::rwx
other::--
user2用戶的權限已被刪除

刪除所有ACL權限:

[root@localhost /]# setfacl -b /project    #刪除文件的所有ACL權限
[root@localhost /]# getfacl /project
#file: project/
#owner: root
# group: sys
user::rwx
group::rwx
other::--

可以看到所有ACL權限已被刪除

 

 

總結:1、當要給某個用戶或用戶組分配特殊權限時可用ACL

   2、ACL權限需要分區支持

   3、除了給用戶和組設置ACL權限外還可以設置默認ACL權限和mask權限


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM