Docker平臺提供的主要的安全技術有哪些?
本節會介紹由docker平臺提供的主要的安全技術。
1.Swarm模式
正如所預期的,Swarm模式包括很多開箱即用的安全特性,同時還設置了合理的默認值。這些安全特性包括以下幾點。
加密節點ID。
基于TLS的認證機制。
安全準入令牌。
支持周期性證書自動更新的CA配置。
加密集群存儲(配置DB)。
加密網絡。
接下來將詳細介紹如何構建安全的Swarm,以及如何進行安全相關的配置。
為了完成下面的內容,讀者需要至少3個Docker主機,每個都運行1.13或者更高版本的Docker。示例中3個Docker主機分別叫作“mgr1”“mgr2”“wrk1”。每臺主機上都安裝Ubuntu 16.04,其上運行了Docker 18.01.0-ce。同時還有一個網絡負責聯通3臺主機,并且主機之間可? 以通過名稱互相ping通。安裝完成后如圖15.6所示。
圖15.6 3個Docker主機
(1)配置安全的Swarm集群
讀者可以在其Swarm集群管理者節點上運行下面的命令。在本例中,命令運行于“mgr1”節點之上。
上面的命令就是配置安全Swarm集群所要做的全部工作!
!
實驗環境如圖15.7所示。
圖15.7 實驗環境
現在將“mgr2”節點加入到集群中,作為額外的管理者節點。
將新的管理者節點加入到Swarm需要兩步。第一步,需要提取加入管理者到集群中所需的令牌;第二步,在“mgr2”節點上執行docker swarm join命令。只要將管理者準入令牌作為docker swarm join命令的一部分,“mgr2”就作為管理者節點加入Swarm。
在“mgr1”上運行下面的命令獲取管理者準入令牌。
命令輸出內容給出了管理者加入Swarm所需運行的準確命令。準入令牌和IP地址在讀者自己的實驗環境中是不一樣的。
復制該命令并在“mgr2”節點上運行。
“mgr2”現在已經作為另一個管理者加入Swarm。
可以通過在任意管理者節點上運行docker node ls命令來確認上述操作。
上述輸出內容中顯示“mgr1”和“mgr2”都加入了Swarm,并且都是Swarm管理者。最新的配置如圖15.8所示。
圖15.8 “mgr1”和“mgr2”都加入了Swarm
兩個管理者這個數量,大概是最糟糕的一種情況了。但是這只是一個實驗環境,而不是什么核心業務生產環境,所以糟糕點也無所謂。
復制如下所示命令到“wrk1”上并且運行。
在任意Swarm管理者上運行docker node ls命令。
圖15.9 將管理者配置為高可用(HA)
(2)了解Swarm安全背后的原理
到目前為止,讀者已經成功搭建了安全的Swarm集群。接下來一起花費幾分鐘了解一下這背后涉及的安全技術。
1)Swarm準入令牌
每個Swarm都包含兩種不同準入令牌。
管理者所需準入令牌。
有必要理解Swarm準入令牌的格式。每個準入令牌都由4個不同的字段構成,中間采用虛線(-)連接。
管理者:SWMTKN-1-1dmtwusdc...r17stb-2axi53zjbs45lqxykaw8p7glz
。
如果用戶認為當前準入令牌存在風險,僅用一條命令就可以取消該準入令牌授權,同時發布新的準入令牌。在下面的示例中,取消了已經授權的管理者準入令牌,之后又發布了新的令牌。
需要注意的是,新舊令牌只有最后字段存在區別。SWARM ID還是相同的。
準入令牌保存在集群配置的數據庫中,默認是加密的。
2)TLS和雙向認證
在Linux主機上,讀者可以指定使用下面的命令查看指定節點的客戶端證書。
上述輸出中,Subject中用到了O、OU以及CN字段分別表示Swarm ID、節點角色以及節點ID信息。
組織字段O保存的是Swarm ID。
組織單元字段OU保存的是節點在Swarm中的角色。
規范名稱字段CN保存的是節點的加密ID。
如圖15.10所示。
圖15.10 Subject中使用的字段
在Validity中,還可以直接看到證書的更新周期。
上述信息可以在docker system info命令的輸出中得到驗證。
3)配置一些CA信息
通過docker swarm update命令可以配置Swarm證書的更新周期。下面的示例中,將Swarm的證書更新周期修改為30天。
Swarm允許節點在證書過期前重新創建證書,這樣可以保證Swarm中全部節點不會在同一時間嘗試更新自己的證書信息。
讀者可以在創建Swarm的時候,通過在docker swarm init命令中增加--external-ca參數來指定外部的CA。
docker swarm ca命令可以用于管理CA相關配置。可以在運行該命令時指定--help來查看命令功能。
4)集群存儲
集群存儲是Swarm的大腦,保存了集群配置和狀態數據。
存儲目前是基于etcd的某種實現,并且會在Swarm內所有管理者之間自動復制。存儲默認也是加密的。
集群存儲正逐漸成為很多Docker平臺的關鍵技術。例如,Docker網絡和Docker密鑰都用到了集群存儲。Docker平臺的很多部分都已經用到了集群存儲,未來對集群存儲的利用會更多,而這也是Swarm模式在Docker規劃中占據重要地位的原因之一。這還意味著,如果不使用Swarm模式運行Docker,很多Docker特性就無法使用。
集群存儲的日常維護由Docker自動完成。但是,在生產環境中,需要為集群存儲提供完整的備份和恢復方案。
Swarm模式安全部分的內容到此為止。
2.Docker安全掃描
快速發現代碼缺陷的能力至關重要。Docker安全掃描功能使得對Docker鏡像中已知缺陷的檢測工作變得簡單。
{注:}
在本書編寫之時,Docker安全掃描已經可以用于Docker Hub上私有倉庫的鏡像了。同時該技術還可以作為Docker可信服務本地化部署解決方案的一部分。最后,所有官方Docker鏡像都經過了安全掃描,掃描報告在其倉庫中可以查閱。
Docker安全掃描對Docker鏡像進行二進制代碼級別的掃描,對其中的軟件根據已知缺陷數據庫(CVE數據庫)進行檢查。在掃描執行完成后,會生成一份詳細報告。
打開瀏覽器訪問Docker Hub,并搜索Alpine倉庫。圖15.11展示了官方Alpine倉庫的Tags標簽頁。
圖15.11 官方Alpine倉庫的Tags標簽頁
Alpine倉庫是官方倉庫,這意味著該倉庫會自動掃描并生成對應報告。可以看到,鏡像標簽為edge、latest以及3.6的鏡像都通過了已知缺陷的檢查。但是alpine:3.5鏡像存在已知缺陷(標紅)。
如果打開alpine:3.5鏡像,可以發現如圖15.12所示的詳細信息。
圖15.12 alpine:3.5鏡像的詳細信息
這是發現自己軟件中已知缺陷詳情的一種簡單方式。
Docker可信鏡像倉庫服務(Docker Trusted Registry, DTR),屬于Docker企業版中本地化鏡像倉庫服務的一部分內容,提供了相同的Capability,同時還允許用戶自行控制其鏡像掃描時機以及掃描方式。例如,DTR允許用戶選擇鏡像是在推送時自動觸發掃描,還是只能手工觸發。同時DTR還允許用戶手動更新CVE數據庫,這對于DTL無法進行聯網來自動更新CVE數據的場景來說,是一種理想的解決方案。
這就是Docker安全掃描,一種深入檢測Docker鏡像是否存在已知安全缺陷的好方式。當然,能力越大責任越大,當用戶發現缺陷后,就需要承擔解決相應缺陷的責任了。
3.Docker內容信任
Dockr內容信任(Docker Content Trust,DCT)使得用戶很容易就能確認所下載鏡像的完整性以及其發布者。在不可信任的網絡環境中下載鏡像時,這一點很重要。
從更高層面來看,DCT允許開發者對發布到Docker Hub或者Docker可信服務的鏡像進行簽名。當這些鏡像被拉取的時候,會自動確認簽名狀態。圖15.13展示了這一過程。
DCT還可以提供關鍵上下文,如鏡像是否已被簽名從而可用于生產環境,鏡像是否被新版本取代而過時等。
在本書編寫之際,DTC提供的上下文還在初期,配置起來相當復雜。
在Docker主機上啟用DCT功能,所要做的只是在環境中將DOCKER_CONTENT_TRUST變量設置為1。
圖15.13 鏡像被拉取時自動確認簽名狀態
在實際環境中,用戶可能希望在系統中默認開啟該特性。
如果使用Docker統一配置層(Docker企業版的一部分),需要勾選圖中15.14所示Run Only Signed Images復選項。這樣會強制所有在UCP集群中的節點只運行已簽名鏡像。
圖15.14 勾選Only run signed images復選項
由圖15.14中可知,UCP在DCT的基礎上進行進一步封裝,提供了已簽名鏡像的安全首選項信息。例如,用戶可能有這樣的需求:在生產環境中只能使用由secops簽名的鏡像。
一旦DCT功能開啟,就不能獲取并使用未簽名鏡像了。圖15.15展示了開啟DCT之后,如果再次嘗試通過Docker CLI或者UCP Web UI界面拉取未簽名鏡像時所報的錯誤(兩個示例都嘗試拉取標簽為“unsigned”的鏡像)。
圖15.15 拉取未簽名鏡像時報錯
圖15.16展示了DCT是如何阻止Docker客戶端拉取一個被篡改的鏡像的。圖15.17展示了DCT如何阻止客戶端拉取舊鏡像。
圖15.16 拉取被篡改的鏡像
圖15.17 拉取舊鏡像
Docker內容信任是一種很重要的技術,能幫助用戶檢查從Docker服務中拉取的鏡像。該技術的基礎模式配置起來非常簡單,但是類似上下文等一些高級特性,現階段配置起來還是非常復雜的。
4.Docker密鑰
很多應用都需要密鑰。比如密碼、TLS證書、SSH key等。
在Docker1.13版本之前,沒有一種標準且安全的方式能讓密鑰在應用間實現共享。常見的方式是開發人員將密鑰以文本的方式寫入環境變量(我們都這么做過)。這與理想狀態差距甚遠。
Docker1.13引入了Docker密鑰,將密鑰變成Docker生態系統中的一等公民。例如,增加了一個新的子命令docker secret來管理密鑰。在Docker的UCP界面中,也有專門的地方來創建和管理密鑰。在后臺,密鑰在創建后以及傳輸中都是加密的,使用時被掛載到內存文件系統,并且只對那些已經被授權了的服務開放訪問。這確實是一種綜合性的端到端解決方案。
圖15.18展示了其總體流程。
下面依次介紹圖15.18中所示工作流的每一步。
(1)密鑰被創建,并且發送到Swarm。
(2)密鑰存放在集群存儲當中,并且是加密的(每個管理者節點都能訪問集群存儲)。
(3)B服務被創建,并且使用了該密鑰。
(4)密鑰傳輸到B服務的任務節點(容器)的過程是加密的。
(5)B服務的容器將密鑰解密并掛載到路徑/run/secrets下。這是一個臨時的內存文件系統(在Windows Docker中該步驟有所不同,因為Windows中沒有內存文件系統這個概念)。
(6)一旦容器(服務任務)完成,內存文件系統關閉,密鑰也隨之刪除。
(7)A服務中的容器不能訪問該密鑰。
圖15.18 引入Docker密鑰
用戶可以通過docker secret子命令來管理密鑰,可以通過在運行docker service create命令時附加--secret,從而為某個服務指定密鑰。
###小結 Docker可以通過配置變得特別安全。Docker支持全部的Linux主流安全技術,包括Namespace、Control Group、Capability、MAC以及Seccomp。Docker為這些安全技術設定了合理的默認值,但是用戶也可以自行修改配置,或者禁用這些安全技術。
在通用的Linux安全技術之上,Docker平臺還引入了大量自有安全技術。Swarm模式基于TLS構建,并且配置上極其簡單靈活。安全掃描對鏡像進行二進制源碼級別掃描,并提供已知缺陷的詳細報告。Docker內容信任允許用戶對內容進行簽名和認證,密鑰目前也是Docker中的一等公民。
最終結論就是,無論用戶希望Docker環境有多安全,Docker都可以實現。這一切都取決于用戶如何配置Docker。
本文摘自正在熱銷的技術書[《深入淺出Docker》](https://item.jd.com/12564378.html?dist=jd "《深入淺出Docker》")
Nigel,Poulton(奈吉爾·波爾頓) 著,李瑞豐,劉康
Docker技術入門與實踐指南教程
容器與容器云解析,幫助您快速建立Docker技術知識體系
Docker認證工程師實用指南
《深入淺出Docker》由Docker概覽和Docker技術兩部分組成,遵循簡介—詳解—命令的章節布局,全面系統地剖析Docker的基本原理與實踐應用。清晰詳細的操作步驟結合大量的實際代碼,為讀者切實入門Docker保駕護航。
### 延伸閱讀:干貨 | Docker中用到的主要Linux安全技術有哪些?
本文轉載自異步社區
軟件開發 架構設計
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。