nginx Ubuntu java 程序员 google 编程 Python shell linux Windows mysql 开源 Firefox centos apache php Android 微软 wordpress 云计算

Docker生態系統安全性正逐步走向成熟

當面對容器技術時,安全性往往是人們最為關註的問題。開發人員喜愛容器,某些運維人員也對其贊賞有加。但如果使用不當,其是否會帶來安全隱患?我 們熱愛容器方案的各類天然特性,但在安全性方面其是否會同時成為一種短板?在今天的文章中,我希望帶領大家了解一些圍繞容器進行的深度安全保障機制。由於 本文專門針對容器系統,因此我不會拿出篇幅討論主機節點或者通過禁用Linux守護進程減少攻擊面之類的議題。

只讀容器系統(Docker 1.5)

首先,我們可以運行只讀容器系統。通過指定--read-only,容器的rootfs將以只讀方式啟動,這樣容器當中的任意進程都無法對容器本 身進行寫入操作。這意味著當我們由於應用中存在安全漏洞而出現文件上傳行為時,其會由於容器rootfs的只讀屬性而被阻斷。這同時也會阻止應用向 rootfs內寫入日誌記錄,因此我們可能需要利用遠程日誌記錄機制或者指定分卷來完成相關寫入操作。

使用方法(docs):

$ docker run --read-only -v /icanwrite busybox touch /icanwrite here
用戶名空間(Experimental)

很多人都在熱切期盼著這項功能。目前,擁有容器的root權限意味著我們在主機上同樣擁有root權限。如果我們能夠在自己的容器當中實現 /bin,那麽也同樣能夠將任何預期內容添加進來,甚至徹底控制主機系統。而隨著user-namespace的引入,大家將能夠在保證用戶在容器內擁有 root權限的前提下,利用uid:gid保證對應的用戶/群組在容器之外處於非高權限狀態。作為第一階段,我們現在可以對每個域實例中的root進行重 新映射。作為發展的下一階段,我們可能會進行全局映射以及每容器映射,不過這樣的能力是否必要仍在討論當中。

使用方法(docs):

$ docker daemon --userns-remap=default 
Seccomp(Git主分支)

在命名空間的幫助下,我們已經能夠實現權限分享。但除此之外,我們還需要對容器當中能夠運行的具體負載進行控制。這時就需要依靠seccomp了 ——所謂seccomp,其實就是安全計算模式的縮寫。它允許大家對系統調用進行篩選,這樣我們就能夠為應用程序定義其需要的系統調用,並拒絕其它一切不 必要的調用行為。下面例舉一個簡短的socket.json實例:

{

"defaultAction": "SCMP_ACT_ALLOW",

"syscalls": [

{

"name": "socket",

"action": "SCMP_ACT_ERRNO" } ]


其運行結果將如下所示:

# docker run -ti --rm --security-opt seccomp:tcpsocket.json Ubuntu bash

root@54fd6641a219:/# nc -l 555

nc: Operation not permitted


Nautilus項目

目前Docker生態系統中的一項重要功能缺失就是對鏡像內容的檢查。此前曾有文章指出,當下Docker hub中超過30%的官方鏡像存在著常見安全漏洞,這一消息旋即引起軒然大波。Docker方面立即著手處理,而且現在各被發布在Docker hub中的官方鏡像在正式推出前都需要進行掃描。在本屆Dockercon歐洲大會上,Docker方面公布了Nautilus項目,這是一項官方提供的 鏡像掃描服務,能夠讓我們更為輕松地構建並使用高完整性內容。

目前關於Nautilus項目還沒有太多官方說明,不過我們了解到其運行在後臺當中,而且Docker方面表示他們已經借此對超過7400萬條 pull進行了保護。最近,他們還發起了一項調查,征求用戶們的實際使用需求。在這裏我只能先為大家提供一些假設。首先,Docker方面表示該項目能 夠:

保障鏡像安全
實現組件庫存/許可管理
實現鏡像優化
實現基礎性功能測試
以下是幾項可能即將實現的特性:

以內部方式運行Nautilus
針對單一鏡像或者單一部署節點進行計費 

AppArmor配置文件

通過使用AppArmor,大家可以借助配置文件對功能進行限制。配置文件可以實現極為出色的控制粒度,但很多人並不希望把時間耗費在編寫配置文 件方面。考慮到這類配置文件對Docker容器運行的重要意義,Jessie Frazelle作為Docker的核心維護者之一,創造了bane以簡化配置文件的編寫難度。它能夠使用toml輸入文件,並生成及安裝 AppArmor配置文件。該配置文件隨後可以被用於運行Docker容器,且采用與之前相同的語法:

docker run -d --security-opt="apparmor:name_of_profile" -p 80:80 Nginx 
Docker安全狀況

這一切都能夠幫助我們實現容器安全保障,當然Docker自身也在努力降低相關方案的執行難度。這意味著如果大家希望了解與本議題相關的各類細節信息,可以點擊此處查看GitHub的對應分區並獲取各類最新建議。

延伸阅读

    评论