天天看點

Linux ACL權限設定(setfacl和getfacl)

通過上一節的學習,我們知道了什麼是 ACL 權限,也了解了如何配置 Linux 系統使其開啟 ACL 權限,本節來學習 ACL 設定檔案通路權限的具體方法。

設定 ACl 權限,常用指令有 2 個,分别是 setfacl 和 getfacl 指令,前者用于給指定檔案或目錄設定 ACL 權限,後者用于檢視是否配置成功。

getfacl 指令用于檢視檔案或目錄目前設定的 ACL 權限資訊。該指令的基本格式為:

[[email protected] ~]# getfacl 檔案名

getfacl 指令的使用非常簡單,且常和 setfacl 指令一起搭配使用。

setfacl 指令可直接設定使用者或群組對指定檔案的通路權限。此指令的基本格式為:

[[email protected] ~]# setfacl 選項 檔案名

表 1 羅列出了該指令可以使用的所用選項及功能。

表 1 setfacl 指令選項及用法

選項 功能
-m 參數 設定 ACL 權限。如果是給予使用者 ACL 權限,參數則使用 "u:使用者名:權限" 的格式,例如 

setfacl -m u:st:rx /project

 表示設定 st 使用者對 project 目錄具有 rx 權限;如果是給予組 ACL 權限,參數則使用 "g:組名:權限" 格式,例如 

setfacl -m g:tgroup:rx /project

 表示設定群組 tgroup 對 project 目錄具有 rx 權限。
-x 參數 删除指定使用者(參數使用 u:使用者名)或群組(參數使用 g:群組名)的 ACL 權限,例如 

setfacl -x u:st /project

 表示删除 st 使用者對 project 目錄的 ACL 權限。
-b 删除所有的 ACL 權限,例如 

setfacl -b /project

 表示删除有關 project 目錄的所有 ACL 權限。
-d 設定預設 ACL 權限,指令格式為 "setfacl -m d:u:使用者名:權限 檔案名"(如果是群組,則使用 d:g:群組名:權限),隻對目錄生效,指目錄中建立立的檔案擁有此預設權限,例如 

setfacl -m d:u:st:rx /project

 表示 st 使用者對 project 目錄中建立立的檔案擁有 rx 權限。
-R 遞歸設定 ACL 權限,指設定的 ACL 權限會對目錄下的所有子檔案生效,指令格式為 "setfacl -m u:使用者名:權限 -R 檔案名"(群組使用 g:群組名:權限),例如 

setfacl -m u:st:rx -R /project

 表示 st 使用者對已存在于 project 目錄中的子檔案和子目錄擁有 rx 權限。
-k 删除預設 ACL 權限。

setfacl -m:給使用者或群組添加 ACL 權限

回歸上一節案例,解決方案如下:

  • 老師使用 root 使用者,并作為 /project 的所有者,對 project 目錄擁有 rwx 權限;
  • 建立 tgroup 群組,并作為 project 目錄的所屬組,包含本班所有的班級學員(假定隻有 zhangsan 和 lisi),擁有對 project 的 rwx 權限;
  • 将其他使用者通路 project 目錄的權限設定為 0(也就是 —)。
  • 對于試聽學員 st 來說,我們對其設定 ACL 權限,令該使用者對 project 擁有 rx 權限。

具體的設定指令如下:

[[email protected] ~]# useradd zhangsan

[[email protected] ~]# useradd lisi

[[email protected] ~]# useradd st

[[email protected] ~]# groupadd tgroup <– 添加需要試驗的使用者和使用者組,省略設定密碼的過程

[[email protected] ~]# mkdir /project <– 建立需要配置設定權限的目錄

[[email protected] ~]# chown root:tgroup /project <– 改變/project目錄的所有者和所屬組

[[email protected] ~]# chmod 770 /project  <– 指定/project目錄的權限

[[email protected] ~]# ll -d /project

drwxrwx—. 2 root tgroup 4096 Apr 16 12:55 /project

#這時st學員來試聽了,如何給她配置設定權限

[[email protected] ~]# setfacl -m u:st:rx /project

#給使用者st賦予r-x權限,使用"u:使用者名:權限" 格式

[[email protected] /]# cd /

[[email protected] /]# ll -d /project

drwxrwx—+ 2 root tgroup 4096 Apr 16 12:55 /project

#如果查詢時會發現,在權限位後面多了一個"+",表示此目錄擁有ACL權限

[[email protected] /]# getfacl project

