「各位在使用Docker的時候,是否有了解它是否安全?」著有《Docker源碼分析》,現任職於中國容器雲平臺服務商DaoCloud,同時也是Docker Swarm核心維護者的孫宏亮表示,在Docker問世之後,許多傳統虛擬化技術的擁護者紛紛開始議論它的安全性,例如共享作業系統核心,一旦單臺機器收到外部攻擊,傷害範圍也會波及至作業系統核心上運作的Container。
誠然,傳統VM廠商對Container的安全顧慮有其理由,而在Docker官方宣稱其容器技術是絕對安全(Secure by default)的同時,孫宏亮卻拋出了一個令人玩味,表面看似相當矛盾的解讀:「Docker既安全,也不安全。」
究竟為何他會給出這樣曖昧不清的解讀,必須先從Docker Container技術的本質作為切入點開始探討:在任何環境,建置、派送及運行任何應用程式。
在常見的企業級IT架構中,最基本的結構,從底層的伺服器,到最上層的應用程式,中間總共包含了5層大架構。最下層是由Intel x86或是IBM Power組成的實體機器,在這些裸機之上,企業則導入vSphere、KVM、Hyper-V或是Xen等傳統虛擬化技術。利用VM技術,企業則可在虛擬機中運作Linux、Windows等異質作業系統。
第四層則是讓系統軟體與應用程式相互連線的中介軟體,最後才是開發團隊每天接觸的應用程式,「單是支撐一支應用程式運作,底層就得需要如此多的元件在支援。」
Docker可消弭開發、維運團隊間的鴻溝
對於開發者,每日首要目的就是關心應用程式。但是,底層的伺服器、虛擬化平臺、中介軟體等都是由維運團隊在支撐。但是仍然不免因為業務上衝突,導致團隊工作不順利。孫宏亮舉例,像是開發者往往宣稱程式可以在開發環境的機器上運行,但是交付到測試人員手中時就漏洞百出,甚至到了部署階段,維運人員更是不停抱怨部署失敗率極高。
雖然孫宏亮一直提倡開發團隊與維運團隊得要好好攜手合作的觀念,但經常事與願違,「但是在Docker誕生之後,我認為此事的契機到了。」例如任何企業在交付軟體的過程中,勢必得要經過開發、測試及上限部署、維運等過程。利用Docker推出軟體封裝標準的概念,除了各部門能夠友好相處外,也能讓交付應用程式的過程更順利。
然而,開發者在享受Docker快速部署、建置特點,常常被它的易用性所蒙蔽,進而忽略背後隱含的資安問題。孫宏亮表示,在中國開發圈內經常流傳著一句話:「資安永遠是IT架構的遮羞布。」當企業關注資安議題時,其重要性不在話下,反之,當企業輕忽了必要的資安問題,就得為捅出的簍子付出巨大成本。
Docker並非為安全而生
Docker這樣技術具備具有許多優點,Docker問世後,其官方一直所堅守的立場:在任何環境,建置、派送及運行任何應用程式。雖然Docker社群也不停加強此技術的安全性,但是對於資安議題的考量,其實不是Docker的初衷,「Docker並不為安全而生」,孫宏亮表示,其價值並非與虛擬機器一拼安全性,而是建立起資源及流程標準化、易用性,以及表現極好的效能,「在滿足這些前提之下,把安全性做到最好。」
孫宏亮表示,任何新興技術在進入企業級市場時,都會檢視確定其是否滿足資安需求,「一旦有安全疑慮,根本無法進入企業級市場。」
Docker有哪些安全性疑慮?
目前使用者對於Docker安全性的檢討不再少數,其中最為明顯的質疑是與host主機共用作業系統可能引起的資安問題,再者是Docker為了提高效能表現,進而降低安全性。想要拉高企業採納容器虛擬化的比例,Docker也得加強其容器技術的安全性。
孫宏亮認為,Docker安全發展總共可歸納為四大面向,第一是資料通訊安全,包含客戶端至Docker引擎,以及Docker引擎至儲存庫間傳輸映像檔的安全考量。第二則是映像檔本身的安全性,透過縮小尺寸提升其安全性。
再者是Docker Container的安全,孫宏亮企業業務系統都掛載於映像檔,但是仍然是透過Container交付服務,「如果容器出現問題,整個企業就無法正常運作。」
最後則是網路安全,他解釋,許多企業在使用Docker前,就已經對於內部資料中心網路架構有所規畫,如果選擇導入Docker,其架構勢必得要進行調整,「這時網路安全就變成重要議題。」
孫宏亮也觀察,在中國與Docker相關的新創公司都會建立自家的公共容器映像檔儲存庫,而不法人士只要能取得上傳、下載映像檔權限,便可以暗自修改組成映像檔地各層Layer,「污染儲存庫中全部的映像檔。」但為何Docker會引發如此資安疑慮,是這門技術注定無法迴避的缺陷嗎?「是因為大家使用Docker缺乏好的規範,才會導致如此多問題。」他說。
利用Linux Kernel機制,加強Docker安全性
一夕紅遍全球IT界的Docker,走出一條與VM不同的路。不過孫宏亮強調,雖然Docker是理念的創新,「但真正厲害的還是Linux Kernel,Docker借助了許多Linux內建的機制」,例如隔離機制nampspace及cgroup,還有拆分root權限的Capabilities等。
Docker借用了cgroup、namespace實現了資源及程序隔離,孫宏亮比喻,一般人生活在社會中都得保有一定程度的隱私,但突然碰上有心人士的探查,隱私權就會受到侵犯,「而在Linux的世界中,namespace就可以保護各別Container的隱私,防止被人探查。」
而cgroup則是控制系統所使用的資源分配,像是儲存、CPU、硬碟I/O,以及設備權限,「cgroup分配資源的機制為上限分配。」
他解釋,假設系統所有可用的資源數量為X,只要各應用程式索求的資源數目總和不超過X,此時系統資源的分配就不存在問題,「在涉及資源劃分時,也要有一個控制器,確保機器上的資源應用正常。」
在開發軟體的流程中,開發者往往宣稱程式往往可以在開發環境的機器上運行,但是交付到測試人員手中時就漏洞百出,甚至到了部署階段,維運人員更是不停抱怨部署失敗率極高。圖片來源/孫宏亮
需要更細緻的權限控管,可以用Capabilities拆分root權限
再者,在Linux Kernel中內建的安全機制Capabilities則用於拆分root權限,「權限很重要,一旦越級會非常嚴重。」在Linux中,root握有最大的系統執行權限,若遇到Container使用root權限來執行時,將可能發生許多危險,此時就可以利用Capabilities機制,將root權限進行拆分。
孫宏亮舉例,假設原本root權限可以執行50項程序,在重新劃分後,可執行事務只剩20項,「此時root的安全性就提高。」但是使用Capabilities機制也會替使用者帶來不便,孫宏亮表示,由於Linux Kernel將root權限進一步細分,「這時候就會造成Container內root權限受到限制。」
他表示,理想狀況下,容器內的root權限得跟host主機上root權限相等,並且不為使用者帶來使用上的不便,「這就是使用者命名空間的任務,讓Container擁有很大的執行權限,但是不受host主機產生影響。」
最後則是Linux Kernel內建的安全運算模式(Secure Computing Mode,Seccomp),Docker借助此機制,協助Docker Container與Linux Kernel溝通,「使用者利用系統呼叫,透過作業系統核心滿足其需求。」不過,
孫宏亮認為,一旦某個Container可以任意呼叫Linux Kernel也會存在許多危險,例如,透過Container呼叫Kernel,要求重新啟動系統,或是在Linux Kernel內任意插入新模組,「都相當危險。」
而Container所誕生的目的,本身就非要如VM般一樣運作基礎架構,「而是要如應用程式一樣,負責運行上層服務,「因此就必須利用Seccomp機制,禁止不需要的系統呼叫權限。」
企業擁抱Docker也得留意安全問題
透過這些機制,使用Docker仍然可以獲得一定程度的保障,「本可避免很多資安問題,但使用者卻自己暴露出漏洞。」孫宏亮認為,許多人認為Docker不安全,其實追本溯源,都可發現是出自於人為因素,「使用者沒有重視安全議題。」
共用作業系統核心的確是Docker目前不安全的弱點,但是在Docker逐漸加強資安的同時,Linux Kernel也不停在進步,「兩者一同發展,所擁有的優勢相當多。」
孫宏亮也直言,企業想要使用Docker,仍然是存在一定門檻。操作妥善,資安並不會讓使用者頭痛,「但是使用不當,一旦內部資料被偷光,使用者可能還渾然不查。」
在開發軟體的流程中,開發者往往宣稱程式往往可以在開發環境的機器上運行,但是交付到測試人員手中時就漏洞百出,甚至到了部署階段,維運人員更是不停抱怨部署失敗率極高。圖片來源/孫宏亮