ACL(acess control list)
傳統UNIX檔案系統:檔案通路權限包含三個部分,user / group / others,這類檔案系統簡潔而功能相對完善,在很長時間内被證明可以被應用于大多數場合,其典型表示如圖
但是某些特殊場合,僅僅擁有三種權限判定類别是不夠的。是以出現了ACL這樣新型的檔案系統設計,進而指定更多具體的使用者其通路權限
ACL标準
标準名稱 | 備注 |
---|---|
POSIX ACL | 最初制定的ACL草案,但是由于資金問題并沒有成為正式的标準。但是在UNIX陣營被廣泛的實作 |
Windows ACL | 微軟公司制定了自己的Windows ACL,該方案相比POSIX差異很大并且更加複雜 |
NFSv4 ACL | 鑒于沒有一個權威的ACL标準,在制定此标準的時候:基于POSIX ACL,相容Windows ACL |
ACL 實作
檔案系統 | 作業系統 | 支援ACL |
---|---|---|
ReiserFS | Linux | POSIX ACL |
XFS | Linux | POSIX ACL |
JFS | Linux | POSIX ACL |
BtrFS | Linux | POSIX ACL |
ext* | Linux | POSIX ACL |
UFS | Solaris | POSIX ACL |
VxFS | HP-UX | POSIX ACL |
ZFS | Solaris | NFSv4 ACL |
JFS2 | AIX | NFSv4 ACL |
- POSIX ACL
ACL通路表文法格式
文法 | 語義 |
---|---|
user::rw- | 屬主權限,可讀可寫 |
user:wein:r– | 特定使用者wein,隻讀 |
group::r– | 檔案屬組,隻讀 |
group:ruby:r-x | 特定使用者組ruby,可執行 |
other::rwx | 其它使用者,讀寫,可執行 |
mask::perms | 影響除屬主和其它之外的所有成員 |
ACL權限判定
- 判斷程序有效使用者ID是否和屬主相同,如果相同,最終通路權限為user::這一項決定(與mask無關)
- 繼續判斷有效使用者ID是否和其它特定使用者相同,如果相同,最終通路權限為user:name:一項與mask決定
- 繼續判斷有效使用者ID所屬諸多組别是否和ACL中有比對項,如果比對,最終通路權限為group:*:與mask決定
- 以上都不成立,權限取決于other::項(于mask無關)
- ACL繼承
POSIX ACL實驗
01 最小ACL(實際ACL并沒有存儲,隻是把9bits翻譯成為ACL輸出),通過ls -l 輸出最後沒有提示"+“符号判斷是否存儲ACL
手動編輯最小ACL,事實上仍然隻是修改9bit權限位
02真實ACL
setfacl 把寫權限提供給使用者wein(wein不在jianleya這個組當中),實驗發現wein确實可以寫入檔案。此時檔案已經真實需要一個ACL存儲,從檔案末尾的”+“符号可以看出這一點
03 當檔案末尾有一個”+"符号,意味着檔案需要單獨存儲ACL:
這個時候使用chmod 指令改變組權限将會産生一個問題,chmod g+w 或者g-w修改的是mask這個字段,并不會影響group::
example檔案開始組權限隻讀,使用chmod g+w發現ls指令顯示組已經有了寫權限,但是ACL中mask增加了w掩碼字,group::仍然是隻讀(這個時候屬于jianleya這個組的成員對該檔案是沒有寫權限的)。顯然ls -l 的輸出有些問題,為了真正賦予組寫權限需要編輯ACL group::
- NFSv4 ACL