Docker容器技術(shù)發(fā)展如火如荼,相關(guān)的安全技術(shù)也在不斷往前推進。我們也在繼續(xù)探索容器技術(shù)應(yīng)用與安全的問題,這個主題從傳統(tǒng)安全角度出發(fā),希望能給大家?guī)硪恍┧伎己陀懻摗?/p>
從傳統(tǒng)的角度看,安全不單單是一個技術(shù)性的問題,更是一個意識的問題。
在云時代,服務(wù)上云已經(jīng)非常普遍。而安全滲透攻擊技術(shù)的自動化程度也到了很高水平,受攻擊的目標(biāo)變多,同時攻擊者技術(shù)手段變高,使我們云端服務(wù)的安全環(huán)境變的不可預(yù)測。
按傳統(tǒng)的云端部署方式,比如云臺服務(wù)器+數(shù)據(jù)庫+web+nginx模式,當(dāng)出現(xiàn)安全告警時, 我們可以按部就班,升級內(nèi)核、打補丁、升級服務(wù)等,基本上一切從容。
當(dāng)我們將容器技術(shù)應(yīng)用到部署運維時,打包遷移都是圍繞docker, image,這種方式避免了我們在復(fù)制運行環(huán)境時發(fā)生漂移。而在沒有處理慣例或者指引的情況下出現(xiàn)安全告警時,這種新的方式帶來了新的安全性挑戰(zhàn)。
傳統(tǒng)攻擊目標(biāo)我們把它看成一個城池或城堡,容器是城池里的房間。傳統(tǒng)方式通過信息收集、漏洞發(fā)現(xiàn)、滲透入侵等階段進行系統(tǒng)滲透。
而從容器角度,從房間里邊探知里面的信息,這些信息跟城池本身有一定的關(guān)聯(lián)性或者是相似形,從而獲取整個系統(tǒng)結(jié)構(gòu)的秘密。
在滲透行為進行的過程中,漏洞對于后續(xù)的入侵過程尤為重要。反過來,對企業(yè)來說如何及時發(fā)現(xiàn)和處理系統(tǒng)漏洞是服務(wù)安全的重要部分。
無論是哪種漏洞類型,總會有一個生效周期。產(chǎn)品發(fā)布后,滲透人員發(fā)現(xiàn)漏洞,到提交漏洞庫,或者0day無補丁漏洞。
廠商被通知或自行發(fā)現(xiàn)后進行補丁升級,然后是用戶升級,更新軟件或鏡像,最后修補完成。從滲透人員發(fā)現(xiàn)漏洞到廠商升級并發(fā)布補丁,這段時間屬于0day, 危害較大。
對應(yīng)廠商升級,傳統(tǒng)方式和容器有些不同,傳統(tǒng)廠商,對相應(yīng)服務(wù)維護升級比較及時,安全性較高。但對容器來說,限于基礎(chǔ)鏡像安全性,鏡像來源也不同,現(xiàn)階段對鏡像的維護升級水平也參差不齊,安全性不可預(yù)測。
從全局策略來說,我覺得這一點是容器安全性受質(zhì)疑的一個重要原因。
大概看一下國外牛人做的一些統(tǒng)計,說Docker Hub上官方的容器鏡像有超過30%的數(shù)量,包含高風(fēng)險的安全漏洞,其中有ssh的heartbleed和 bash破殼漏洞。如果對普通用戶提交的鏡像,這個比例超過40%,抽樣誤差在3%。
這些數(shù)據(jù),是把這些鏡像部署上,然后用腳本和公共漏洞數(shù)據(jù)庫 CVE (Common Vulnerabilities and Exposures)對比查找出來的,這些CVE在相應(yīng)的庫里已經(jīng)評級了,high,Medium,low。
第一組數(shù)據(jù)看起來還是很可怕的,因為高風(fēng)險的鏡像還是人們經(jīng)常下載的鏡像。然后第二組今年創(chuàng)建的image高危的鏡像到40%,高危和中等能到75%,這個也可能是因為今年Docker活躍用戶突增,鏡像push數(shù)量大漲,并且鏡像安全質(zhì)量良莠不齊。最后一組是標(biāo)有l(wèi)atest的,是image最近更新版,降了不少,這個也是說版本更新會解決一些問題。同時也是給我們提示,鏡像最好用latest的,同時經(jīng)常更新。
這個圖是統(tǒng)計了非官方的鏡像所用的package的數(shù)量對比,從這個圖上看到排前三的是bash apt openssl , 這個估計是由于很多鏡像用ubuntu基礎(chǔ)鏡像來的,也就是為什么鏡像的漏洞里 bash ssh的占得比例比較大的原因。
列舉幾個近期的CVE
這幾個是docker本身的問題,1.6.1版本的漏洞,基本上屬于提權(quán)漏洞,只要通過精心設(shè)計的鏡像就能夠exploit。
除了這些CVE,Docker使用過程中也存在一些安全隱患。比如磁盤限額問題,docker本身沒有這個功能,如果多租戶模式下,某一個應(yīng)用把磁盤給沾滿了,消耗盡了,會嚴(yán)重影響其他容器應(yīng)用的運行,需要通過輔助手段來解決。再就是超級權(quán)限—privileged, 它會賦予容器所有主機的root能力同時掛載所有設(shè)備。大家都知道,一般情況下不推薦使用。
我們需要看一下Docker本身的安全機制。Docker 本身使用內(nèi)核的安全機制,包括Capability,Namespace, Cgroups。而SELinux/appArmor屬于訪問控制系列。
Capability用于限制容器所擁有的能力,也就是執(zhí)行某些系統(tǒng)操作的權(quán)限,也可以根據(jù)需要對容器的能力進行增減。Namespace為每個容器提供隔離的系統(tǒng)運行環(huán)境,包括pid, network, uts, ipc, mount。Cgroup主要用于對容器所使用的資源進行限制,包括cpu,memory。技術(shù)措施上,對權(quán)限和資源進行限制,用cap-drop的方式來削減能力,利用cgroup來為容器添加cpu,和memory限制。這些對Docker比較了解的用戶來說,應(yīng)該耳熟能詳了。
通過這些安全機制與參數(shù)設(shè)置,我們對docker本身能有一個基本的安全操控。Docker社區(qū)也在為自身的安全不斷的努力。
首先,在開源社區(qū),為代碼貢獻者指定了代碼提交的指導(dǎo)原則,在開發(fā)過程中減少bug和漏洞,提高產(chǎn)品質(zhì)量。同時定期對產(chǎn)品進行滲透測試,及時審計安全漏洞。并開放了相應(yīng)平臺,鼓勵安全滲透人員提交漏洞。官方也提供了檢測工具,專門為docker的部署運行環(huán)境做安全風(fēng)險初評。
Docker Bench For Security是集成腳本,基本上會從幾大方面進行初步檢測:
1 - Host Configuration docker檢測分區(qū)位置,內(nèi)核版本等是否符合標(biāo)準(zhǔn)
2 - Docker Daemon Configuration 檢測Daemon配置,device driver, registry, TLS驗證等
3 - Docker Daemon Configuration Files 檢測相關(guān)文件權(quán)限
4 - Container Images and Build Files 容器用戶檢查,建議非root
5 - Container Runtime 容器SELinux/appArmor配置,資源限制及文件掛載權(quán)限等
6 - Docker Security Operations 其他安全選項
對于鏡像image,Docker1.8.0版本提供了Docker Content Trust,允許在Docker Hub上下載container images之前檢查其合法性。主要是用兩個key,進行簽名和驗證,防止Image被中間篡改。
我認(rèn)為對于使用者來說,應(yīng)對容器安全問題,應(yīng)該具有傳統(tǒng)的安全思維同時采用新的技術(shù)手段。
除了上文中的具體安全設(shè)置,對于容器應(yīng)用來說,策略上同樣是三方面來實施:1.定期滲透測試,安全審計(同docker社區(qū)做法));2. 盡量采用image的正規(guī)鏡像來源,相對于傳統(tǒng)安全,容器安全受質(zhì)疑很大程度上是在于鏡像的維護及升級,因此在鏡像源頭保證安全和及時更新;3.及時升級容器服務(wù),比如采用rollingupdate的方式對跑服務(wù)的容器進行升級等方式。
最后,雖然在安全上仍然存在問題,但我們看到,docker在開源社區(qū)的關(guān)注度、活躍度很高,貢獻者也很多,大家群策群力,眾人拾柴的情況下,docker容器技術(shù)的發(fā)展必然會越來越完善。存在的問題也會被逐步克服。
隨著這項技術(shù)逐漸被大眾接受并應(yīng)用,云端容器應(yīng)用逐漸會更廣泛,再加上滲透安全人員對docker也慢慢熟悉,在未來一段時間內(nèi),docker的安全問題會有一個集中突增的時間。但隨后docker進步與升級,再加上鏡像安全機制的完善,安全問題也會隨之慢慢減少。
Q&A精選:
1. 有沒有可能做鏡像安全性檢測?至少基礎(chǔ)類鏡像。
答:恩,這個后面會提到,安全監(jiān)測是應(yīng)該的。
2. Docker Bench For Security是針對docker1.6的安全審計做的工具,不知道有沒更新?
答:貌似更新了。當(dāng)然,這些僅僅是對于docker的運行環(huán)境配置參數(shù)等進行的安全初評。要想對整個自身的系統(tǒng)服務(wù)進行檢測,要用專用的滲透工具。
3. private registry 如何接入認(rèn)證系統(tǒng)?現(xiàn)在只是在nginx上配了認(rèn)證?
答:我們是docker index,不是nginx認(rèn)證??梢钥纯次覀冊?1CTO學(xué)院上的視頻課程《深入淺出Docker Registry實戰(zhàn)》。
4. 有沒有很好的認(rèn)證機制?
答:公開的鏡像可以任意pull,除了程序自動驗證,解析dockerfile能知道來源。
5. 內(nèi)核及軟件安全的問題是普遍的問題,主動權(quán)不在docker手上
答:對,所以docker的態(tài)度就是,我把我的代碼質(zhì)量把好關(guān),時常給自己體檢。而鏡像問題就用策略防御。