標籤:

關於Docker的幾點安全解析

Docker簡介

Docker是目前非常流行的應用程序執行容器,能夠讓用戶通過創建或者下載鏡像快速部署執行環境,可以在docker hub分享自己的鏡像。與虛擬機相比,docker非常輕量,其架構對比如下。

虛擬機通過添加hypervisor層,虛擬出網卡,內存,CPU等虛擬硬體,再在其上建立guest機。每個guest機都有自己的系統內核。

而docker容器則是通過隔離的方式,將文件系統,進程,設備,網路等資源進行隔離,再對許可權,CPU資源等進行控制,最終讓容器之間互不影響,容器無法影響宿主機。容器與宿主機共享內核,文件系統,硬體等資源。

與虛擬機相比,容器資源損耗要小得多。 同樣的宿主機下,能夠建立容器的數量要比虛擬機多得多。但是虛擬機的安全性要比容器好一些,要從虛擬機突破到宿主機或其他虛擬機,需要先突破hypervisor層,這是極其困難的。 而docker容器與宿主機共享內核,文件系統等資源,更有可能對其他容器,宿主機產生影響。

Docker的安全問題主要可能來源於這三個方面:1. Docker本身的架構與安全機制不完善;2.docker鏡像源污染; 3.docker本身的漏洞。

Docker安全機制

Docker容器與LCX非常相似,它們的安全保障主要來源於三個機制:namespaces,cgroups,capabilities。運行一個新的容器時,docker會為這個容器創建一個命名空間和控制組的集合。

內核命名空間(kernel namespaces)

Kernel namespaces提供最基本的隔離機制。

控制組(contrl groups)

控制組實現資源的統計與限制。這一機制保證每個容器獲得公平的內存,CPU,磁碟I/O分配許可權。 並防止單一的容器通過耗盡某一項資源導致系統崩潰。控制組按照分配權重,競爭的機制對資源進行管理。 如容器A,容器B各分配權重100, 當容器A單獨運行時,最多可佔100%的資源,當A和B同時運行,並都滿負荷運行時,雙方各獲得50%的資源。

如果A分配權重100,B權重50,同時滿負荷運行時,A分配66%資源,B分配33%資源。同時啟動容器時還有選項可對使用的最大資源進行限制。

Capabilities機制(linux kernel capabilities)

傳統的unix許可權分級方式將進程分為兩種級別:超級用戶root的特權級別和普通用戶的非特權級別。特權級別下,內核會省略所有的許可權檢查。

Linux 內核2.2以後將超級用戶的許可權分割成一項項的能力(29項),每項能力都能單獨的開啟或者關閉。比如CAP_NET_ADMIN能力提供了修改系統網路的許可權,進程擁有這個能力就能夠修改系統的網路配置。容器與宿主機共享內核,因此為了保證容器不會擁有超級許可權,docker默認關閉一些容器所不需要的能力,部分關閉的能力如下:

其他一些機制

1. 容器與宿主機共享內核n2. 用戶之間可以通過hub共享鏡像n3. 容器共享docker守護進程的許可權n

可能的攻擊方式

通過對docker構架與安全機制的分析,可以整理出下面這麼一些可能的攻擊方式

1.Docker自身漏洞

Docker作為一款軟體,自然也跟其他軟體一樣,本身實現上會有代碼缺陷。CVE官方記錄docker歷史版本共有9項漏洞。 主要有代碼執行,許可權提升,信息泄露,繞過這幾類。 高危漏洞1個,中危漏洞4個。基本出現在1.6.1及以前的版本中,目前docker最新版本為1.10.2暫未被發現cve漏洞。 因此docker用戶最好將docker升級為最新版本,CVE詳情如下:

List of security vulnerabilities

2. Docker源問題

Docker提供了docker hub可以讓用戶上傳創建的鏡像,以便其他用戶下載,快速搭建環境。但同時也帶來了一些安全問題。下載的鏡像是否被惡意植入後門? 傳輸的過程中鏡像是否會被篡改? 鏡像所搭建的環境是否本身就包含漏洞? 這些問題都與我們在網路上下載軟體所遇到的相同。

黑客上傳惡意鏡像。 如果有黑客在製作的鏡像中植入木馬,後門等惡意軟體,那麼環境從一開始就已經不安全了,後續更沒有什麼安全可言。 通用的軟體可以使用殺毒軟體進行掃描,但是目前的殺毒軟體並沒有能夠很好的支持鏡像的掃描。我們下載的鏡像是否安全除了信任官方以外,我們可能只能夠仔細檢查下載的源是否有後門(比如運行鏡像然後在裡面安裝殺毒軟體掃描),並且確認我們的請求指向官方源。 也許以後會有針對docker鏡像的掃描軟體產生。

鏡像使用有漏洞的軟體。 據一些報告顯示,hub上能下載的鏡像裡面,75%的鏡像都安裝了有漏洞的軟體,所以下載鏡像後,需要檢查裡面軟體的版本信息,對應的版本是否存在漏洞,並及時更新打上補丁。

中間人攻擊篡改鏡像。 鏡像在傳輸過程中可能被篡改,目前新版本的docker已經提供了相應的校驗機制來預防這個問題。

3. Docker架構缺陷與安全機制

由docker本身的架構與機制可能產生的問題,這一攻擊場景主要產生在黑客已經控制了宿主機上的一些容器(或者通過在公有雲上建立容器的方式獲得這個條件),然後對宿主機或其他容器發起攻擊來產生影響。

容器之間的區域網攻擊。 同一主機上的容器之間可以構成區域網,因此針對區域網的ARP欺騙,嗅探,廣播風暴等攻擊方式便可以用上。所以在一個主機上部署多個容器需要合理的配置網路,設置iptable規則。

耗盡資源造成拒絕服務攻擊。 cgroups安全機制就是要防止此類攻擊的,不要為單一的容器分配過多的資源即可避免此類問題。

調用有漏洞的系統調用。 容器與宿主機共享內核,容器可以執行一些系統調用。 如果宿主機的系統調用存在漏洞,容器便可以利用這些系統調用進行提權,進行虛擬機逃逸。要防範此類問題需要及時更新宿主機的系統漏洞,對於不常用的系統調用,禁止容器使用。

通過docker提權。 如果以root許可權運行容器,容器內的root用戶也就擁有了宿主機的root許可權。 盡量不要以root許可權運行容器,docker默認不分配一些能力給容器,不要去分配一些不必要的能力給容器。

未隔離的文件系統。 雖然docker已經對文件系統進行隔離,但是有一些重要的系統文件暫時沒有被隔離,如/sys, /proc/sys, /proc/bus等。 對於這些系統文件需要小心設置許可權,如設置只讀。

一些安全建議

除了docker本身的安全機制,還可以有一些安全措施可以對宿主機進行加固,如SELinux,AppArmor。即使容器逃逸到主機,也可以降低對損害。

docker使用的一些安全建議如下:

註:本文為change原創稿件,未經許可禁止轉載

推薦閱讀:

TAG:Docker | 安全 |