在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Docker容器構建環境及安全措施分析

馬哥Linux運維 ? 來源:未知 ? 作者:工程師郭婷 ? 2018-07-31 16:03 ? 次閱讀

DevOps概念的流行跟近些年微服務架構的興起有很大關系,DevOps是Dev(Development)和Ops(Operations)的結合,Dev負責開發,Ops負責部署上線,Docker出現之前,公司需要搭建一個數據庫環境,有了Docker之后,只需在一些開源的基礎鏡像上構建出公司自己的鏡像即可。

因此目前大多數DevOps設置都在CI管道中的某處設置了Docker,這就意味著你所看到的任何構建環境都將使用Docker等容器解決方案。由于這些構建環境需要接受不可信的用戶提供的代碼并進行執行,因此探討如何將這些代碼安全地裝入容器就顯得非常有意義。

在這篇文章中,我將探討在構建環境中非常小的錯誤配置是如何產生嚴重的安全風險的。

需要注意的是,我并未在本文描述Heroku,Docker,AWS CodeBuild或容器中的任何固有漏洞,而是討論了在查看基于Docker容器的多租戶構建環境時發現的錯誤配置漏洞。在常規運行下,雖然Docker容器技術提供了非常穩定的安全默認設置,但是在特殊情況時,有時候小的錯誤配置就會導致嚴重安全風險。

特殊的構建環境

可能的特殊構建環境可以具有以下架構:

1.具有完全托管的生成服務,可編譯源代碼、運行測試以及生成可供部署的軟件包——AWS CodeBuild;

2.Docker構建服務中的Docker容器;

Docker容器可以通過Dind(Docker-in-Docker,是讓你可以在Docker容器里面運行Docker的一種方式)創建,因此,從理論上來說,你最終得到兩個攻擊者需要逃脫的容器。使用CodeBuild可進一步最小化攻擊面,因為你擁有AWS提供的一次性容器,而且租戶不會與對方的構建過程互動。

攻擊者是如何控制構建過程的?

在大多數構建或CI管道中要做的第一件事就是創建一個包含你想要構建和部署的代碼的Git倉庫。然后這些代碼將被打包并轉移到構建環境,最后應用到docker構建過程。

通過查看構建服務,你通常可以通過兩種方式配置容器,即通過Dockerfile或config.yml,這兩種方法都與源代碼有關。

其中有一個CI配置文件,我稱之為config-ci.yml,如下圖所示。

Docker容器構建環境及安全措施分析

在其它的構建過程開始之前,該文件將在構建過程中被轉換為Dockerfile。如果你有明確指定要使用的Dockerfile環境,可以將config-ci.yml更改為以下內容。

Docker容器構建環境及安全措施分析

Dockerfile_Web和Dockerfile_Worker是源代碼存儲庫中Dockerfiles的相對路徑和名稱,既然現在我已經提供了完整的構建信息,就可以開始構建了。構建通常是通過原始倉庫上的代碼上傳來啟動的。啟動時,你會看到如下所示的輸出內容。

Docker容器構建環境及安全措施分析

正如你所看到的,輸出的內容有docker build -f Dockerfile。這些內容即對調試過程有用,又對于發現可能出現的攻擊有用。

對預構建過程進行攻擊

在進入docker構建之前,我首先想到的是嘗試并中斷構建過程,或者,我可以嘗試將來自CodeBuild環境的文件鏈接到我的Docker構建的上下文中。

由于我已經控制了config-ci.yml文件的內容,更具體地說,我控制的是“要使用的Dockerfile的相對路徑”,所以我可以嘗試用一種老式攻擊方法——目錄遍歷攻擊。

第一個嘗試就是試著改變構建的目錄:

Docker容器構建環境及安全措施分析

一旦構建過程開始,我就會立即得到錯誤信息。

有趣的是,該錯誤是我造成的,并導致了路徑泄漏,如果我嘗試“讀取”文件會發生什么?

Docker容器構建環境及安全措施分析

可以看出,我解析了Docker守護進程的錯誤。不幸的是,這只針對我系統上的第一行文件。盡管如此,這也是一個有趣的開始。

Docker容器構建環境及安全措施分析

其實,我這么做的另一個想法是想嘗試使用符號鏈接將文件包含到我的構建中。不過,Docker阻止了我這么做,因為它不會將構建目錄之外的文件包含到構建上下文中。

攻擊構建過程,以發現漏洞

讓我們先回到實際的構建過程,看看可以對什么進行攻擊?由于構建過程發生在dind Docker容器中,該容器在一次性CodeBuild實例中運行。為了進一步尋找攻擊,docker構建過程會在一次性Docker容器中運行所有命令。Docker的容器是把應用程序和環境打包在一起的,所以是一次構建,多處發布。舉個例子,以前你開發完程序后,測試人員和運維人員都需要去部署,通過docker只需要一個run命令即可。因此docker最大的好處就是標準化了應用交互,同時支持多個不同平臺和多個不同的云服務商,只要機器能裝docker,就能無差別的運行程序。

