在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權限了。
ACL是Access 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權限