容器與虛擬機(jī)區(qū)別
由下圖可見,虛擬機(jī)是通過管理系統(tǒng)(Hypervisor)模擬出 CPU、內(nèi)存、網(wǎng)絡(luò)等硬件,然后在這些模擬的硬件上創(chuàng)建客戶內(nèi)核和操作系統(tǒng)。這樣做的好處就是虛擬機(jī)有自己的內(nèi)核和操作系統(tǒng),并且硬件都是通過虛擬機(jī)管理系統(tǒng)模擬出來的,用戶程序無法直接使用到主機(jī)的操作系統(tǒng)和硬件資源,因此虛擬機(jī)也對隔離性和安全性有著更好的保證。
而 Docker 容器則是通過 Linux 內(nèi)核的 Namespace 技術(shù)實(shí)現(xiàn)了文件系統(tǒng)、進(jìn)程、設(shè)備以及網(wǎng)絡(luò)的隔離,然后再通過 Cgroups 對 CPU、內(nèi)存等資源進(jìn)行限制,最終實(shí)現(xiàn)了容器之間相互不受影響,由于容器的隔離性僅僅依靠內(nèi)核來提供,因此容器的隔離性也遠(yuǎn)弱于虛擬機(jī)。

為啥還用容器
既然虛擬機(jī)安全性這么好,為什么我們還要用容器呢?其實(shí)兩者各有利弊,只是在業(yè)務(wù)快速開發(fā)與迭代的今天,容器秒級啟動、性能損耗小,鏡像占用小等特性更加匹配當(dāng)今主流的業(yè)務(wù)場景。
容器存在的安全問題
(1) Docker 自身安全
Docker 作為一款容器引擎,本身也會存在一些安全漏洞,CVE 目前已經(jīng)記錄了多項(xiàng)與 Docker 相關(guān)的安全漏洞,主要有權(quán)限提升、信息泄露等幾類安全問題。(2) 鏡像安全
由于 Docker 容器是基于鏡像創(chuàng)建并啟動,因此鏡像的安全直接影響到容器的安全,具體的安全漏洞有如下:
● 基礎(chǔ)軟件漏洞:由于容器需要安裝基礎(chǔ)的軟件包,如果軟件包存在漏洞,則可能會被不法分子利用并且侵入容器,影響其他容器或主機(jī)安全。
● 鏡像倉庫漏洞:無論是 Docker 官方的鏡像倉庫還是私有鏡像倉庫,都有可能被攻擊和篡改鏡像,當(dāng)我們使用鏡像時,就可能成為攻擊者的目標(biāo)對象。
● 用戶程序漏洞:用戶自己構(gòu)建的軟件包可能存在漏洞或者被植入惡意腳本,這樣會導(dǎo)致運(yùn)行時提權(quán)影響其他容器或主機(jī)安全。
(3) Linux 內(nèi)核隔離性不足
盡管目前 Namespace 已經(jīng)提供了非常多的資源隔離類型,但仍有部分關(guān)鍵內(nèi)容沒有被完全隔離,其中包括一些系統(tǒng)的關(guān)鍵性目錄(如 /sys、/proc 等),這些關(guān)鍵性的目錄可能會泄露主機(jī)上一些關(guān)鍵性的信息,讓攻擊者利用這些信息對整個主機(jī)發(fā)起攻擊;而且一旦內(nèi)核的 Namespace 被突破,攻擊者就有可能直接提權(quán)對主機(jī)造成破壞。(4) 所有容器共享主機(jī)內(nèi)核
由于同一宿主機(jī)上所有容器共享主機(jī)內(nèi)核,所以攻擊者可以利用一些特殊手段導(dǎo)致內(nèi)核崩潰,進(jìn)而導(dǎo)致主機(jī)宕機(jī)影響主機(jī)上其他服務(wù)。
解決容器安全問題
(1) Docker 自身安全性改進(jìn)
在過去容器里的 root 用戶就是主機(jī)上的 root 用戶,如果容器受到攻擊,或者容器本身含有惡意程序,在容器內(nèi)就可以直接獲取到主機(jī) root 權(quán)限。Docker 從 1.10 版本開始,使用User Namespace做用戶隔離,實(shí)現(xiàn)了容器中的 root 用戶映射到主機(jī)上的非 root 用戶,從而大大減輕了容器被突破的風(fēng)險,因此建議盡可能使用最新版 Docker。(2) 保障鏡像安全
為保障鏡像安全,我們可以在私有鏡像倉庫安裝鏡像安全掃描組件,對上傳的鏡像進(jìn)行檢查,通過與 CVE 數(shù)據(jù)庫對比,一旦發(fā)現(xiàn)有漏洞的鏡像及時通知用戶或阻止非安全鏡像繼續(xù)構(gòu)建和分發(fā)。同時為了確保我們使用的鏡像足夠安全,在拉取鏡像時,要確保只從受信任的鏡像倉庫拉取,并且與鏡像倉庫通信一定要使用HTTPS協(xié)議。(3) 加強(qiáng)內(nèi)核安全和管理
宿主機(jī)內(nèi)核盡量安裝最新補(bǔ)丁;使用Capabilities劃分權(quán)限,它實(shí)現(xiàn)了系統(tǒng)更細(xì)粒度的訪問控制;啟動容器時一般不建議開啟特權(quán)模式,如需添加相應(yīng)的權(quán)限可以使用--cap-add參數(shù)。(4) 使用安全加固組件
Linux 的SELinux、AppArmor、GRSecurity組件都是 Docker 官方推薦的安全加固組件,這三個組件可以限制一個容器對主機(jī)的內(nèi)核或其他資源的訪問控制,目前容器報告里的一些安全漏洞。下面說明下這些安全加固組件:
● SELinux:是 Linux 的一個內(nèi)核安全模塊,提供了安全訪問的策略機(jī)制,通過設(shè)置 SELinux 策略可以實(shí)現(xiàn)某些進(jìn)程允許訪問某些文件。
● AppArmor:類似于 SELinux,也是一個 Linux 的內(nèi)核安全模塊,普通的訪問控制僅能控制到用戶的訪問權(quán)限,而 AppArmor 可以控制到用戶程序的訪問權(quán)限。
● GRSecurity:是一個對內(nèi)核的安全擴(kuò)展,可通過智能訪問控制,提供內(nèi)存破壞防御,文件系統(tǒng)增強(qiáng)等多種防御形式。
-
(5) 資源限制
在生產(chǎn)環(huán)境中,建議每個容器都添加相應(yīng)的資源限制,這樣即便應(yīng)用程序有漏洞,也不會導(dǎo)致主機(jī)的資源被耗盡,最大限度降低了安全風(fēng)險。啟動容器時可使用以下相關(guān)的資源限制參數(shù):
--cpus:限制 CPU 配額
--memory:限制內(nèi)存配額
--pids-limit:限制容器的 PID 個數(shù)
### 舉例:
$ docker run -it --cpus=1 --memory=2048m --pids-limit=1000 busybox sh
-
(6) 使用安全容器
容器有著輕便快速啟動的優(yōu)點(diǎn),虛擬機(jī)有著安全隔離的優(yōu)點(diǎn),有沒有一種技術(shù)可以兼顧兩者的優(yōu)點(diǎn),做到既輕量又安全呢?答案是有的,那就是安全容器。
安全容器與普通容器的主要區(qū)別在于,安全容器中的每個容器都運(yùn)行在一個單獨(dú)的微型虛擬機(jī)中,擁有獨(dú)立的操作系統(tǒng)和內(nèi)核,并且有虛擬機(jī)般的安全隔離性。
安全容器目前推薦的技術(shù)方案是Kata Containers,它并不包含一個完整的操作系統(tǒng),只有一個精簡版的 Guest Kernel 運(yùn)行著容器本身的應(yīng)用,可以通過使用共享內(nèi)存來進(jìn)一步減少內(nèi)存的開銷。另外,它還實(shí)現(xiàn)了 OCI 規(guī)范,可以直接使用 Docker 的鏡像啟動 Kata 容器,具有開銷更小、秒級啟動、安全隔離等許多優(yōu)點(diǎn)。
