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