任何理性的企業(yè)都希望能在容器上運(yùn)行關(guān)鍵任務(wù)型服務(wù),但他們會(huì)有這樣的疑問(wèn):“容器真的安全嗎?我們真的可以把數(shù)據(jù)和應(yīng)用程序放心地交給容器嗎?”
在技術(shù)人員當(dāng)中,這常常導(dǎo)致容器與虛擬機(jī)之爭(zhēng),并討論虛擬機(jī)中的虛擬機(jī)管理程序?qū)犹峁┑谋Wo(hù)。雖然這可能是一種有趣而翔實(shí)的討論,但容器與虛擬機(jī)這種對(duì)立本身就是錯(cuò)的;有關(guān)方應(yīng)在虛擬機(jī)里面運(yùn)行容器,目前這一幕出現(xiàn)在大多數(shù)云提供商身上。一個(gè)顯著的例外是來(lái)自Joyent的Triton,它使用SmartOS Zones,確保租戶(hù)相互隔離。還有一個(gè)日益壯大的社區(qū)認(rèn)為,Linux上的容器安全和隔離已得到了長(zhǎng)足的改進(jìn),用戶(hù)可以使用裸機(jī)容器服務(wù),而不是使用虛擬機(jī),實(shí)現(xiàn)隔離。比如說(shuō),IBM在Bluemix公共云服務(wù)上構(gòu)建了一種托管的容器服務(wù),該服務(wù)運(yùn)行時(shí)租戶(hù)之間虛擬機(jī)并不隔離。
為了保持容器的靈活性?xún)?yōu)勢(shì),多個(gè)容器在每個(gè)虛擬機(jī)里面運(yùn)行。關(guān)注安全的企業(yè)可以使用虛擬機(jī),隔離在不同安全級(jí)別下運(yùn)行的容器。比如說(shuō),可以安排處理計(jì)費(fèi)信息的容器在不同于留給面向用戶(hù)型網(wǎng)站的節(jié)點(diǎn)的節(jié)點(diǎn)上運(yùn)行。值得關(guān)注的是,包括Hyper、英特爾和VMware在內(nèi)的幾家公司正致力于構(gòu)建速度飛快的基于虛擬機(jī)的框架,這些框架實(shí)施了Docker API,試圖把容器工作流程的速度與虛擬機(jī)管理程序的安全性結(jié)合起來(lái)。
一旦我們改用容器并不意味著放棄虛擬機(jī)管理程序提供的已確立、得到驗(yàn)證的安全性,下一步就是調(diào)查,可以通過(guò)使用容器和基于容器的工作流程實(shí)現(xiàn)安全的增益。
安全工作流程
在典型的工作流程中,一旦開(kāi)發(fā)人員完成了某項(xiàng)功能,就會(huì)推送到持續(xù)集成(CI)系統(tǒng),該系統(tǒng)將構(gòu)建和測(cè)試鏡像。然后,鏡像被推送到注冊(cè)中心(registry)?,F(xiàn)在鏡像準(zhǔn)備部署到生產(chǎn)環(huán)境,這通常需要一種編排系統(tǒng),比如Docker的內(nèi)置編排工具、Kubernetes和Mesos等。一些企業(yè)可能在推送到生產(chǎn)環(huán)境之前改而推送到登臺(tái)環(huán)境。
圖1:在容器工作流程中,開(kāi)發(fā)人員將變更內(nèi)容推送到擁有測(cè)試組件的持續(xù)集成系統(tǒng)。簽名的鏡像將移到注冊(cè)中心,它在這里可以部署到生產(chǎn)環(huán)境。
遵循安全最佳實(shí)踐的系統(tǒng)會(huì)擁有下列功能和屬性:
·鏡像起源:安全標(biāo)簽系統(tǒng)落實(shí)到位,負(fù)責(zé)識(shí)別生產(chǎn)環(huán)境中運(yùn)行的容器到底確切地來(lái)自哪里。
·安全掃描:鏡像掃描工具自動(dòng)檢查所有鏡像,查找已知漏洞。
·審查:生產(chǎn)環(huán)境定期接受審查,確保所有容器都基于最新的容器,主機(jī)和容器都得到了安全配置。
·隔離和最低權(quán)限:使用最少資源和最低權(quán)限運(yùn)行的容器需要高效運(yùn)行。它們不能對(duì)主機(jī)或其他容器造成不當(dāng)?shù)母蓴_。
·運(yùn)行時(shí)威脅檢測(cè)和響應(yīng):這種功能檢測(cè)運(yùn)行時(shí)環(huán)境中的容器化應(yīng)用程有沒(méi)有活躍威脅,并自動(dòng)采取響應(yīng)措施。
·訪(fǎng)問(wèn)控制:AppArmor或SELinux等Linux安全模塊用來(lái)執(zhí)行訪(fǎng)問(wèn)控制。
鏡像起源
企業(yè)要認(rèn)真對(duì)待運(yùn)行的軟件,尤其是生產(chǎn)環(huán)境中的軟件。避免運(yùn)行過(guò)期、易受攻擊的軟件,或避免已受到某種破壞或篡改的軟件,這點(diǎn)至關(guān)重要。由于這個(gè)原因,能夠識(shí)別和驗(yàn)證任何容器的來(lái)源,包括誰(shuí)構(gòu)建了容器,它到底在運(yùn)行哪個(gè)版本的代碼,這很重要。
鏡像起源的黃金標(biāo)準(zhǔn)是Docker Content Trust(https://docs.docker.com/engine/security/trust/content_trust/)。啟用Docker Content Trust后,一個(gè)數(shù)字簽名被添加到鏡像,然后鏡像被推送到注冊(cè)中心。獲取鏡像時(shí),Docker Content Trust會(huì)驗(yàn)證簽名,從而確保鏡像來(lái)自相應(yīng)的企業(yè),確保鏡像內(nèi)容完全符合被推送的鏡像。這確保攻擊者沒(méi)有篡改鏡像,無(wú)論在傳送過(guò)程中,還是存儲(chǔ)在注冊(cè)中心時(shí)。Docker Content Trust還通過(guò)實(shí)施更新框架(TUF),可以預(yù)防其他更先進(jìn)的攻擊,比如回滾攻擊和凍結(jié)攻擊。
撰寫(xiě)本文時(shí),Docker Content Trust得到了Docker Hub、Artifactory和Docker Trusted Registry(目前處于實(shí)驗(yàn)階段)的支持??梢杂肈ocker Content Trust來(lái)搭建開(kāi)源的專(zhuān)用注冊(cè)中心,但是這還需要搭建一臺(tái)Notary服務(wù)器(欲知詳情,請(qǐng)參閱這些說(shuō)明:https://docs.docker.com/engine/security/trust/content_trust/)。
要是沒(méi)有Docker Content Trust,仍可以使用摘要(digest)來(lái)驗(yàn)證鏡像起源,摘要就是鏡像內(nèi)容的密碼散列。鏡像被推送后,Docker客戶(hù)機(jī)返回表示鏡像摘要的一個(gè)字符串(比如sha256:45b23dee08af5e43a7fea6c4cf9c25ccf269ee113168c19722f87876677c5cb2)。然后,這個(gè)摘要可用于獲取鏡像。只要以這種方式獲取鏡像,Docker就會(huì)驗(yàn)證摘要與鏡像匹配。不像標(biāo)記,摘要總是會(huì)指向同一個(gè)鏡像;鏡像的任何更新都會(huì)導(dǎo)致新的摘要生成。使用摘要存在的問(wèn)題是,企業(yè)需要搭建一個(gè)專(zhuān)有系統(tǒng),用于自動(dòng)提取并分發(fā)摘要。
還需要明確來(lái)自第三方的鏡像的起源,無(wú)論它們直接使用,還是用作基本鏡像。使用Docker Hub時(shí),所有“官方”鏡像已得到Docker的審核,附有內(nèi)容信任信息,應(yīng)該被視為是最安全的Hub鏡像。使用其他鏡像應(yīng)謹(jǐn)慎行事,不過(guò)要注意:“自動(dòng)化構(gòu)建的鏡像”連接到構(gòu)建所使用的源代碼,應(yīng)該被認(rèn)為比普通的用戶(hù)鏡像更值得信賴(lài)。企業(yè)應(yīng)考慮自行從源代碼構(gòu)建鏡像,而不是從不可信的庫(kù)來(lái)獲取。由于Docker Store(https://store.docker.com)的出現(xiàn),這種情況目前在發(fā)生一點(diǎn)變化。Store將為發(fā)布者提供一個(gè)可信賴(lài)的商店,運(yùn)作方式如同蘋(píng)果的應(yīng)用程序商店。
安全掃描
Docker鏡像的安全掃描是幾家公司提供的一項(xiàng)新服務(wù)?;鞠敕ê芎?jiǎn)單:拿來(lái)Docker鏡像后,將鏡像包含的軟件與已知安全漏洞列表相互對(duì)照,為鏡像出具一份“健康證明”。基于這些信息,企業(yè)隨后就可以采取行動(dòng),緩解安全漏洞。
目前的產(chǎn)品包括紅帽的Atomic Scan、IBM的Bluemix Vulnerability Advisor、CoreOS的Clair、 Docker公司的Docker Security Scanning、Aqua Security的Peekr以及Twistlock Trust。無(wú)論工作方式、訪(fǎng)問(wèn)方式還是成本,它們都大不一樣。一個(gè)關(guān)鍵的區(qū)別在于掃描工具識(shí)別安裝在鏡像中的軟件的方式。
包括Clair在內(nèi)的一些掃描工具會(huì)質(zhì)詢(xún)軟件包管理器(比如Debian和Ubuntu上的Apt),以查找已安裝的軟件,但是這對(duì)通過(guò)打包軟件(tarball)安裝的軟件來(lái)說(shuō)行不通;如果掃描工具無(wú)法識(shí)別軟件包管理器,也行不通。相比之下,Docker Security Scanning對(duì)鏡像執(zhí)行二進(jìn)制代碼層面的分析;無(wú)論是什么軟件包管理器,這種方法都適用,還能識(shí)別靜態(tài)鏈接庫(kù)的版本。Twistlock也值得關(guān)注,原因在于它可以對(duì)通過(guò)打包文件安裝的軟件執(zhí)行掃描,漏洞掃描能夠發(fā)現(xiàn)零日攻擊,并且可在嚴(yán)加隔離的環(huán)境下工作。
考慮安全掃描如何整合到你的系統(tǒng)中至關(guān)重要。Docker Security Scanning可作為Docker Cloud和Docker Datacenter的一個(gè)組成部分,而不是作為一項(xiàng)獨(dú)立服務(wù)。其他提供商提供應(yīng)用程序接口(API),允許整合到現(xiàn)有的CI系統(tǒng)和定制工作流程中。一些掃描工具可安裝在本地環(huán)境,這對(duì)要求所有軟件都放在內(nèi)部的企業(yè)來(lái)說(shuō)很重要。
一旦你已整合了安全掃描服務(wù),首先想到的可能是全面禁止存在安全漏洞的任何鏡像在生產(chǎn)環(huán)境中運(yùn)行。遺憾的是,你很可能會(huì)發(fā)現(xiàn),你的大多數(shù)鏡像存在一些漏洞,全面禁止在現(xiàn)實(shí)中不是一個(gè)辦法。比如說(shuō),Ubuntu向來(lái)以迅速更新鏡像而著稱(chēng),但是在撰寫(xiě)本文時(shí),由于使用的Perl版本,16.04基本鏡像隨帶一個(gè)重大的安全漏洞(其他大多數(shù)鏡像存在的問(wèn)題多得多)。因此你可能會(huì)發(fā)現(xiàn),需要逐個(gè)調(diào)查發(fā)現(xiàn)的漏洞,確定它們是不是果真對(duì)系統(tǒng)構(gòu)成了重大風(fēng)險(xiǎn)。
如果使用去除了不必要軟件的輕量級(jí)容器,就可以大大緩解這種情況。要做到這一點(diǎn),最簡(jiǎn)單的方法就是,使用非常小巧的基本鏡像,比如Alpine,大小只有5MB。另一種有點(diǎn)極端的方法就是,構(gòu)建靜態(tài)鏈接二進(jìn)制代碼,然后把代碼拷貝到“空空如也”的鏡像上。這樣一來(lái),根本不存在操作系統(tǒng)層面的漏洞。這種方法的主要缺點(diǎn)是,構(gòu)建和調(diào)試變得復(fù)雜許多,甚至沒(méi)有外殼可用。
對(duì)業(yè)界的安全人士來(lái)說(shuō),自動(dòng)化掃描向前邁出了一大步。它迅速發(fā)現(xiàn)潛在風(fēng)險(xiǎn),并對(duì)廠(chǎng)商施壓、要求及時(shí)給易受攻擊的基本鏡像打補(bǔ)丁。通過(guò)關(guān)注掃描結(jié)果、迅速反應(yīng),企業(yè)才能比許多潛在的攻擊者領(lǐng)先一步。
審查
緊隨安全掃描和鏡像起源的就是審查。我們希望能夠隨時(shí)看到哪些鏡像在生產(chǎn)環(huán)境下運(yùn)行,它們?cè)谶\(yùn)行哪個(gè)版本的代碼。尤其是,識(shí)別哪些容器在運(yùn)行過(guò)期、可能易受攻擊的鏡像很重要。
使用容器時(shí),強(qiáng)烈建議遵循有時(shí)所謂的“黃金鏡像”方法:別給運(yùn)行中的容器打補(bǔ)丁,而是把它們換成運(yùn)行更新后代碼的新容器――藍(lán)綠部署和滾動(dòng)升級(jí)可以用來(lái)避免停機(jī)。使用這種方法,只要查看構(gòu)建所用的鏡像,就可以審查數(shù)量眾多的運(yùn)行中的容器。Docker diff之類(lèi)的工具可用來(lái)驗(yàn)證容器文件系統(tǒng)沒(méi)有偏離底層鏡像。
請(qǐng)注意:在部署鏡像之前掃描鏡像還不夠。新的漏洞報(bào)告后,之前擁有健康證明的鏡像會(huì)變得已知易受攻擊。因此,不斷掃描生產(chǎn)環(huán)境中運(yùn)行的所有鏡像很重要。是否需要深入的重新掃描,這取決于具體使用的掃描解決方案;掃描工具可以列出鏡像已掃描的軟件,并迅速拿來(lái)與新的漏洞作一比較。
審查基于容器的系統(tǒng)下的主機(jī)仍然很重要,但是如果運(yùn)行極簡(jiǎn)發(fā)行版,比如CoreOS、Red Hat Atomic或Ubuntu Snappy,可以簡(jiǎn)化這一步,這類(lèi)發(fā)行版被設(shè)計(jì)成可運(yùn)行容器,所含的需要審查的軟件比較少。另外,Docker Bench for Security等工具可用于核查配置,Aqua Security和Twistlock都提供了審查主機(jī)和配置的解決方案。
隔離和最低權(quán)限
容器的一大安全好處就是添加了隔離方面的工具。容器的工作原理是,構(gòu)建一種在文件系統(tǒng)、網(wǎng)絡(luò)和進(jìn)程方面有著不同世界觀(guān)(即獨(dú)立命名空間)的系統(tǒng)。另外,控制組(cgroup)用于控制對(duì)處理器和內(nèi)存等資源訪(fǎng)問(wèn)的級(jí)別。此外,可以通過(guò)Linux功能和seccomp,控制容器做出的Linux內(nèi)核調(diào)用。
信息安全領(lǐng)域的基本概念之一是最低權(quán)限原則,這個(gè)原則最初是這樣闡述的:
“系統(tǒng)的每一個(gè)程序和每一個(gè)特權(quán)用戶(hù)都應(yīng)該使用完成工作所必需的最低權(quán)限來(lái)操作。” —Jerome Saltzer
就容器而論,這意味著每個(gè)容器應(yīng)該以有效操作所需的最低權(quán)限來(lái)運(yùn)行。運(yùn)用這個(gè)原則使攻擊者的日子難過(guò)得多;即使發(fā)現(xiàn)了某個(gè)容器的漏洞,攻擊者也很難有效地利用弱點(diǎn)。如果容器無(wú)法訪(fǎng)問(wèn)易受攻擊的特性,它就不會(huì)被壞人利用。
一個(gè)有效而簡(jiǎn)單的安全措施就是運(yùn)行擁有只讀文件系統(tǒng)的容器。在Docker中,只要將–read-only標(biāo)志傳遞給docker run,就能做到這一點(diǎn)。這一步落實(shí)到位后,利用漏洞的任何攻擊者會(huì)發(fā)現(xiàn)對(duì)系統(tǒng)做手腳困難得多;他們無(wú)法將惡意腳本寫(xiě)入到文件系統(tǒng),也無(wú)法篡改文件內(nèi)容。許多應(yīng)用程序想要寫(xiě)出到文件,但是針對(duì)特定的文件或目錄使用tmpfs(https://docs.docker.com/engine/reference/run/#tmpfs-mount-tmpfs-filesystems)或卷,就可以支持這一點(diǎn)。
限制對(duì)其他資源的訪(fǎng)問(wèn)同樣有效。限制容器可用的內(nèi)存量將防止攻擊者耗用主機(jī)上的所有內(nèi)存,導(dǎo)致其他運(yùn)行中的服務(wù)無(wú)內(nèi)存可用。限制處理器和網(wǎng)絡(luò)帶寬可以防止攻擊者運(yùn)行耗用大量資源的進(jìn)程,比如比特幣挖掘或種子文件節(jié)點(diǎn)(Torrent peer)。
在生產(chǎn)環(huán)境中運(yùn)行容器時(shí)最常見(jiàn)的錯(cuò)誤也許是容器以root用戶(hù)的身份來(lái)運(yùn)行。構(gòu)建鏡像時(shí),通常需要root權(quán)限來(lái)安裝軟件、配置鏡像。然而,容器啟動(dòng)時(shí)執(zhí)行的主進(jìn)程不該以root的身份來(lái)運(yùn)行。如果這么做,黑客只要危及進(jìn)程,就會(huì)在容器里面擁有root層面的權(quán)限。最糟糕的是,由于用戶(hù)在默認(rèn)情況下并不使用命名空間,萬(wàn)一攻擊者設(shè)法擺脫容器、進(jìn)入到主機(jī),他們也許能夠?qū)χ鳈C(jī)獲得root層面的全部權(quán)限。
為了防止這種情況,應(yīng)始終確保Dockerfile聲明非特權(quán)用戶(hù),執(zhí)行主進(jìn)程之前切換到該用戶(hù)。自Docker1.10以來(lái),就有支持啟用用戶(hù)命名空間的選項(xiàng),這會(huì)自動(dòng)將容器中的用戶(hù)映射到主機(jī)上的高編號(hào)用戶(hù)。這一招管用,但目前有幾個(gè)缺點(diǎn),包括使用只讀文件系統(tǒng)和卷存在問(wèn)題。許多這些問(wèn)題在Linux社區(qū)的上游得到了解決,因此預(yù)計(jì)在不遠(yuǎn)的將來(lái),用戶(hù)命名空間支持對(duì)更大比例的使用場(chǎng)合而言會(huì)變得更切實(shí)可行。
限制容器所做的內(nèi)核調(diào)用也能顯著減小攻擊面,一方面限制攻擊者能做的破壞,另一方面減小內(nèi)核代碼面臨漏洞的風(fēng)險(xiǎn)。限制權(quán)限的首要機(jī)制是使用Linux功能。Linux定義了約40種功能,它們映射到一組組內(nèi)核調(diào)用。容器運(yùn)行時(shí)環(huán)境(包括rkt和Docker)讓用戶(hù)可以選擇容器應(yīng)以哪些權(quán)限來(lái)運(yùn)行。這些功能映射到約330個(gè)系統(tǒng)調(diào)用,這意味著幾種功能(尤其是SYS_ADMIN)映射到大量調(diào)用。想對(duì)允許哪些內(nèi)核調(diào)用實(shí)行更精細(xì)的控制,Docker現(xiàn)在擁有seccomp支持,用于指定到底可以使用哪些調(diào)用,并隨帶一個(gè)默認(rèn)的seccomp策略,它已證明在緩解Linux內(nèi)核的問(wèn)題方面頗有成效。這兩種方法的主要問(wèn)題就是,要搞清楚你的應(yīng)用程序需要做出的一組最少的內(nèi)核調(diào)用。僅僅以不同級(jí)別的功能來(lái)運(yùn)行、查找故障很有效但很費(fèi)時(shí),可能會(huì)錯(cuò)過(guò)未測(cè)試的部分代碼中的問(wèn)題。
現(xiàn)有工具可能有助于確定應(yīng)用程序使用系統(tǒng)調(diào)用的情況,而不是求助于反復(fù)試錯(cuò)。如果你能借助跟蹤功能(比如strace2elastic)完全演練應(yīng)用程序的代碼路徑,這將報(bào)告容器運(yùn)行過(guò)程中在你的應(yīng)用程序里面使用的系統(tǒng)調(diào)用。
雖然操作系統(tǒng)層面的隔離和實(shí)施最低權(quán)限至關(guān)重要,但隔離還需要與應(yīng)用程序邏輯聯(lián)系起來(lái)。如果不了解在主機(jī)上運(yùn)行的應(yīng)用程序,操作系統(tǒng)層面的隔離可能本身不是很有效。
運(yùn)行時(shí)威脅檢測(cè)和響應(yīng)
不管你在漏洞掃描和容器加固方面的工作做得多好,運(yùn)行時(shí)總會(huì)出現(xiàn)未知的代碼錯(cuò)誤和安全漏洞,會(huì)引起入侵或泄密。這就是為什么為系統(tǒng)添置實(shí)時(shí)威脅檢測(cè)和事件響應(yīng)功能很重要。
相比整體式應(yīng)用程序,容器化應(yīng)用程序明顯來(lái)得更精簡(jiǎn)、不可改變。這就有可能為你的應(yīng)用程序設(shè)定基線(xiàn),其逼真度比傳統(tǒng)的整體式應(yīng)用程序來(lái)得更高。使用該基線(xiàn),你應(yīng)該能夠檢測(cè)實(shí)時(shí)威脅、異常情況和安全隱患,誤報(bào)率低于傳統(tǒng)的異常檢測(cè)系統(tǒng)。
行為基線(xiàn)是2016年黑帽大會(huì)上最熱門(mén)的潮流之一,它是指,安全機(jī)制專(zhuān)注于了解應(yīng)用程序或系統(tǒng)的典型行為,從而識(shí)別異常情況。行為基線(xiàn)的關(guān)鍵是讓設(shè)定基線(xiàn)、持續(xù)監(jiān)控以及檢測(cè)和響應(yīng)盡可能實(shí)現(xiàn)自動(dòng)化。如今,大多數(shù)企業(yè)結(jié)合手動(dòng)勞力和數(shù)據(jù)科學(xué)來(lái)獲得行為基線(xiàn)。然而,由于容器具有瞬時(shí)性,整個(gè)過(guò)程自動(dòng)化顯得尤為重要。
主動(dòng)式響應(yīng)與基線(xiàn)相輔相成。主動(dòng)式反應(yīng)是指一旦檢測(cè)到威脅,如何應(yīng)對(duì)攻擊、泄密或異常情況。響應(yīng)可能有多種不同的形式,比如提醒相關(guān)人員、與企業(yè)故障單系統(tǒng)進(jìn)行聯(lián)系,或者對(duì)系統(tǒng)和應(yīng)用程序采取一些預(yù)先確定的糾正措施。
在容器環(huán)境下,主動(dòng)式響應(yīng)可能意味著執(zhí)行額外的日志,運(yùn)用額外的隔離規(guī)則,動(dòng)態(tài)禁用用戶(hù),甚至積極刪除容器。自動(dòng)化在這里又是關(guān)鍵――執(zhí)行的所有操作不得對(duì)應(yīng)用程序邏輯帶來(lái)負(fù)面影響,比如讓系統(tǒng)處于不一致的狀態(tài),或者干擾非冪等操作。
目前提供這種級(jí)別的運(yùn)行時(shí)威脅檢測(cè)和響應(yīng)的一些產(chǎn)品包括:Aqua Security、Joyent Triton SmartOS、Twistlock和紅帽O(jiān)penShift。隨著越來(lái)越多的關(guān)鍵任務(wù)型應(yīng)用程序遷移到容器,運(yùn)行時(shí)威脅檢測(cè)和響應(yīng)自動(dòng)化對(duì)容器安全而言將越來(lái)越重要。想針對(duì)容器化環(huán)境擴(kuò)展運(yùn)行時(shí)安全體系,唯一的辦法就是能夠關(guān)聯(lián)信息、分析攻陷指標(biāo)、管理取證及響應(yīng)動(dòng)作,而且這一切采用自動(dòng)化方式。
訪(fǎng)問(wèn)控制
Linux內(nèi)核支持在執(zhí)行內(nèi)核調(diào)用之前執(zhí)行策略的安全模塊。兩種最常見(jiàn)的安全模塊就是AppArmor和SELinux,兩者都實(shí)現(xiàn)了所謂的強(qiáng)制訪(fǎng)問(wèn)控制(MAC)。MAC可核查用戶(hù)或進(jìn)程有權(quán)對(duì)某個(gè)對(duì)象(比如文件、套接字或進(jìn)程)執(zhí)行各種操作,比如讀取和寫(xiě)入。訪(fǎng)問(wèn)策略集中定義,而且無(wú)法由用戶(hù)改變。與之形成對(duì)比的則是文件和權(quán)限的標(biāo)準(zhǔn)Unix模式:擁有足夠權(quán)限的用戶(hù)隨時(shí)可以更改,這有時(shí)又叫自由訪(fǎng)問(wèn)控制(DAC)。
SELinux最初由美國(guó)國(guó)家安全局(NSA)開(kāi)發(fā),但現(xiàn)在主要由紅帽開(kāi)發(fā),用在紅帽的發(fā)行版中。雖然使用SELinux確實(shí)另外添加了一道強(qiáng)大的安全層,但用起來(lái)有點(diǎn)難度。一旦啟用SELinux,你會(huì)注意到的頭一件事就是,卷無(wú)法正常工作,需要額外的標(biāo)志來(lái)控制卷的標(biāo)簽。AppArmor很相似,但不如SELinux來(lái)得全面,對(duì)于卷缺乏同樣的控制。默認(rèn)情況下它在Debian和Ubuntu發(fā)行版上已被啟用。
在這兩種情況下,可以制定特殊的策略,以便運(yùn)行特定的容器,比如運(yùn)行Apache或NGINX的Web服務(wù)器策略,允許某些網(wǎng)絡(luò)操作,但是不允許其他各種調(diào)用。理想情況下,所有鏡像都有各自專(zhuān)門(mén)制定的策略,但是制定這類(lèi)策略往往是令人沮喪的過(guò)程,bane等第三方工具有一點(diǎn)幫助。在將來(lái),我們預(yù)計(jì)會(huì)看到與容器如影相隨的集成式安全配置文件,為內(nèi)核調(diào)用、SELinux/AppArmor配置文件和資源需求指定設(shè)置。
進(jìn)一步探討訪(fǎng)問(wèn)控制話(huà)題,有必要指出:有權(quán)運(yùn)行Docker容器的人實(shí)際上擁有該主機(jī)的root權(quán)限――他們可以?huà)燧d和編輯任何文件,或者創(chuàng)建可以拷回到主機(jī)的setuid(一旦執(zhí)行就設(shè)置用戶(hù)ID)二進(jìn)制代碼。在大多數(shù)情況下,這一點(diǎn)完全要注意,但一些企業(yè)希望對(duì)用戶(hù)權(quán)限擁有更細(xì)粒度的控制。為此,企業(yè)可能應(yīng)該考慮使用更高級(jí)的平臺(tái),比如Docker Datacenter和OpenShift,或者是Aqua Security和Twistlock之類(lèi)的工具,添加這類(lèi)控制。
結(jié)論
企業(yè)在實(shí)施基于容器的工作流程或在生產(chǎn)環(huán)境中運(yùn)行容器時(shí),考慮安全至關(guān)重要。安全影響整個(gè)工作流程,需要一開(kāi)始就考慮進(jìn)來(lái)。鏡像起源始于開(kāi)發(fā)人員在筆記本電腦上構(gòu)建、獲取和推送鏡像,然后通過(guò)持續(xù)集成和測(cè)試階段,最后終于容器在生產(chǎn)環(huán)境下運(yùn)行。
容器和黃金鏡像方法帶來(lái)了新的工作方式和新的工具,尤其是鏡像掃描和審查方面。企業(yè)更能夠跟蹤了解生產(chǎn)環(huán)境下運(yùn)行的軟件,而且極容易、極快速地應(yīng)對(duì)安全漏洞。更新后的基本鏡像可以在短短幾分鐘內(nèi)測(cè)試、集成和部署。鏡像簽名證實(shí)了容器的真實(shí)性,確保攻擊者沒(méi)有篡改容器的內(nèi)容。
由于經(jīng)過(guò)驗(yàn)證和簽名的鏡像變得很常見(jiàn),集成式安全配置文件等功能添加以來(lái),未來(lái)會(huì)出現(xiàn)更重要的功能。在今后幾個(gè)月,單單安全優(yōu)點(diǎn)就是企業(yè)向容器遷移的一個(gè)充分理由。
原文標(biāo)題:Assessing the Current State of Container Security 作者:Adrian Mouat