譯者 | 布加迪
審校 | 重樓
本文介紹了Linux訪問(wèn)控制列表(ACL),它相比標(biāo)準(zhǔn)的Linux權(quán)限提供了更大的靈活性。
經(jīng)常在Linux與微軟Windows之間快速切換的一些人認(rèn)識(shí)到兩者之間根本性的區(qū)別。其中一個(gè)區(qū)別是權(quán)限。標(biāo)準(zhǔn)的Linux權(quán)限非常簡(jiǎn)單:指定一個(gè)用戶(hù)、一個(gè)用戶(hù)組,然后指定其他任何用戶(hù)或用戶(hù)組(稱(chēng)為“others”),并根據(jù)需要授予讀取、寫(xiě)入和執(zhí)行等權(quán)限。Windows的權(quán)限則要復(fù)雜得多,有嵌套、更多的訪問(wèn)級(jí)別和共享(Share)權(quán)限組合。然而從許多方面來(lái)看,Windows權(quán)限在大規(guī)模環(huán)境下更靈活、更實(shí)用。
本文介紹Linux訪問(wèn)控制列表(ACL),它相比標(biāo)準(zhǔn)的Linux權(quán)限提供了更大的靈活性。我將討論為多個(gè)獨(dú)立用戶(hù)和多個(gè)用戶(hù)組查看和配置ACL。你選擇的Linux發(fā)行版很可能已經(jīng)啟用了ACL(ACL實(shí)際上是文件系統(tǒng)的一項(xiàng)功能)。
簡(jiǎn)要回顧標(biāo)準(zhǔn)的Linux權(quán)限
你可以使用chmod命令來(lái)配置標(biāo)準(zhǔn)的Linux權(quán)限。該命令可以設(shè)置以下三種訪問(wèn)級(jí)別的任意組合:讀取、寫(xiě)入和執(zhí)行。你可以將這些訪問(wèn)級(jí)別授予三種身份:
- 用戶(hù)(所有者):擁有文件的一個(gè)用戶(hù)帳戶(hù)(默認(rèn)情況下,這是文件創(chuàng)建者)。
- 用戶(hù)組:在/etc/group文件中顯示的一組用戶(hù)。
- 其他:不是用戶(hù)或指定組成員的任何人。
圖1:ls -l命令顯示標(biāo)準(zhǔn)權(quán)限、所有權(quán)和組關(guān)聯(lián)
對(duì)于用戶(hù)和用戶(hù)組較少的獨(dú)立系統(tǒng)而言,這種方法綽綽有余。然而,在共享系統(tǒng)、啟用了文件共享功能的系統(tǒng)或SSH遠(yuǎn)程訪問(wèn)頻繁的設(shè)備上,這種方法卻變得非常麻煩又笨拙。
這時(shí)候文件系統(tǒng)ACL功能就能派上用場(chǎng)。它允許你配置具有不同訪問(wèn)級(jí)別的多個(gè)用戶(hù)及/或用戶(hù)組。
ACL如何提供幫助?
ACL允許你指定多個(gè)用戶(hù)帳戶(hù),并為它們提供不同的訪問(wèn)級(jí)別。這也意味著你不必將文件的所有權(quán)授予其中一個(gè)用戶(hù)。它為用戶(hù)組提供了同樣的靈活性。
ACL仍然可以識(shí)別讀取、寫(xiě)入和執(zhí)行這三個(gè)標(biāo)準(zhǔn)訪問(wèn)級(jí)別,因此你不必重新學(xué)習(xí)已經(jīng)了解的關(guān)于Linux權(quán)限的所有知識(shí)。實(shí)際上,ACL與標(biāo)準(zhǔn)權(quán)限協(xié)同工作,因此你仍將使用基本的用戶(hù)(u)、用戶(hù)組(g)和其他(o)等身份。你是在補(bǔ)充常規(guī)權(quán)限,而不是替換常規(guī)權(quán)限。
驗(yàn)證你的發(fā)行版支持ACL
今天的現(xiàn)代Linux發(fā)行版通常默認(rèn)情況下支持ACL。ACL是文件系統(tǒng)的一項(xiàng)功能。標(biāo)準(zhǔn)的文件系統(tǒng)是ext4、XFS和Btrfs。它們都支持ACL。
你可能不需要檢查自己的Linux發(fā)行版是否支持ACL,但是如果你想確認(rèn),可以使用以下命令:
tune2fs -l /dev/sda1 | grep -i "Default mount options"
預(yù)計(jì)輸出中會(huì)看到列出的acl。
圖2:tune2fs命令顯示文件系統(tǒng)設(shè)置,包括是否啟用了ACL
注意,如果針對(duì)資源配置了ACL,ls -l輸出將顯示+字符。在下面這個(gè)例子中,ACL被應(yīng)用到file1.txt。
圖3:注意file1.txt的權(quán)限字符串末尾的+字符,表示應(yīng)用了ACL
使用setfacl命令
ACL配置命令是setfacl。它依賴(lài)標(biāo)準(zhǔn)的Linux命令語(yǔ)法:
command -options argument
參數(shù)將是你應(yīng)用訪問(wèn)控制的那個(gè)文件或目錄。
setfacl命令有很多選項(xiàng)。以下列表含有一些最常見(jiàn)的選項(xiàng):
- -m:修改指定的ACL。
- -x:從ACL中刪除條目。
- -b:從ACL中刪除所有條目。
- -d:為特定的目錄配置默認(rèn)ACL。
- -R:對(duì)所有目錄內(nèi)容遞歸應(yīng)用ACL。
然而,setfacl還依賴(lài)其他參數(shù)來(lái)定義新的訪問(wèn)控制是否應(yīng)用于用戶(hù)或用戶(hù)組。
u:<username>
g:<groupname>
如果結(jié)合起來(lái),這些設(shè)置允許管理員實(shí)現(xiàn)極其可靠而實(shí)用的權(quán)限配置。
下面的命令示例簡(jiǎn)要介紹了如何使用setfacl。后面會(huì)介紹更具體的示例。
如果為用戶(hù)django配置ACL,將讀取(r)權(quán)限授予sample.txt資源,請(qǐng)輸入:
setfacl -m u:django:r sample.txt
針對(duì)用戶(hù)組engineering的類(lèi)似示例,如下所示:
setfacl -m g:engineering:r sample.txt
一旦你配置了ACL設(shè)置,需要檢查它們以確保它們是正確的。這時(shí)候getfacl命令就有了用武之地。
使用getfacl命令
用于管理ACL的另一個(gè)相關(guān)命令是getfacl,它可以顯示當(dāng)前的ACL設(shè)置。
基本語(yǔ)法是getfacl和你想要查看的那個(gè)文件或目錄名:
getfacl / dev-projects
然而與大多數(shù)Linux命令一樣,getfacl支持許多有用的選項(xiàng)來(lái)修改輸出。這些包括:
- -c:只顯示ACL條目,并丟棄額外的頭信息。
- -R:遞歸顯示目錄內(nèi)容。
- -t:以更可讀的表格格式顯示輸出。
在審計(jì)或配置訪問(wèn)控制時(shí),使用getfacl檢查ACL設(shè)置。
圖4:getfacl命令顯示標(biāo)準(zhǔn)設(shè)置和ACL設(shè)置
ACL用例
下面你將看到ACL的兩個(gè)用例,包括場(chǎng)景和相關(guān)命令。考慮一下在你的環(huán)境中類(lèi)似的情況會(huì)如何發(fā)生。
場(chǎng)景1
我將從一個(gè)簡(jiǎn)單的示例開(kāi)始入手:sales組對(duì)于/sales目錄需要擁有rwx權(quán)限,marketing組應(yīng)該只有r-x權(quán)限。其他人不需要訪問(wèn)。(請(qǐng)記住,這些組需要執(zhí)行權(quán)限才能cd到目錄中。)
先向銷(xiāo)售組授予標(biāo)準(zhǔn)的rwx權(quán)限:
chown –R : sales /sales
chmod – r 770 /sales
接下來(lái),為marketing組設(shè)置ACL:
setfacl -m g:marketing:r-x /sales
使用getfacl /sales確認(rèn)設(shè)置。
請(qǐng)記住,ACL與標(biāo)準(zhǔn)權(quán)限協(xié)同工作,因此不要忘記使用ls -l命令用于這兩個(gè)系統(tǒng)。除了顯示ACL條目外,getfacl命令還顯示標(biāo)準(zhǔn)權(quán)限。
場(chǎng)景2
想象另一種情況,你需要為不同的用戶(hù)和組授予不同的訪問(wèn)級(jí)別。假設(shè)你有一個(gè)/dev-projects目錄,需要滿(mǎn)足以下要求:
- 所有者:擁有全面訪問(wèn)權(quán)限(rwx)的root。
- 用戶(hù)組:擁有全面訪問(wèn)權(quán)限(rwx)的developers。
- 額外用戶(hù):擁有只讀取訪問(wèn)權(quán)限(r-x)的alex(代碼審閱者)。
- 額外用戶(hù):具有只讀取訪問(wèn)權(quán)限(r-x)的silas(項(xiàng)目經(jīng)理)。
- 額外用戶(hù)組:擁有只讀取訪問(wèn)權(quán)限(r-x)的contract-dev-team。
標(biāo)準(zhǔn)權(quán)限無(wú)法滿(mǎn)足這類(lèi)需求,但ACL可以輕松滿(mǎn)足。
先設(shè)置標(biāo)準(zhǔn)權(quán)限:
chown -R root:developers /dev-projects
chmod - R 770 /dev-projects
接下來(lái),為額外用戶(hù)和用戶(hù)組配置ACL條目:
setfacl -R u:alex:r-x /dev-projects
setfacl -R u:silas:r-x /dev/projects
setfacl -R g:contract-dev-team:r-x /dev/projects
通過(guò)使用getfacl和ls -l顯示設(shè)置來(lái)檢查結(jié)果。
結(jié)語(yǔ)
訪問(wèn)控制列表(ACL)擴(kuò)展了Linux權(quán)限的功能,允許對(duì)不同的用戶(hù)和用戶(hù)組授予不同的訪問(wèn)級(jí)別。雖然這使故障排查起來(lái)變得更復(fù)雜了,但為了增強(qiáng)靈活性是值得的。
ACL功能是文件系統(tǒng)的一項(xiàng)功能。今天的現(xiàn)代文件系統(tǒng)支持ACL,可能已經(jīng)啟用了它。確保創(chuàng)建一種根據(jù)訪問(wèn)需求組織資源、從而有效地利用ACL的目錄基礎(chǔ)設(shè)施。一般來(lái)說(shuō),銷(xiāo)售團(tuán)隊(duì)所需的一切資源都應(yīng)該存在于一個(gè)父目錄中,營(yíng)銷(xiāo)團(tuán)隊(duì)所需的一切資源都存在于另一個(gè)父目錄中。
ACL在大型部署環(huán)境中變得尤為重要,比如支持訪問(wèn)需求各異的許多用戶(hù)和資源的主要文件服務(wù)器。現(xiàn)在仔細(xì)檢查你的大型部署環(huán)境,看看ACL是否有助于更有效地控制資源訪問(wèn)。在排查看似神秘的訪問(wèn)問(wèn)題時(shí),別忘了考慮ACL。
原文標(biāo)題:A Guide to Linux Access Control Lists,作者:Damon M. Garn