Linux ACL 權(quán)限

在普通權(quán)限中略步,用戶對文件只有三種身份描扯,就是屬主、屬組和其他人纳像;每種用戶身份擁有讀(read)荆烈、寫(write)和執(zhí)行(execute)三種權(quán)限。但是在實(shí)際工作中竟趾,這三種身份實(shí)在是不夠用,我們舉個例子來看看宫峦。

image.png

圖 1 ACL權(quán)限簡介

圖 1 的根目錄中有一個 /project 目錄岔帽,這是班級的項(xiàng)目目錄。班級中的每個學(xué)員都可以訪問和修改這個目錄导绷,老師也需要對這個目錄擁有訪問和修改權(quán)限犀勒,其他班級的學(xué)員當(dāng)然不能訪問這個目錄。需要怎么規(guī)劃這個目錄的權(quán)限呢?應(yīng)該這樣:老師使用 root 用戶贾费,作為這個目錄的屬主钦购,權(quán)限為 rwx;班級所有的學(xué)員都加入 tgroup 組褂萧,使 tgroup 組作為 /project 目錄的屬組押桃,權(quán)限是 rwx;其他人的權(quán)限設(shè)定為 0导犹。這樣這個目錄的權(quán)限就可以符合我們的項(xiàng)目開發(fā)要求了唱凯。

有一天,班里來了一位試聽的學(xué)員 st谎痢,她必須能夠訪問 /project 目錄磕昼,所以必須對這個目錄擁有 r 和 x 權(quán)限;但是她又沒有學(xué)習(xí)過以前的課程节猿,所以不能賦予她 w 權(quán)限票从,怕她改錯了目錄中的內(nèi)容,所以學(xué)員 st 的權(quán)限就是 r-x滨嘱》灞桑可是如何分配她的身份呢?變?yōu)閷僦骶藕ⅲ慨?dāng)然不行先馆,要不 root 該放哪里?加入 tgroup 組躺彬?也不行煤墙,因?yàn)?tgroup 組的權(quán)限是 rwx,而我們要求學(xué)員 st 的權(quán)限是 r-x宪拥。如果把其他人的權(quán)限改為 r-x 呢仿野?這樣一來,其他班級的所有學(xué)員都可以訪問 /project 目錄了她君。

當(dāng)出現(xiàn)這種情況時脚作,普通權(quán)限中的三種身份就不夠用了。ACL 權(quán)限就是為了解決這個問題的缔刹。在使用 ACL 權(quán)限給用戶 st 陚予權(quán)限時球涛,st 既不是 /project 目錄的屬主,也不是屬組校镐,僅僅賦予用戶 st 針對此目錄的 r-x 權(quán)限亿扁。這有些類似于 Windows 系統(tǒng)中分配權(quán)限的方式,單獨(dú)指定用戶并單獨(dú)分配權(quán)限鸟廓,這樣就解決了用戶身份不足的問題从祝。

ACL是Access Control List(訪問控制列表)的縮寫襟己,不過在Linux系統(tǒng)中,ACL用于設(shè)定用戶針對文件的權(quán)限牍陌,而不是在交換路由器中用來控制數(shù)據(jù)訪問的功能(類似于防火墻)擎浴。

開啟ACL權(quán)限

在 CentOS 6.x 系統(tǒng)中 ACL 權(quán)限默認(rèn)是開啟的,不需要手工開啟毒涧。不過贮预,如果你的操作系統(tǒng)不是 CentOS 6.x,那該如何查看 ACL 權(quán)限是否開啟了呢链嘀?可以這樣查看:

[root@localhost ~]# mount
/dev/sda1 on /boot type ext4 (rw)
/dev/sda3 on I type ext4 (rw)
…省略部分輸出…

使用mount命令可以看到系統(tǒng)中已經(jīng)掛載的分區(qū)萌狂,但是并沒有看到ACL權(quán)限的設(shè)置

[root@localhost ~]# dumpe2fs -h /dev/sda3

dumpe2fs是查詢指定分區(qū)文件系統(tǒng)詳細(xì)信息的命令

…省略部分輸出…
Default mount options: user_xattr acl
…省略部分輸出…

其中,dumpe2fs 命令可選的選項(xiàng)及其含義如下:

  • -h:僅顯示超級塊中的信息怀泊,而不顯示磁盤塊組的詳細(xì)信息茫藏;

使用 mount 命令可以査看到系統(tǒng)中已經(jīng)掛載的分區(qū),而使用 dumpe2fs 命令可以査看到這個分區(qū)文件系統(tǒng)的詳細(xì)信息霹琼。大家可以看到务傲,我們的 ACL 權(quán)限是 /dev/sda3 分區(qū)的默認(rèn)掛載選項(xiàng),所以不需要手工掛載枣申。

