ACL(Access Control Lists)
傳統的 Unix like 檔案系統只能針對 user/group/other 來對檔案設定權限(無法針對 “個別” 的使用者,群組來設定),而 ACL 可以針對 “個別” 的使用者/群組來設定權限.
Step 0:檢查你的核心是否有支援 ACL 的功能
Step 1:掛載磁區
Step 2:設定 ACL 的權限
Step 3:ACL 的權限移除
Step 4:預設的 ACLs 權限
Step 5:ACL 權限的保存
Step 6:setfacl 的參數使用方式
Step 0:檢查你的核心是否有支援 ACL 的功能
並不是每一個版本的核心都有支援 ACL 的功能,最簡單的方式就是檢查目前核心是否有支援.此時如果能看到下敘幾項功能已經編譯至核心中,那你的 ext3 檔案系統已經有支援 ACL 的功能(如果你的檔案系統為 ext2 請用 #tune2fs 將他轉換成 ext3 的檔案格式),如果沒有那請自己編譯一個含有上敘功能的模組吧!!這些功能在編譯核心選項中的 File systems 下都可以找到.
[root@benjr ~]# cat /boot/config-kernel-version | grep -i ext3 CONFIG_EXT3_FS=m CONFIG_EXT3_IDEX=y CONFIG_EXT3_FS_XATTR_SHARING=y CONFIG_EXT3_FS_XATTR_USER=y CONFIG_EXT3_FS_XATTR_TRUSTED=y CONFIG_EXT3_FS_ACL=y
如果你在編譯核心時找不到上敘功能的模組,請至 ACL 的官方網站來安裝 Kernel Patch http://acl.bestbits.at/
Step 1:掛載磁區
你可以用下列的方式掛載磁區.
[root@benjr ~]# mount -t ext3 -o acl /dev/sda1 /fs1
你也可以直接寫在 /etc/fstab 檔案中,這樣就可以在開機後支援 ACL 的功能
[root@benjr ~]# vi /etc/fstab /dev/sda1 /fs1 ext3 acl 1 2
Step 2:設定 ACL 的權限
ACL 可以針對下面四種權限來設定
- 個別的使用者
- 個別的群組
- effective mask 的權限.
- 其他的使用者
acl 主要透過指令 #setfacl -m <rules> <files> 來針對使用權限來設定,<rules> 可指定的方式 u,g,o(使用者/群組/其他) 權限有 rwx (read / write / eXecute) .透過 #getfacl <files> 來查看目前檔案的 acl 權限.
1.個別的使用者
要針對個別使用者時 #setfacl -m u:<uid>:<perms> <files>
[root@benjr ~]# getfacl /etc/shadow # file: etc/shadow # owner: root # group: root user::r– group::— other::— [root@benjr ~]# setfacl -m u:ben:rwx /etc/shadow
現在來看看這 ben 的具有什麼權限
[root@benjr ~]# ls -l /etc/shadow -r–rwx—+
使用 #ls -l你會看到後面多了一個 “+” 表示這個檔案有使用 ACL 的屬性設定.再用指令 getfacl 來看 ACL 的檔案屬性設定為何.
[root@benjr ~]# getfacl /etc/shadow # file: etc/shadow # owner: root # group: root user::r– user:ben:rwx group::— other::—
可以看到 ben 已經有 /etc/shadow 讀和寫這個檔案的權限.
2.個別的群組
除了針對個人外還可以針對群組來設定 ACL使用方法一樣, #setfacl -m g:<gid>:<perms> <files>
[root@benjr ~]# getfacl /root # file: root # owner: root # group: root user::rwx group::r-x other::— [root@benjr ~]# setfacl -m g:it:rwx /root
使用 #ls -ld 你會看到後面多了一個 “+” 表示這個檔案有使用 ACL 的屬性設定.
[root@benjr ~]# ls -dl /root drwxrwx—+ 22 root root 4096 Dec 16 01:14 /root
用指令 getfacl 來看 it 這個群組具有什麼 acl 權限
[root@benjr ~]# getfacl /root getfacl: Removing leading ‘/’ from absolute path names # file: root # owner: root # group: root user::rwx group::r-x group:it:rwx mask::rwx other::—
3. effective mask 的權限.
設定 effective mask 時會影響到群組的擁有者和 acl 的使用者以及群組.不受影響的只有 owner 的 user.使用方法一樣, #setfacl -m m:<perms> <files>
[root@benjr ~]# setfacl -m m:— /etc/shadow [root@benjr ~]# getfacl /etc/shadow getfacl: Removing leading ‘/’ from absolute path names # file: etc/shadow # owner: root # group: root user::r– user:ben:rwx #effective:— group::— mask::— other::—
使用者 ben 將無法讀取寫入 /etc/shadow 的權限.
相對的也可以對目錄做同樣的設定.群組的擁有者和 acl 的使用者以及群組都會受到影響.
[root@benjr ~]# setfacl -m m:— /root [root@benjr ~]# getfacl /root getfacl: Removing leading ‘/’ from absolute path names # file: root # owner: root # group: root user::rwx group::r-x #effective:— group:it:rwx #effective:— mask::— other::—
it 這個群組已經無法針對 /root 目錄作任何存取,相對的群組的擁有者也會受到影響,不過這邊的使用者和群組的擁有者為同一個所以 root 還是有其權限.
4.其他的使用者的權限設定
最後一種就是針對其他 other 的使用者來設定 #setfacl -m o:<perms> <files> 這方式如同使用#chmod o+-<rwx> <files> 一樣的功能.
[root@benjr ~]# ls -l /root/anaconda-ks.cfg -rw——- 1 root root 4902 Dec 2 00:55 /root/anaconda-ks.cfg [root@benjr ~]# setfacl -m o:rwx anaconda-ks.cfg [root@benjr ~]# ls -l /root/anaconda-ks.cfg -rw—-rwx 1 root root 4902 Dec 2 00:55 /root/anaconda-ks.cfg
Step 3:ACL 的權限移除
那如何才能移除 acl 的權限,可以用指令 #setfacl -x <rules> <files> 來移除
[root@benjr ~]# getfacl /etc/shadow getfacl: Removing leading ‘/’ from absolute path names # file: etc/shadow # owner: root # group: root user::r– user:ben:rwx #effective:— group::— mask::— other::— [root@benjr ~]# setfacl -x u:ben /etc/shadow [root@benjr ~]# getfacl /etc/shadow getfacl: Removing leading ‘/’ from absolute path names # file: etc/shadow # owner: root # group: root user::r– group::— mask::— other::—
透過指令 #setfacl -x u:ben /etc/shadow 可以看到 /etc/shadow 檔案裡將 ben 的相關權限都移除了.
Step 4:預設的 ACLs 權限
通常在建立新檔案的時候,預設的權限是決定在 umask (umask 定義在 /etc/bashrc),而 umask 只能依據特權使用者(root 的umask 為022,)或者非特權使用者(非特權使用者為002)來限定,無法依據目錄來設定.而 ACL 可以針對目錄來設定其預設權限(default ACLs) ,之後在此目錄下所產生的檔案都會具有此預設權限(default ACLs).
使用方式一樣是透過 #setfacl -m d:<rules> <directory>
[root@benjr ~]# setfacl -m d:g:it:rwx /root [root@benjr ~]# getfacl /root getfacl: Removing leading ‘/’ from absolute path names # file: root # owner: root # group: root user::rwx group::r-x other::— default:user::rwx default:group::r-x default:group:it:rwx default:mask::rwx default:other::—
可以看到 /root 預設權限(default ACLs) 已經變了,現在來進入 /root 建立一個檔案看看
[root@benjr ~]# cd /root [root@benjr ~]# touch acl.test [root@benjr ~]# getfacl acl.test # file: acl.test # owner: root # group: root user::rw- group::r-x #effective:r– group:it:rwx #effective:rw- mask::rw- other::—
可以看到新增的檔案 it 群組有 rwx 的權限.預設的權限可以使用參數 -k 來移除 #setfacl -k /root
Step 5:ACL 權限的保存
通常具有 acl 的檔案或目錄在複製時需加入參數 #cp -p 或是 #cp -a 來將其 acl 權限保留,但是在使用 #tar 將檔案打包的時候其 acl 權限將不被保留,所以建議使用 star 這一隻工具作打包.
- star 備份打包指令:
[root@benjr ~]# star -Hexustar -acl -c f=Tree.star Tree
f=Tree.star “star 打包檔案名稱” ,Tree 欲打包目錄
- star 還原解包指令:
[root@benjr ~]# star -acl -x f=Tree.star
Step 6:setfacl 的參數使用方式
# setfacl [-bkndRLP] { -m|-M|-x|-X …} <rules> <file> …
{ -m|-M|-x|-X …} 使用方式
- -m 代表是要 modify 權限設定
- -x 代表要 remove 權限設定
rules 的使用方式可以分成下列幾種格式
- u:(uid):(perms) 依使用者來設定來設定權限
- g:(gid):(perms) 依群組來設定來設定權限
- m:(perms) 依 effective mask 來設定來設定權限
- o:(perms) 依其他來設定來設定權限,針對 other group 來設定權限
- -b , –remove-all Remove all extended ACL entries
- -k, –remove-default Remove the Default ACL.
- -n , –no-mask Do not recalculate the effective rights mask
- –mask Do recalculate the effective rights mask
- -d, –default All operations apply to the Default ACL.
- –restore=file Restore a permission backup created by ‘getfacl -R’ or similar.
- –test Test mode
- -R, –recursive Apply operations to all files and directories recursively.
- -L, –logical Logical walk,follow symbolic links
- -P, –physical Physical walk,skip all symbolic links.
One thought on “Linux – Access Control Lists”