咱們知道,在Linux操做系統中,傳統的權限管理分是以三種身份(屬主、屬組以及其它人)搭配三種權限(可讀、可寫以及可執行),而且搭配三種特殊權限(SUID,SGID,SBIT),來實現對系統的安全保護。可是,隨着業務和需求的發展和擴大,僅有的這種模式已經不能知足當前複雜環境下的權限控制需求。windows
好比,當前有一個/data目錄,如今須要A組成員可以可寫,B組成員僅讀,C組成員可讀可寫可執行,此時怎麼辦呢?安全
對於以上的需求,僅僅依託現有的傳統權限管理模式,是沒法實現的。爲了解決該類型的問題,Linux 開發出了一套新的文件系統權限管理方法,叫作 文件訪問控制列表 ACL(Access Control Lists)。經過使用 ACL,能夠完美解決如上類型的需求問題。bash
那麼下來來看,什麼是訪問控制列表?
ide
ACL 是 Access Control List 的縮寫,主要目的是針對在傳統的三種身份和三種權限以外,提供更加細化的局部權限設定。官方手冊來說,它主要針對用戶、用戶組、以及掩碼方面控制權限。
簡單去理解就是,ACL 能夠針對單個用戶、單個用戶組來進行權限細化的控制。
而在windows系統上,沒有這個ACL,ACL是類Unix(Unix-like)操做系統權限的額外支持項目,所以要使用ACL必需要有文件系統的支持才行。主要包括ReiserFS, EXT2/EXT3/ext4, JFS, XFS等文件系統。學習
須要注意的是,因爲ACL是必須依託文件系統的,所以並非每一個文件系統都支持ACL。好比咱們 win 平臺的 NTFS 文件系統,FAT32 文件系統是不支持ACL的。在Linux平臺上,常見的支持ACL的文件愛你係統有以下幾類,如 EXT2/EXT3/ext4, JFS, XFS等等。
測試
那麼,如何查看你的系統是否支持 ACL 呢?spa
咱們能夠經過以下操做來查看:操作系統
[root@lh ~]# tune2fs -l /dev/vda1 | grep options Default mount options: user_xattr acl [root@lh ~]# dumpe2fs /dev/vda1 | grep options dumpe2fs 1.41.12 (17-May-2010) Default mount options: user_xattr acl
以上兩條命令任選一個便可!orm
若是在輸出的信息,默認掛載選項中有acl這個標識,就表明你的文件系統是支持的。遞歸
假設,你的文件系統不支持或者支持可是並無顯示這個acl標識怎麼辦呢?針對此種狀況,咱們能夠經過使用tune2fs來爲他添加,或者mount去添加均可以。
[root@lh ~]# tune2fs -o acl /dev/vda1 tune2fs 1.41.12 (17-May-2010)
ACL相關命令詳解
介紹完了 ACL 是什麼,也說了如何使文件系統支持 ACL 的功能,下面就來講說如何操做。
ACL的相關的操做主要有 3 個命令,分別是 getface、setfacl和chacl,經常使用的主要是getfacl 和 setfacl。
getfacl 查看文件/目錄的ACL設定內容 setfacl 設置文件/目錄的ACL內容 chacl 查看和更改文件/目錄的ACL內容,因爲平常有setfacl,所以chacl歷來不用,故本文不做介紹
getfacl 通常都是直接在後面跟你所要查看的文件或者目錄的路徑,所以掌握如何查看便可。操做以下:
[root@lh ~]# getfacl /tmp getfacl: Removing leading '/' from absolute path names # file: tmp # owner: root # group: root # flags: --t user::rwx group::rwx other::rwx [root@lh ~]# getfacl /etc/passwd getfacl: Removing leading '/' from absolute path names # file: etc/passwd # owner: root # group: root user::rw- group::r-- other::r--
setfacl 是使用最多的,基本 ACL 方面的操做都是它,所以它的選項也是蠻多的。首先來setfacl的使用語法:
setfacl [-bkRd] [{-m|-x} acl參數] 文件/目錄路徑 選項介紹: -b :刪除全部的 acl 參數 -k :刪除預設的 acl 參數 -R :遞歸設置後面的 acl 參數 -d :設置預設的 acl 參數(只對目錄有效,在該目錄新建的文件也會使用此ACL默認值) -m :設置(修改)後面 acl 參數 -x :刪除後面指定的 acl 參數
ACL 參數主要由3部分組成,組成結構以下:
三種身份:對應身份名:三種權限 [u|g|o]:[用戶名|用戶組名]:[rwx]
實例練習
下面來看幾個實例,來理解學習 ACL 的操做:
如今在/mnt目錄,有文件test和目錄dir,它們的權限都是600,屬主和屬組都是root。
[root@lh mnt]# touch test [root@lh mnt]# mkdir dir [root@lh mnt]# chmod 600 test [root@lh mnt]# chmod 600 dir [root@lh mnt]# ll total 4 drw-------. 2 root root 4096 Jul 4 17:56 dir -rw-------. 1 root root 0 Jul 4 17:56 test
如今要求完成以下要求:
一、爲文件 test 增長 acl 權限,使 sunsky 用戶能夠可讀可寫
[root@lh mnt]# setfacl -m u:sunsky:rw test [root@lh mnt]# getfacl test # file: test # owner: root # group: root user::rw- user:sunsky:rw- group::--- mask::rw- other::--- [root@lh mnt]# su - sunsky # 切換到sunsky用戶下,進行測試 Wellcome to Linux World [sunsky@lh ~]$ echo 1 >> /mnt/test # 很明顯能寫入數據 [sunsky@lh ~]$ cat /mnt/test1
二、爲文件 test 增長 acl 權限,使 sun 組的全部用戶都能讀該文件
[root@lh mnt]# setfacl -m g:sun:r test [root@lh mnt]# getfacl test # file: test # owner: root # group: root user::rw- user:sunsky:rw- group::--- group:sun:r-- mask::rw- other::--- [root@lh mnt]# su - sun Wellcome to Linux World [sun@lh ~]$ cat /mnt/test # 很明顯能查看test文件的內容 1 [sun@lh ~]$ echo 2 >> /mnt/test # 因爲咱們沒有給sun組成員更改權限,所以不能更改 -bash: /mnt/test: Permission denied
三、爲目錄 dir 增長 acl 權限,使 sun 組的全部用戶都可以對該目錄可讀可寫可執行
[root@lh mnt]# setfacl -m g:sun:rw dir [root@lh mnt]# getfacl dir # file: dir # owner: root # group: root user::rw- group::--- group:sun:rwx mask::rwx other::--- [root@lh mnt]# su - sun # 切換到sun用戶下,進行測試 [sun@lh ~]$ echo "date" >> /mnt/dir/date.sh [sun@lh ~]$ bash /mnt/dir/date.sh Fri Jul 4 18:01:48 CST 2014
四、刪除文件 test 上,關於 sun 組的 acl 權限
[root@lh mnt]# setfacl -x g:sun test [root@lh mnt]# getfacl test # file: test # owner: root # group: root user::rw- user:sunsky:rw- group::--- mask::rw- other::---
五、刪除目錄 dir 的全部 ACL 權限
[root@lh mnt]# setfacl -b dir [root@lh mnt]# getfacl dir # file: dir # owner: root # group: root user::rw- group::--- other::---
六、爲目錄 dir 增長默認ACL權限,使 dir 目錄下新建立的文件或目錄,都默認擁有 sunsky 用戶可讀可寫可執行
[root@lh mnt]# setfacl -m d:u:sunsky:rwx dir [root@lh mnt]# getfacl dir # file: dir # owner: root # group: root user::rw- group::--- other::--- default:user::rw- default:user:sunsky:rwx default:group::--- default:mask::rwx default:other::--- [root@lh mnt]# touch /mnt/dir/sunsky [root@lh mnt]# getfacl /mnt/dir/sunsky getfacl: Removing leading '/' from absolute path names # file: mnt/dir/sunsky # owner: root # group: root user::rw- user:sunsky:rwx #effective:rw- group::--- mask::rw- other::---
在第六題中,咱們發現,在user:sunsky:rwx後面多了一個 #effective:rw-,這是爲何呢?咱們在切換到sunsky用戶下,看看它是否有執行該文件的權限!
[root@lh mnt]# su - sunsky Wellcome to Linux World [sunsky@lh ~]$ bash /mnt/dir/sunsky bash: /mnt/dir/sunsky: Permission denied
很明顯,儘管咱們使用setfacl給了sunsky對dir目錄下默認新生成的文件可讀可寫可執行的權限,可是依舊是沒有執行權限的。這是爲何呢?
咱們發現多了輸出#effective:rw-,它是因爲什麼出來的呢?
effective生效的爲rw,他是受咱們輸出中的mask影響的。可是咱們發現,咱們並無設置過mask啊,爲啥他默認變成rw了。這裏我就來介紹一下mask!
mask 的做用是爲了用來限制除了屬主和其餘人之外的全部用戶或組的權限,mask 權限爲這些用戶他們可能擁有的最高權限。
若是遇到設置的用戶權限與 mask 權限衝突,則用戶的權限爲
# effective 權限
那麼,一旦一個文件被設置了 ACL,其文件原屬組部分的權限將變爲 MASK 權限,而並不是原來的屬組權限。若是其文件原先屬組權限爲空,那麼當你設置了mask權限以後,你的屬組權限也相應改變爲其mask對應的權限。
下面,咱們就繼續進行第六題的實驗!
[root@lh mnt]# setfacl -m m::rwx /mnt/dir/ [root@lh mnt]# getfacl /mnt/dir/ getfacl: Removing leading '/' from absolute path names # file: mnt/dir/# owner: root # group: root user::rw- group::--- mask::rwx other::--- default:user::rw- default:user:sunsky:rwx default:group::--- default:mask::rwx default:other::--- [root@lh mnt]# su - sunsky Wellcome to Linux World [sunsky@lh ~]$ bash /mnt/dir/sunsky bash: /mnt/dir/sunsky: Permission denied
奇怪了,爲何我已經更改了mask爲rwx了,而且effective也再也不出現了,爲什麼如今sunsky依舊拿不到執行權限呢?
咱們如今去看下/mnt/dir/sunsky文件的ACL權限吧。
[root@lh mnt]# getfacl /mnt/dir/sunsky getfacl: Removing leading '/' from absolute path names # file: mnt/dir/sunsky # owner: root # group: root user::rw- user:sunsky:rwx #effective:rw- group::--- mask::rw- other::---
經過查看咱們發現,/mnt/dir/sunsky文件中,對於 sunsky的acl權限設置居然仍是 # effective:rw- ,這是爲何呢?
原來,咱們剛纔修改 /mnt/dir 的 mask 僅僅只針對/mnt/dir目錄下新生成的文件有效,而且因爲文件在建立時,受到傳統權限的 umask 值的影響,已經擁有了屬組的權限,因此就使得 ACL 的mask設置失效。所以,此時咱們經過使用上面提到的-R 遞歸選項,將/mnt/dir目錄下的全部文件從新修改一次 ACL 的mask權限,就能解決該問題!
[root@lh mnt]# su - sunsky Wellcome to Linux World [sunsky@lh ~]$ echo date > /mnt/dir/sunsky [sunsky@lh ~]$ bash /mnt/dir/sunsky Fri Jul 4 18:32:11 CST 2014
以上就是 setfacl 的平常管理的全部操做了!相信只要你們將以上的操做掌握,之後只要用到ACL的地方就不會窘迫了。