不過我的 Linux 系統(tǒng)如果沒有默認(rèn)掛載售葡,則可以手工掛載嗎?當(dāng)然可以忠藤,執(zhí)行如下命令:

[root@localhost ~]# mount -o remount, acl /

重新掛載根分區(qū)挟伙,并加入ACL權(quán)限

使用 mount 命令重新掛載,并加入 ACL 權(quán)限模孩。不過使用此命令是臨時生效的尖阔。要想永久生效,需要修改 /etc/fstab 文件榨咐,命令如下:

[root@localhost ~]#vi /etc/fstab
UUID=c2ca6f57-b15c-43ea-bca0-f239083d8bd2 /ext4 defaults, acl 1 1

加入ACL權(quán)限

[root@localhost ~]# mount -o remount /

重新掛載文件系統(tǒng)或重啟系統(tǒng)介却,使修改生效

在你需要開啟 ACL 權(quán)限的分區(qū)行上(也就是說 ACL 權(quán)限針對的是分區(qū)),手工在 defaults 后面加入"块茁,acl"即可永久在此分區(qū)中開啟 ACL 權(quán)限齿坷。

ACL權(quán)限設(shè)置

1) ACL權(quán)限管理命令

我們知道了 ACL 權(quán)限的作用,也知道了如何開啟 ACL 權(quán)限数焊,接下來學(xué)習(xí)如何査看和設(shè)定 ACL 權(quán)限永淌。命令如下:

[root@localhost ~]# getfacle 文件名

查看ACL權(quán)限

[root@localhost ~]# setfacl 選項(xiàng) 文件名

設(shè)定ACL權(quán)限

選項(xiàng):

  • -m:設(shè)定 ACL 權(quán)限。如果是給予用戶 ACL 權(quán)限佩耳,則使用"u:用戶名:權(quán)限"格式賦予仰禀;如果是給予組 ACL 權(quán)限,則使用"g:組名:權(quán)限" 格式賦予蚕愤;
  • -x:刪除指定的 ACL 權(quán)限答恶;
  • -b:刪除所有的 ACL 權(quán)限;
  • -d:設(shè)定默認(rèn) ACL 權(quán)限萍诱。只對目錄生效悬嗓,指目錄中新建立的文件擁有此默認(rèn)權(quán)限;
  • -k:刪除默認(rèn) ACL 權(quán)限裕坊;
  • -R:遞歸設(shè)定 ACL 權(quán)限包竹。指設(shè)定的 ACL 權(quán)限會對目錄下的所有子文件生效;

2) 給用戶和用戶組添加ACL權(quán)限

舉個例子籍凝,就來看看圖 1 中的權(quán)限怎么分配周瞎。我們要求 root 是 /project 目錄的屬主,權(quán)限是 rwx饵蒂;tgroup 是此目錄的屬組声诸,tgroup 組中擁有班級學(xué)員 zhangsan 和 lisi,權(quán)限是 rwx退盯;其他人的權(quán)限是 0彼乌。這時,試聽學(xué)員 st 來了渊迁,她的權(quán)限是 r-x慰照。我們來看具體的分配命令。

[root@localhost ~]# useradd zhangsan
[root@localhost ~]# useradd lisi
[root@localhost ~]# useradd st
[root@localhost ~]# groupadd tgroup

添加需要試驗(yàn)的用戶和用戶組琉朽,省略設(shè)定密碼的過程

[root@localhost ~]# mkdir /project #建立需要分配權(quán)限的目錄
[root@localhost ~]# chown root:tgroup /project/

改變/project目錄的屬主和屬組

[root@localhost ~]# chmod 770 /project/

指定/project目錄的權(quán)限

[root@localhost ~]# ll -d /project/
drwxrwx--- 2 root tgroup 4096 1月19 04:21 /project/

查看一下權(quán)限毒租,已經(jīng)符合要求了

這時st學(xué)員來試聽了,如何給她分配權(quán)限

[root@localhost ~]# setfacl -m u:st:rx /project/

給用戶st賦予r-x權(quán)限箱叁,使用"u:用戶名:權(quán)限" 格式

[root@localhost /]# cd /
[root@localhost /]# ll -d project/
drwxrwx---+ 3 root tgroup 4096 1月19 05:20 project/

使用ls-l査詢時會發(fā)現(xiàn)墅垮,在權(quán)限位后面多了一個"+",表示此目錄擁有ACL權(quán)限

[root@localhost /]# getfacl project

查看/prpject目錄的ACL權(quán)限

file: project <-文件名

