2,512 瀏覽數

Access Control Lists

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 可以針對下面四種權限來設定

  1. 個別的使用者
  2. 個別的群組
  3. effective mask 的權限.
  4. 其他的使用者

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 欲打包目錄

  • <li><strong>star 還原解包指令:</strong>
    [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 來設定權限

[-bkndRLP..] 參數使用方式

  • -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.

網友的想法

  1. 自動參照通知: samba-ACL | Benjr.tw

發表迴響