所以Docker構建的每一步實際上都是一個新的Docker容器,這從構建過程的輸出中就可以看出。

Docker容器構建環境及安全措施分析

在上述情況下,在新的Docker容器e7e10023b1fc中執行上面輸出代碼段中的Step 2/9。因此,即使用戶決定在Dockerfile中插入一些惡意代碼,它們也應該在一次性隔離容器中運行,而不會造成任何損害,如下所示。

Docker容器構建環境及安全措施分析

在發布Docker命令時,這些命令實際上被傳遞給負責創建/運行/管理Docker鏡像的dockerd守護進程。為了繼續實現dind,dind需要運行自己的Docker守護進程。然而,由于實現dind的方式是使用主機系統的docker實例(dockerd instance),以允許主機和后臺共享Docker鏡像,并從Docker的所有緩存中受益。

如果Dind使用下面的包裝腳本啟動會發生什么結果:

Docker容器構建環境及安全措施分析

/usr/local/bin/dind是一個使Docker在容器中運行的包裝腳本,該包裝腳本確保來自主機的Docker套接字在容器內部可用,因此,此特定配置會引入安全漏洞。

通常Docker構建過程將無法與Docker守護進程交互,但是,在這種情況下,卻可以實現交互。敏銳的觀察者可能會注意到,dockerd守護進程的TCP端口也是通過--host=tcp://0.0.0.0:2375進行映射的。通過這種錯誤配置設置的Docker守護進程會監控容器上的所有接口。因此,這就成了Docker網絡功能中的一個漏洞。除非另有說明,否則所有容器都將會被放入相同的默認Docker網絡中。這意味著每個容器都能夠與其他容器進行通信,而不會受到阻礙。

現在,我的臨時構建容器(執行用戶代碼的那個容器)已經能夠向托管它的dind容器發出網絡請求。由于dind容器只是重復使用了主機系統的Docker守護進程,所以我實際上是直接向主機系統AWS CodeBuild發出命令。

實施Dockerfiles攻擊

為了測試Dockerfiles攻擊,我可以將下面的Dockerfile提供給構建系統,這樣我就能夠交互訪問正在構建的容器。需要說明的是,我這么做只是為了加速尋找漏洞的過程,而不是為了減少等待構建過程的時間。

Docker容器構建環境及安全措施分析

可以看出,反向shell可以通過很多不同的方式完成。

這個Dockerfile會安裝一些依賴項,即docker和netcat。然后它們會將我的源代碼目錄中的文件復制到構建容器中。這將在后來的步驟中用到,除此之外,這么做還可以更容易地將我的完整漏洞快速傳輸到系統。由于mknod指令會創建一個文件系統節點,以允許通過文件重定向stdin和stdout。使用netcat可以打開一個反向shell,除此之外,我還需要在我使用公共IP地址控制的系統上為此反向shell設置監控器。

Docker容器構建環境及安全措施分析

這樣,當構建發生時,我將收到一個反向連接。

Docker容器構建環境及安全措施分析

現在通過遠程交互式訪問,我就可以檢查是否能對Docker守護進程進行訪問。

Docker容器構建環境及安全措施分析

我會使用-H 172.18.0.1來指定遠程主機,由于我發現Docker使用的網絡范圍是172.18.0.0/16,因此使用了此地址。為了找到這個遠程主機,我的交互式shell被用來充作ip addr和ip route,以獲得分配給我的構建容器的網絡。請注意,默認情況下,所有Docker容器都將被放入同一個網絡,默認網關將是運行Docker守護進程的實例。

Docker容器構建環境及安全措施分析

這樣漏洞就會被成功發現,此時我可以從正在構建的容器中訪問Docker,以便在下一步啟動一個具有額外特權的新容器。

進行棧處理

此時,我已有一個shell,不過它還是位于一次性的構建容器中,作用不是很大。另外,我也可以訪問Docker守護進程。于是我就想,把這兩者結合起來會怎么樣?為此,我引入了第二個Dockerfile,它會在構建和運行時創建一個反向shell。以下就是我啟動第二個監控器來捕獲的新的shell。

Docker容器構建環境及安全措施分析

這將作為Dockerfile2保存在源代碼目錄中,現在,當源代碼文件被復制到構建容器中時,我可以直接訪問它了。

當我重新運行構建過程時,我將在端口4445上獲得我的第一個反向shell,這樣我就可以留在構建容器中。現在我可以構建Dockerfile2,它被復制到COPY * /files/中的構建容器中。

Docker容器構建環境及安全措施分析