owner: root <-文件的屬主

group: tgroup <-文件的屬組

user::rwx <-用戶名欄是空的蝌蹂,說明是屬主的權(quán)限
user:st:r-x <-用戶st的權(quán)限
group::rwx <-組名欄是空的噩斟,說明是屬組的權(quán)限
mask::rwx <-mask權(quán)限
other::--- <-其他人的權(quán)限

大家可以看到,st 用戶既不是 /prpject 目錄的屬主孤个、屬組剃允,也不是其他人,我們單獨(dú)給 st 用戶分配了 r-x 權(quán)限齐鲤。這樣分配權(quán)限太方便了斥废,完全不用先辛苦地規(guī)劃用戶身份了。
我想給用戶組賦予 ACL 權(quán)限可以嗎给郊?當(dāng)然可以牡肉,命令如下:

[root@localhost /]# groupadd tgroup2

添加測試組

[root@localhost /]# setfacl -m g:tgroup2:rwx project/

為組tgroup2紛配ACL權(quán)限,使用"g:組名:權(quán)限"格式

[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權(quán)限
mask::rwx
other::--

3) 最大有效權(quán)限mask

mask 是用來指定最大有效權(quán)限的淆九。mask 的默認(rèn)權(quán)限是 rwx统锤,如果我給 st 用戶賦予了 r-x 的 ACL 權(quán)限毛俏,mj 需要和 mask 的 rwx 權(quán)限"相與"才能得到 st 的真正權(quán)限,也就是 r-x "相與"rwxtj 出的值是 r-x饲窿,所以 st 用戶擁有 r-x 權(quán)限煌寇。

如果把 mask 的權(quán)限改為 r--,和 st 用戶的權(quán)限相與逾雄,也就是 r--"相與"r-x 得出的值是 r--阀溶,st 用戶的權(quán)限就會變?yōu)橹蛔x。大家可以這么理解:用戶和用戶組所設(shè)定的權(quán)限必須在 mask 權(quán)限設(shè)定的范圍之內(nèi)才能生效鸦泳,mask權(quán)限就是最大有效權(quán)限银锻。

不過我們一般不更改 mask 權(quán)限,只要給予 mask 最大權(quán)限 rwx做鹰,那么任何權(quán)限和 mask 權(quán)限相與击纬,得出的值都是權(quán)限本身。也就是說誊垢,我們通過給用戶和用戶組直接賦予權(quán)限掉弛,就可以生效,這樣做更直觀喂走。

補(bǔ)充:邏輯與運(yùn)算的運(yùn)算符是"and"殃饿。可以理解為生活中所說的"并且"芋肠。也就是相與的兩個值都為真乎芳,結(jié)果才為真;有一個值為假帖池,與的結(jié)果就為假奈惑。比如 A 相與 B,結(jié)果入表 2 所示睡汹。

<caption data-reader-unique-id="116" style="max-width: 100%;">表 2 邏輯與運(yùn)算</caption>
| A | B | and |
| 真 | 真 | 真 |
| 真 | 假 | 假 |
| 假 | 真 | 假 |
| 假 | 假 | 假 |

那么兩個權(quán)限相與和上面的結(jié)果類似肴甸,我們以讀(r)權(quán)限為例,結(jié)果如表 3 所示囚巴。

<caption data-reader-unique-id="142" style="max-width: 100%;">表 3 讀權(quán)限相與</caption>
| A | B | and |
| r | r | r |
| r | - | - |

- r -

所以原在,"rwx"相與"r-x",結(jié)果是"r-x"彤叉;"r--"相與"r-x"庶柿,結(jié)果是"r--"。

修改最大有效權(quán)限的命令如下:

[root@localhost /]# setfacl -m m:rx project/

設(shè)定mask權(quán)限為r-x秽浇,使用"m:權(quán)限"格式

[root@localhost /]# getfacl project/

file:project/

owner:root

group:tgroup

user::rwx
group::rwx #effective:r-x
mask::r-x

mask權(quán)限變?yōu)閞-x

other::--

4) 默認(rèn)ACL權(quán)限和遞歸ACL權(quán)限

我們已經(jīng)給 /project 目錄設(shè)定了 ACL 權(quán)限浮庐,那么,在這個目錄中新建一些子文件和子目錄柬焕,這些文件是否會繼承父目錄的 ACL 權(quán)限呢审残?我們試試吧梭域。