#檢視/prpject目錄的ACL權限

#file:project <–檔案名

#owner:root <–檔案的所有者

#group:tgroup <–檔案的所屬組

user::rwx <–使用者名欄是空的,說明是所有者的權限

user:st:r-x <–使用者st的權限

group::rwx <–組名欄是空的,說明是所屬組的權限

mask::rwx <–mask權限

other::— <–其他人的權限

可以看到,通過設定 ACL 權限,我們可以單獨給 st 使用者配置設定 r-x 權限,而無需給 st 使用者設定任何身份。

同樣的道理,也可以給使用者組設定 ACL 權限,例如:

[[email protected] /]# groupadd tgroup2

#添加新群組

[[email protected] /]# setfacl -m g:tgroup2:rwx project

#為組tgroup2紛配ACL權限

[[email protected] /]# ll -d project

drwxrwx—+ 2 root tgroup 4096 1月19 04:21 project

#屬組并沒有更改

[[email protected] /]# getfacl project

#file: project

#owner: root

#group: tgroup

user::rwx

user:st:r-x

group::rwx

group:tgroup2:rwx <-使用者組tgroup2擁有了rwx權限

mask::rwx

other::—

setfacl -d:設定預設 ACL 權限

既然已經對 project 目錄設定了 ACL 權限,那麼,如果在這個目錄中建立一些子檔案和子目錄,這些檔案是否會繼承父目錄的 ACL 權限呢?執行以下指令進行驗證:

[[email protected] /]# cd project

[[email protected] project]# touch abc

[[email protected] project]# mkdir d1

#在/project目錄中建立了abc檔案和d1目錄

[[email protected] 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 權限。這說明,後建立的子檔案或子目錄,并不會繼承父目錄的 ACL 權限。

當然,我們可以手工給這兩個檔案配置設定 ACL 權限,但是如果在目錄中再建立檔案,都要手工指定,則顯得過于麻煩。這時就需要用到預設 ACL 權限。

預設 ACL 權限的作用是,如果給父目錄設定了預設 ACL 權限,那麼父目錄中所有建立的子檔案都會繼承父目錄的 ACL 權限。需要注意的是,預設 ACL 權限隻對目錄生效。

例如,給 project 檔案設定 st 使用者通路 rx 的預設 ACL 權限,可執行如下指令:

[[email protected] /]# setfacl -m d:u:st:rx project

[[email protected] 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::—

[[email protected] /]# cd project

[[email protected] project]# touch bcd

[[email protected] project]# mkdir d2

#建立子檔案和子目錄

[[email protected] 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 權限,可直接使用 setfacl -k 指令删除。例如:

[[email protected] /]# setfacl -k project

通過此指令,即可删除 project 目錄的預設 ACL 權限,讀者可自行通過 getfacl 指令檢視。

setfacl -R:設定遞歸 ACL 權限

遞歸 ACL 權限指的是父目錄在設定 ACL 權限時,所有的子檔案和子目錄也會擁有相同的 ACL 權限。

例如,給 project 目錄設定 st 使用者通路權限為 rx 的遞歸 ACL 權限,執行指令如下:

[[email protected] project]# setfacl -m u:st:rx -R project

[[email protected] 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 權限;遞歸 ACL 權限指的是針對父目錄中已經存在的所有子檔案和子目錄會繼承父目錄的 ACL 權限。

setfacl -x:删除指定的 ACL 權限

使用 

setfacl -x

 指令,可以删除指定的 ACL 權限,例如,删除前面建立的 st 使用者對 project 目錄的 ACL 權限,執行指令如下:

[[email protected] /]# setfacl -x u:st project

#删除指定使用者和使用者組的ACL權限

[[email protected] /]# getfacl project

# file:project

# owner: root

# group: tgroup

user::rwx

group::rwx

group:tgroup2:rwx

mask::rwx

other::—

#st使用者的權限已被删除

setfacl -b:删除指定檔案的所有 ACL 權限

此指令可删除所有與指定檔案或目錄相關的 ACL 權限。例如,現在我們删除一切與 project 目錄相關的 ACL 權限,執行指令如下:

[[email protected] /]# setfacl -b project

#會删除檔案的所有ACL權限

[[email protected] /]# getfacl project

#file: project

#owner: root

# group: tgroup

user::rwx

group::rwx

other::—

#所有ACL權限已被删除

推薦學習路線:Linux fdisk指令建立邏輯分區

繼續閱讀