現在我可以使用主機Docker守護進程并構建一個新的可用Docker映像,我只需要運行它即可。不過這里有個小的技巧,就是我需要通將根目錄映射到新的Docker容器,這可以通過-v/:/vhost完成。

以下是我得到的第一個反向shell:

Docker容器構建環境及安全措施分析

現在,一個新的反向shell就會連接到攻擊系統上的4446端口。這樣我就將處于一個新的容器中,并直接訪問底層CodeBuild主機的文件系統和網絡。這首先是因為--net=host將通過主機網絡映射,而不是將容器保存在一個獨立的隔離網絡中。其次,因為Docker守護進程正在主機系統上運行,所以當使用-v /:/vhost的文件映射完成時,主機系統的文件系統將被映射。

Docker容器構建環境及安全措施分析

這樣在新的反向shell中,我現在就可以探索底層的主機文件系統了。通過檢查以下兩個之間的區別,我就可以證明我在與此文件系統交互時不在Docker中。

在/vhost中我還發現有一個新的目錄,它可以清楚地表明我在CodeBuild實例文件系統中,而不是在任何Docker容器中。

Docker容器構建環境及安全措施分析

這樣在codebuild里,就會出現一個神奇的結果。這是AWS Codebuild用來控制構建環境的內容,快速瀏覽一下可以看到一些有趣的數據。

Docker容器構建環境及安全措施分析

此時,我通常會嘗試提取AWS憑證和數據透視表,為此,我需要使用AWS_CONTAINER_CREDENTIALS_RELATIVE_URI。

Docker容器構建環境及安全措施分析

根據與該IAM相關的權限,現在應該有機會繞過AWS環境。

上述步驟可自動化實現,并且只需要一個反向shell即可完成,但是,請記住,你需要保持正常的構建環境。請注意,大多數構建環境會在30-60分鐘后自動刪除。

緩解措施

在這種情況下,修復非常簡單,永遠不要將Docker守護進程綁定到所有接口上。從包裝腳本中刪除--host=tcp://0.0.0.0:2375 行也可以來修復這個漏洞。另外,不需要綁定到TCP端口,因為unix套接字已經通過了--host=unix:///var/run/docker.sock映射。

總結

雖然容器策略提供了一個很好的機制,來讓你創建運行不受信任代碼的安全環境,而不需要額外的虛擬化過程。然而,這些容器的安全性與它們的配置一樣。默認情況下,它們非常安全,但只需一個小的配置錯誤就可以讓整個安全環境崩塌。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 微服務
    +關注

    關注

    0

    文章

    145

    瀏覽量

    7636
  • Docker
    +關注

    關注

    0

    文章

    503

    瀏覽量

    12550