[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

這兩個新建立的文件權(quán)限位后面并沒有"+",表示它們沒有繼承ACL權(quán)限

子文件 abc 和子目錄 d1 因?yàn)槭呛蠼⒌奈Γ圆]有繼承父目錄的 ACL 權(quán)限碰辅。當(dāng)然,我們可以手工給這兩個文件分配 ACL 權(quán)限介时,但是如果在目錄中再新建文件,都要手工指定凌彬,則顯得過于麻煩沸柔。這時就需要用到默認(rèn) ACL 權(quán)限。
默認(rèn) ACL 權(quán)限的作用是:如果給父目錄設(shè)定了默認(rèn) ACL 權(quán)限铲敛,那么父目錄中所有新建的子文件都會繼承父目錄的 ACL 權(quán)限褐澎。默認(rèn) ACL 權(quán)限只對目錄生效。命令如下:

[root@localhost /]# setfacl -m d:u:st:rx /project/

使用"d:u:用戶名:權(quán)限"格式設(shè)定默認(rèn)ACL權(quán)限

[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已經(jīng)繼承了父目錄的ACL權(quán)限

大家發(fā)現(xiàn)了嗎伐蒋?原先的 abc 和 d1 還是沒有 ACL 權(quán)限工三,因?yàn)槟J(rèn) ACL 權(quán)限是針對新建立的文件生效的。
再說說遞歸 ACL 權(quán)限先鱼。遞歸是指父目錄在設(shè)定 ACL 權(quán)限時俭正,所有的子文件和子目錄也會擁有相同的 ACL 權(quán)限。

[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權(quán)限

總結(jié)一下:默認(rèn) ACL 權(quán)限指的是針對父目錄中新建立的文件和目錄會繼承父目錄的 ACL 權(quán)限焙畔,格式是"setfacl-m d:u:用戶名:權(quán)限 文件名"掸读;遞歸 ACL 權(quán)限指的是針對父目錄中已經(jīng)存在的所有子文件和子目錄繼承父目錄的 ACL 權(quán)限,格式是"setfacl-m u:用戶名: 權(quán)限 -R 文件名"宏多。

5) 刪除ACL權(quán)限

我們來看看怎么刪除 ACL 權(quán)限儿惫,命令如下:

刪除指定的ACL權(quán)限:

[root@localhost /]# setfacl -x u:st /project/
#刪除指定用戶和用戶組的ACL權(quán)限
[root@localhost /]# getfacl project/
# file:project/
# owner: root
# group: tgroup
user::rwx
group::rwx
group:tgroup2:rwx
mask::rwx
other::--
#st用戶的權(quán)限已被刪除

刪除所有ACL權(quán)限:

[root@localhost /]# setfacl -b project/
#會刪除文件的所有ACL權(quán)限
[root@localhost /]# getfacl project/
#file: project/
#owner: root
# group: tgroup
user::rwx
group::rwx
other::--
#所有ACL權(quán)限已被刪除

關(guān)注微信公眾號「站長嚴(yán)長生」,在手機(jī)上閱讀所有教程伸但,隨時隨地都能學(xué)習(xí)肾请。本公眾號由C語言中文網(wǎng)站長運(yùn)營,每日更新更胖,堅(jiān)持原創(chuàng)铛铁,敢說真話,凡事有態(tài)度函喉。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末避归,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子管呵,更是在濱河造成了極大的恐慌梳毙,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件捐下,死亡現(xiàn)場離奇詭異账锹,居然都是意外死亡萌业,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門奸柬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來生年,“玉大人,你說我怎么就攤上這事廓奕”瘢” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵桌粉,是天一觀的道長蒸绩。 經(jīng)常有香客問我,道長铃肯,這世上最難降的妖魔是什么患亿? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮押逼,結(jié)果婚禮上步藕,老公的妹妹穿的比我還像新娘。我一直安慰自己挑格,他們只是感情好咙冗,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著恕齐,像睡著了一般乞娄。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上显歧,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天仪或,我揣著相機(jī)與錄音,去河邊找鬼士骤。 笑死范删,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的拷肌。 我是一名探鬼主播到旦,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼巨缘!你這毒婦竟也來了添忘?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤若锁,失蹤者是張志新(化名)和其女友劉穎搁骑,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡仲器,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年煤率,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片乏冀。...
    茶點(diǎn)故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡蝶糯,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出辆沦,到底是詐尸還是另有隱情昼捍,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布众辨,位于F島的核電站端三,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏鹃彻。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一妻献、第九天 我趴在偏房一處隱蔽的房頂上張望蛛株。 院中可真熱鬧,春花似錦育拨、人聲如沸谨履。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽笋粟。三九已至,卻和暖如春析蝴,著一層夾襖步出監(jiān)牢的瞬間害捕,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工闷畸, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留尝盼,地道東北人。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓佑菩,卻偏偏與公主長得像盾沫,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子殿漠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容