文件權限管理-POSIX ACL
baidu
在 Unix/Linux 系統上沿用了多年的權限機制,由於欠缺靈活性,在現今的信息系統上顯得落後和不敷應用。然而一個新的權限機制標准已經誕生出來,本文將會為大家介紹這個新機制在 Linux 上的操作方式。
傳統上,在 Linux 系統中每個檔案和目錄都設有權限 (permission) 來決定那些人能夠使用這個檔案。
權限分為三組,分別為:擁有者 (file owner),群組 (group),及 其它 (other)。每組中再設有其屬性。屬性亦分為三種,分別為:讀取 (read),寫入 (write),及執行(executable)。
我們可以用 "ls -l" 來檢視檔案的權限:
-rwxrw-r-- 1 adam mis 272401 May 10 2003 report.doc
在上面的例子,檔案 report.doc 的擁有者為 "adam" 而 adam 可以讀取,寫入和執行這個檔案,另外 report.doc 的群組為 "mis",在系統中所有屬於 mis 群組 的使用者皆可讀取和寫入這個檔案,而其它的使用者只能夠讀取這個檔案。
如果我們想 report.doc 的內容只能給 mis 群組的使用者讀取,我們可以用"chmod 640 report.doc" 這個指令更改其權限。
-rw-r----- 1 adam mis 272401 May 10 2003 report.doc
要是 report.doc 這個檔案同時要給 mis 和 hr 兩個群組的使用者讀取,現有的權限機制已不能夠讓我們簡易地設定。我們得要勞煩系統管理員為我們加入一個新的群組 (i.e.mishr),並把所有 mis 和 hr 中的使用者加進 mishr 群組中。然後我們要用 "chgrp mishr report.doc" 把群組設為 mishr。
-rw-r----- 1 adam mishr 272401 May 10 2003 report.doc
假若,我們的要求再復雜一點:要讓使用者 adam 和 eva 能讀取和寫入,群組 mis和 hr 只能讀取。那麼,任我們再多加新的群組亦沒辦法得到這樣的權限設定。要得到以上的權限設定,我們須要一個新的權限機制。而這個機制名為存取控制清單 (Access Control List, 簡稱 ACL)。ACL 實為現有權限機制的延伸,在三個基本設定 (擁有者,群組及其它) 外,允許我們加入對某指定使用者或群組的存取權限設定。
為針對 Unix 系統先天的不足,一個名為 POSIX ACL 的權限機制標准便誕生出來。其目的是為各 Unix 系統之間制定一個兼容的 ACL 標准,使各用家能在各系統之間使用統一的接口。
這個 POSIX ACL 的功能在 Linux kernel 2.6 上被正式支持,之後又被 back-port到 2.4 kernel 上。大家常用的檔案系統,如:ext3,xfs,jfs,和 ReiserFS,都能使用ACL。當然,大家須要在編譯 kernel 時啟動 ACL。
相關的 kernel option:
? CONFIG_FS_POSIX_ACL
? CONFIG_EXT3_FS_POSIX_ACL
? CONFIG_EXT2_FS_POSIX_ACL
掛上檔案系統
雖然在 kernel 中已加進了 POSIX ACL 的支持,但是並不會自動啟用的。我們必須在掛上檔案系統時指明要使用 ACL。例如:
mount -t ext3 -o acl /dev/sda1 /home
當中 “-o acl” 便是在 /dev/sda1 上啟用 ACL 的選項。
我們亦可以在 /etc/fstab 中加入選項:
/dev/sda1 /home ext3 acl 1 2
檢視ACL
要檢視一個檔案或目錄的 ACL,便要使用 “getfacl” 指令:
[adam@www adam]$ getfacl report.doc
# file: report.doc
# owner: adam
# group: mis
user::rwgroup::
rwother::
r--
以上的例子列出了一個基本的 ACL (Minimum ACL)。頭三行為檔案數據,當中包括了檔案的擁有者和所屬群組。之後的便是 ACL 中的每一條的規則。
在這個基本的 ACL 中:
user::rw- 擁有者 adam 能讀取和寫入
group::rw- 屬於 mis 群組的使用者能讀取和寫入
other::r-- 其它的使用者只能讀取
更改ACL
“setfacl” 指令能更改一個檔案或目錄的 ACL。其用法如下:
setfacl option rules files
option:
-m 用來新增或修改 ACL 中的規則
-x 用來移除 ACL 中的規則
rules:
user:(uid/name):(perms) 指定某位使用者的權限
group:(gid/name):(perms) 指定某一群組的權限
other::(perms) 指定其它使用者的權限
mask::(perms) 設定有效的權限屏蔽
(perms) 為傳統的 r(讀取), w(寫入) 及 x(執行)
如果想讓 hr 群組的使用者能讀取 “report.doc”而其它的人不能讀取的話。 我們可以用以下的指令達成:
setfacl -m group:hr:r,other::- report.doc
以 getfacl 檢視新的 ACL:
[adam@www adam]$ getfacl report.doc
# file: report.doc
# owner: adam
# group: mis
user::rwgroup::
rwgroup:
hr:r--
mask::rwother::---
回應本文開始時所要的權限: 要讓使用者 adam 和 eva 能 讀取 和 寫入,群組mis 和 hr 只能讀取, 其它人不能 讀取 和 寫入。 我們只須多加兩個規則便能達成:
setfacl -m group::r,user:eva:rw report.doc
[adam@www adam]$ getfacl report.doc
# file: report.doc
# owner: adam
# group: mis
user::rwuser:
eva:rwgroup::
r--
group:hr:r--
mask::rwother::---
ACL 的種類
ACL 有兩種, 分別為 『存取型ACL』 (Access ACL) 和 『預設型ACL』 (Default ACL)。 我們之前所介紹便是 存取型ACL, 可用於檔案或目錄, 它決定了該檔案或目錄本身的使用權限。
而預設型ACL 只可用於目錄, 它決定了該目錄下新建立的檔案或目錄的 ACL。
[adam@www adam]$ getfacl /home/adam
getfacl: Removing leading '/' from absolute path names
# file: home/adam
# owner: adam
# group: adam
user::rwx
group::---
other::---
要設定預設型ACL, 同樣使用 “setfacl”。 所不同的是, 在每個規則前加上“default:”, 例如:
setfacl -m default:user::rw /home/adam
如果覺得指令太長的話我們可以使用簡略字符:
長寫 簡寫
user: u:
group: g:
other: o:
mask: m:
default: d:
例如, 要設定 /home/adam 的預設型ACL 為, 使用者 adam 和 eva 能 讀取 和 寫入, 群組只能讀取 :
setfacl -m d:u::rw,d:u:eva:rw,d:g::r,d:o::- /home/adam
[adam@www adam]$ getfacl /home/adam
getfacl: Removing leading '/' from absolute path names
# file: home/adam
# owner: adam
# group: adam
user::rwx
group::---
other::---
default:user::rwdefault:
user:eva:rwdefault:
group::r--
default:mask::rwdefault:
other::---
建立新的檔案並檢視其 存取型ACL:
[adam@www adam]$ touch newfile
[adam@www adam]$ getfacl newfile
# file: newfile
# owner: adam
# group: mis
user::rwuser:
eva:rwgroup::
r--
mask::rwother::---
其它要注意的事項
除了以上堤及過的 getfacl 和 setfacl 指令外, 大家亦可以用另一個名為 “chacl”的指令來修改 ACL。 Chacl 原本是 IRIX 系統上 XFS 的 ACL 工具, 如果各位已經對chacl 有認 識的話便不用學 getfacl 和 setfacl 了。
美中不足的是, 由於 ACL 是新的模塊。 雖然在 kernel 和一些 shell common 中支持外, 很多大家常用的工具中仍未支持, 當中包括 KDE , Gnome, tar 和 dump 等。如要備份文件或目錄既有的 ACL 大家可以用另一個和 tar 類似的工具 star , 來把ACL 一起備份到 tar 檔中。 詳情請參閱 star 的 man page。