原文標題:Docker容器構建過程的安全性分析

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Docker Compose的常用命令

    。它通過一個配置文件(docker-compose.yml)來詳細定義多個容器之間的關聯、網絡設置、服務端口等信息。使用一條簡單的命令,就可以輕松啟動、停止和管理這些容器,極大地簡化了多容器
    的頭像 發表于 04-30 13:40 ?115次閱讀

    【技術案例】Android in Docker

    Docker介紹Docker是一個開源的容器化平臺,用于打包、分發和運行應用程序。它通過將應用及其所有依賴打包到獨立的容器中,確保應用在不同環境
    的頭像 發表于 04-02 16:33 ?382次閱讀
    【技術案例】Android in <b class='flag-5'>Docker</b>

    使用Windows中的Docker容器運行DL Streamer出現報錯怎么解決?

    使用 Windows* 中的 Docker 容器運行 DL Streamer。 遇到錯誤: gi.repository.GLib.GError: gst_parse_error: 無元素 “vaapih264enc” (1)
    發表于 03-05 07:04

    在Mac上使用Docker構建noVNC環境并運行MyCobot

    這篇文章主要內容是關于如何在 Ros2 環境構建在 Mac 上模擬 Mycobot 280 M5 的環境
    的頭像 發表于 01-15 09:17 ?526次閱讀
    在Mac上使用<b class='flag-5'>Docker</b><b class='flag-5'>構建</b>noVNC<b class='flag-5'>環境</b>并運行MyCobot

    基于 Docker 與 Jenkins 實現自動化部署

    優化,為 Docker 容器化應用與 Jenkins 自動化流水線提供了理想的運行環境。無論是快速構建、測試還是部署,Flexus X 都能確保流程順暢無阻,大幅提升軟件開發與交付效率
    的頭像 發表于 01-07 17:25 ?396次閱讀
    基于 <b class='flag-5'>Docker</b> 與 Jenkins 實現自動化部署

    Dockerfile鏡像制作與Docker-Compose容器編排

    Dockerfile鏡像制作 docker/podman中, 鏡像是容器的基礎,每次執行docker run的時候都會指定哪個基本鏡像作為容器運行的基礎。我們之前的
    的頭像 發表于 01-07 11:01 ?599次閱讀
    Dockerfile鏡像制作與<b class='flag-5'>Docker</b>-Compose<b class='flag-5'>容器</b>編排

    在華為云 FlexusX 實例上實現 Docker 容器的實時監控與可視化分析

    前言 華為云 Flexus X,以頂尖算力與智能調度,引領 Docker 容器管理新風尚。828 企業上云節之際,Flexus X 攜手前沿技術,實現容器運行的實時監控與數據可視化,讓管理變得直觀
    的頭像 發表于 01-02 13:42 ?301次閱讀
    在華為云 FlexusX 實例上實現 <b class='flag-5'>Docker</b> <b class='flag-5'>容器</b>的實時監控與可視化<b class='flag-5'>分析</b>

    k8s和docker區別對比,哪個更強?

    Docker和Kubernetes(K8s)是容器化技術的兩大流行工具。Docker關注構建和打包容器,適用于本地開發和單主機管理;而K8s
    的頭像 發表于 12-11 13:55 ?459次閱讀

    Docker運行環境安裝

    作者:京東科技 林中 Docker是一個開放的平臺,用于開發、發布和運行應用程序。Docker分離了應用程序和運行應用的基礎設施,從而實現了軟件的快速交付。利用docker提供的一系列功能,包括
    的頭像 發表于 10-29 11:28 ?508次閱讀

    高壓電容器放電過程中的問題及安全措施

    引言 高壓電容器作為一種重要的電力設備,在電力系統中發揮著重要的作用。它們可以提高系統的功率因數,減少線路損耗,提高電能質量等。然而,高壓電容器在運行過程中也存在一定的安全風險,如電容器
    的頭像 發表于 08-16 09:40 ?2906次閱讀

    手動構建Docker鏡像的方法

    不推薦使用docker commit命令,而應該使用更靈活、更強大的dockerfile來構建docker鏡像。
    的頭像 發表于 08-05 15:30 ?734次閱讀
    手動<b class='flag-5'>構建</b><b class='flag-5'>Docker</b>鏡像的方法

    ARM平臺實現Docker容器技術

    自動部署)。而且使用dockerfile使鏡像構建透明化,不僅僅開發團隊可理解應用運行環境,也方便運維團隊理解應用運行所需條件,幫助更好的生產環境中部署該鏡像。 更輕松的遷移:由于Docker
    發表于 07-25 14:36

    ARM平臺實現Docker容器技術

    )。而且使用dockerfile使鏡像構建透明化,不僅僅開發團隊可理解應用運行環境,也方便運維團隊理解應用運行所需條件,幫助更好的生產環境中部署該鏡像。更輕松的遷移:由于Docker
    發表于 07-17 11:05

    關于Docker 的清理命令集錦

    這篇文章主要介紹了Docker 清理命令集錦,需要的朋友可以參考下 復制代碼代碼如下: docker kill $(docker ps -a -q) ?刪除所有已經停止的容器 復制代碼
    的頭像 發表于 06-13 15:56 ?563次閱讀

    鴻蒙OpenHarmony技術:【Docker編譯環境

    OpenHarmony為開發者提供了兩種Docker環境,以幫助開發者快速完成復雜的開發環境準備工作。
    的頭像 發表于 05-11 09:47 ?1845次閱讀
    鴻蒙OpenHarmony技術:【<b class='flag-5'>Docker</b>編譯<b class='flag-5'>環境</b>】
    主站蜘蛛池模板: 欲香欲色 | 国产一级爱c片免费播放 | 色福利网站 | 精品国产影院 | 牛仔裤美女国产精品毛片 | 日韩三级在线观看视频 | 亚洲国产成人在人网站天堂 | 欧美18性欧美黑吊 | 深夜一级毛片 | 国产免费的野战视频 | 四虎国产精品永久地址51 | tom影院亚洲国产 | 69中国xxxxxxxx18 | 国产精品99r8在线观看 | 亚洲国产日韩精品怡红院 | 69国产成人精品午夜福中文 | 亚洲国产一区二区三区在线观看 | 五月婷婷在线观看 | 国产在线观看黄色 | www.色com| 欧美人成一本免费观看视频 | 91久娇草 | 日本色黄视频 | 特黄特黄aaaa级毛片免费看 | 欧美四级在线 | 日韩中文视频 | 男男h文小说阅 | 天天做天天爱天天爽综合区 | 国产aa| 日韩欧美卡通动漫在线观看 | 国内一级特黄女人精品毛片 | 李老汉的性生生活2 | 韩国免费三片在线视频 | 天天爽天天爽天天片a久久网 | 尤物蜜芽福利国产污在线观看 | 新版天堂中文资源8在线 | 日韩免费观看的一级毛片 | 黄色大片网站 | 老师您的兔子好软水好多动漫视频 | 性欧美高清强烈性视频 | h视频在线观看视频观看 |