ACL訪問控制列表
1、開啓acl功能(可能某些情況下需要自己手動開啓acl)
-
在 CentOS 6.x 系統中 ACL 權限默認是開啓的,不需要手工開啓。不過,如果你的操作系統不是 CentOS 6.x,那該如何查看 ACL 權限是否開啓了呢?可以這樣查看:
[root@localhost ~]# mount
/dev/sda1 on /boot type ext4 (rw)
/dev/sda3 on I type ext4 (rw)
…省略部分輸出…
// 使用mount命令可以看到系統中已經掛載的分區,但是並沒有看到ACL權限的設置 -
[root@localhost ~]# dumpe2fs -h /dev/sda3
// dumpe2fs是查詢指定分區文件系統詳細信息的命令
…省略部分輸出…
Default mount options: user_xattr acl
…省略部分輸出…
// 其中,dumpe2fs 命令可選的選項及其含義如下:
-h:僅顯示超級塊中的信息,而不顯示磁盤塊組的詳細信息;
// 使用 mount 命令可以査看到系統中已經掛載的分區,而使用 dumpe2fs 命令可以査看到這個分區文件系統的詳細信息。大家可以看到,我們的 ACL 權限是 /dev/sda3 分區的默認掛載選項,所以不需要手工掛載。 -
不過當 Linux 系統沒有默認掛載時怎麼辦呢,可以手工掛載嗎?當然可以,執行如下命令:
[root@localhost ~]# mount -o remount, acl /
// 重新掛載根分區,並加入ACL權限
// 使用 mount 命令重新掛載,並加入 ACL 權限。不過使用此命令是臨時生效的。要想永久生效,需要修改 /etc/fstab 文件,命令如下:
[root@localhost ~]#vi /etc/fstab
UUID=c2ca6f57-b15c-43ea-bca0-f239083d8bd2 /ext4 defaults, acl 1 1
// 加入ACL權限
[root@localhost ~]# mount -o remount /
// 重新掛載文件系統或重啓系統,使修改生效
// 在你需要開啓 ACL 權限的分區行上(也就是說 ACL 權限針對的是分區),手工在 defaults 後面加入",acl"即可永久在此分區中開啓 ACL 權限。
2、acl功能使用
(1)、ACL權限管理命令
- 我們知道了 ACL 權限的作用,也知道了如何開啓 ACL 權限,接下來學習如何査看和設定 ACL 權限。命令如下:
[root@localhost ~]# getfacle 文件名
// 查看ACL權限
[root@localhost ~]# setfacl 選項 文件名
// 設定ACL權限
選項:
(1) -m:設定 ACL 權限。如果是給予用戶 ACL 權限,則使用"u:用戶名:權限"格式賦予;如果是給予組 ACL 權限,則使用"g:組名:權限" 格式賦予;
(2) -x:刪除指定的 ACL 權限;
(3) -b:刪除所有的 ACL 權限;
(4) -d:設定默認 ACL 權限。只對目錄生效,指目錄中新建立的文件擁有此默認權限;
(5) -k:刪除默認 ACL 權限;
(6) -R:遞歸設定 ACL 權限。指設定的 ACL 權限會對目錄下的所有子文件生效;
(2)給用戶和用戶組添加ACL權限
- 看下面例子,就來看看圖 1 中的權限怎麼分配。我們要求 root 是 /project 目錄的屬主,權限是 rwx;tgroup 是此目錄的屬組,tgroup 組中擁有班級學員 zhangsan 和 lisi,權限是 rwx;其他人的權限是 0。這時,試聽學員 st 來了,她的權限是 r-x。我們來看具體的分配命令。
[root@localhost ~]# useradd zhangsan
[root@localhost ~]# useradd lisi
[root@localhost ~]# useradd st
[root@localhost ~]# groupadd tgroup
// 添加需要試驗的用戶和用戶組,省略設定密碼的過程
[root@localhost ~]# mkdir /project #建立需要分配權限的目錄
[root@localhost ~]# chown root:tgroup /project/
// 改變/project目錄的屬主和屬組
[root@localhost ~]# chmod 770 /project/
// 指定/project目錄的權限
[root@localhost ~]# ll -d /project/
drwxrwx— 2 root tgroup 4096 1月19 04:21 /project/
// 查看一下權限,已經符合要求了
// 這時st學員來試聽了,如何給她分配權限
[root@localhost ~]# setfacl -m u:st:rx /project/
// 給用戶st賦予r-x權限,使用"u:用戶名:權限" 格式
[root@localhost /]# cd /
[root@localhost /]# ll -d project/
drwxrwx—+ 3 root tgroup 4096 1月19 05:20 project/
// 使用ls-l査詢時會發現,在權限位後面多了一個"+",表示此目錄擁有ACL權限
[root@localhost /]# getfacl project
// 查看/prpject目錄的ACL權限
// file: project <-文件名
// owner: root <-文件的屬主
// group: tgroup <-文件的屬組
user::rwx <-用戶名欄是空的,說明是屬主的權限
user:st:r-x <-用戶st的權限
group::rwx <-組名欄是空的,說明是屬組的權限
mask::rwx <-mask權限
other::— <-其他人的權限
大家可以看到,st 用戶既不是 /prpject 目錄的屬主、屬組,也不是其他人,我們單獨給 st 用戶分配了 r-x 權限。這樣分配權限太方便了,完全不用先辛苦地規劃用戶身份了。 - 我想給用戶組賦予 ACL 權限可以嗎?當然可以,命令如下:
[root@localhost /]# groupadd tgroup2
// 添加測試組
[root@localhost /]# setfacl -m g:tgroup2:rwx project/
// 爲組tgroup2紛配ACL權限,使用"g:組名:權限"格式
[root@localhost /]# ll -d project/
drwxrwx—+ 2 root tgroup 4096 1月19 04:21 project/
// 屬組並沒有更改
[root@localhost /]# getfacl project/
// file: project/
// owner: root
// group: tgroup
user::rwx
user:st:r-x
group::rwx
group:tgroup2:rwx 【用戶組tgroup2擁有了rwx權限】
mask::rwx
other::–
(3)最大有效權限mask
- mask 是用來指定最大有效權限的。mask 的默認權限是 rwx,如果我給 st 用戶賦予了 r-x 的 ACL 權限,mj 需要和 mask 的 rwx 權限"相與"才能得到 st 的真正權限,也就是 r-x "相與"rwxtj 出的值是 r-x,所以 st 用戶擁有 r-x 權限。
- 如果把 mask 的權限改爲 r–,和 st 用戶的權限相與,也就是 r–"相與"r-x 得出的值是 r–,st 用戶的權限就會變爲只讀。大家可以這麼理解:用戶和用戶組所設定的權限必須在 mask 權限設定的範圍之內才能生效,mask權限就是最大有效權限。
- 不過我們一般不更改 mask 權限,只要給予 mask 最大權限 rwx,那麼任何權限和 mask 權限相與,得出的值都是權限本身。也就是說,我們通過給用戶和用戶組直接賦予權限,就可以生效,這樣做更直觀。
補充:邏輯與運算的運算符是"and"。可以理解爲生活中所說的"並且"。也就是相與的兩個值都爲真,結果才爲真;有一個值爲假,與的結果就爲假。比如 A 相與 B,結果入表 2 所示。
** 那麼兩個權限相與和上面的結果類似,我們以讀(r)權限爲例,結果如表 3 所示。**
所以,“rwx"相與"r-x”,結果是"r-x";“r–“相與"r-x”,結果是"r–”。 - 修改最大有效權限的命令如下:
[root@localhost /]# setfacl -m m:rx project/
// 設定mask權限爲r-x,使用"m:權限"格式
[root@localhost /]# getfacl project/
// file:project/
// owner:root
// group:tgroup
user::rwx
group::rwx #effective:r-x
mask::r-x
// mask權限變爲r-x
other::–
(4)默認ACL權限和遞歸ACL權限
-
我們已經給 /project 目錄設定了 ACL 權限,那麼,在這個目錄中新建一些子文件和子目錄,這些文件是否會繼承父目錄的 ACL 權限呢?下面來看。
[root@localhost /]# cd /project/
[root@localhost prq’ect]# touch abc
[root@localhost prq’ect]# mkdir d1
// 在/project目錄中新建了abc文件和d1目錄
[root@localhost project]#ll
總用量4
-rw-r–r-- 1 root root 01月19 05:20 abc
drwxr-xr-x 2 root root 4096 1月19 05:20 d1
// 這兩個新建立的文件權限位後面並沒有"+",表示它們沒有繼承ACL權限
// 子文件 abc 和子目錄 d1 因爲是後建立的,所以並沒有繼承父目錄的 ACL 權限。當然,我們可以手工給這兩個文件分配 ACL 權限,但是如果在目錄中再新建文件,都要手工指定,則顯得過於麻煩。這時就需要用到默認 ACL 權限。 -
默認 ACL 權限的作用是:如果給父目錄設定了默認 ACL 權限,那麼父目錄中所有新建的子文件都會繼承父目錄的 ACL 權限。默認 ACL 權限只對目錄生效。命令如下:
[root@localhost /]# setfacl -m d:u:st:rx /project/
#使用"d:u:用戶名:權限"格式設定默認ACL權限
[root@localhost project]# getfacl project/
// file: project/
// owner: root
// group: tgroup
user:: rwx
user:st:r-x
group::rwx
group:tgroup2:rwx
mask::rwx
other::–
default:user::rwx <-多出了default字段
default:user:st:r-x
default:group::rwx
default: mask::rwx
default:other::–
[root@localhost /]# cd project/
[root@localhost project]# touch bcd
[root@localhost project]# mkdir d2
// 新建子文件和子目錄
[root@localhost project]# ll 總用量8
-rw-r–r-- 1 root root 01月19 05:20 abc
-rw-rw----+ 1 root root 01月19 05:33 bcd
drwxr-xr-x 2 root root 4096 1月19 05:20 d1
drwxrwx—+ 2 root root 4096 1月19 05:33 d2
// 新建的bcd和d2已經繼承了父目錄的ACL權限
// 那麼這裏可以看出,原先的 abc 和 d1 還是沒有 ACL 權限,因爲默認 ACL 權限是針對新建立的文件生效的。 -
再看看遞歸 ACL 權限。遞歸是指父目錄在設定 ACL 權限時,所有的子文件和子目錄也會擁有相同的 ACL 權限。
[root@localhost project]# setfacl -m u:st:rx -R/project/
#-R遞歸
[root@localhost project]# ll
總用量8
-rw-r-xr–+ 1 root root 01月19 05:20 abc
-rw-rwx–+ 1 root root 01月19 05:33 bcd
drwxr-xr-x+ 2 root root 4096 1月19 05:20 d1
drwxrwx–+ 2 root root 4096 1月19 05:33 d2
// abc和d1也擁有了ACL權限
// 總結下來:默認 ACL 權限指的是針對父目錄中新建立的文件和目錄會繼承父目錄的 ACL 權限,格式是"setfacl -m d:u:用戶名:權限 文件名";遞歸 ACL 權限指的是針對父目錄中已經存在的所有子文件和子目錄繼承父目錄的 ACL 權限,格式是"setfacl -m u:用戶名: 權限 -R 文件名"。
(5)刪除ACL權限
刪除ACL權限分爲兩種情況,一爲刪除指定ACL權限,二爲刪除所有ACL權限。
- 刪除指定的ACL權限
[root@localhost /]# setfacl -x u:st /project/
// #刪除指定用戶和用戶組的ACL權限
[root@localhost /]# getfacl project/
// file:project/
// owner: root
// group: tgroup
user::rwx
group::rwx
group:tgroup2:rwx
mask::rwx
other::–
// st用戶的權限已被刪除
刪除所有ACL權限:
[root@localhost /]# setfacl -b project/
#會刪除文件的所有ACL權限
[root@localhost /]# getfacl project/
#file: project/
#owner: root
// group: tgroup
user::rwx
group::rwx
other::–
// 所有ACL權限已被刪除
----------------------------------------武漢艾迪時代網絡技術有限公司----------------------------------------------------