第十二屆全國大學生信息安全競賽即將開始,小伙伴們有報名參加的嗎?大家在比賽前是否開始進行模擬演練了?今天,i春秋將與大家分享靶場搭建的相關內容,幫助大家更好的進行實操演練。
學習搭建Docker靶場之前,我們先了解一下為什么要用Docker?
- 相對於虛擬機,Docker啟動更快。
- 成本考慮
- 更安全
環境部署
搭建環境>>
- OS: Ubuntu 16.04
- 設備類型: VM
- 宿主機:ESXI 6.5
卸載原有Docker>>

安裝>>
Ubuntu 16.04 + 上的Docker CE默認使用overlay2存儲層驅動,無需手動配置。
使用APT安裝:由於APT源使用HTTPS以確保軟件下載過程中不被篡改。因此,我們需要添加使用HTTPS傳輸的軟件包以及CA證書。

鑒於國內網絡問題,建議使用國內源。
為了確認所下載軟件包的合法性,需要添加軟件源的GPG密鑰。

然后,我們需要向source.list中添加Docker軟件源。

以上命令會添加穩定版本的Docker CE APT鏡像源,如果需要測試或每日構建版本的Docker CE請將stable改為test或者nightly。
安裝 Docker CE>>
更新APT軟件包緩存,並安裝 docker-ce:

Tips:
- 使用腳本自動安裝
- 在測試或開發環境中Docker官方為了簡化安裝流程,提供了一套便捷的安裝腳本,Ubuntu系統上可以使用這套腳本安裝。

執行這個命令后,腳本就會自動的將一切准備工作做好,並且把Docker CE的Edge版本安裝在系統中。
啟動Docker CE>>

建立Docker用戶組>>
默認情況下,Docker命令會使用Unix socket與Docker引擎通訊。而只有Root用戶和Docker組的用戶才可以訪問Docker引擎的Unix socket。出於安全考慮,一般Linux系統上不會直接使用Root用戶。因此,更好地做法是將需要使用Docker的用戶加入Docker用戶組。
建立Docker組:
$ sudo groupadd docker
$ sudo usermod -aG docker $USER
退出當前終端並重新登錄,進行如下測試。
測試Docker是否安裝正確>>

若能正常輸出以上信息,則說明安裝成功。
環境測試
搭建>>
首先制作一個WEB容器,了解端口映射原理和數據卷掛載原理。
操作過程
第一步:准備工作
- 根目錄: /opt/docker
- 網站根目錄:/opt/docker/www
- nginx相關目錄:/opt/docker/nginx/conf.d
第二步:安裝php7,nginx,mysql

注意!MySQL務必加上版本號,否則會拉取MySQL8.0的鏡像下來導致后面各種奇奇怪怪的錯。
第三步:啟動基礎環境

命令詳解
-v /opt/docker/www/:/var/www/html/:把宿主機(Ubuntu)的/opt/docker/www/掛載到了docker的/var/www/html/
--name php 命名為php
-p 80:80 把宿主機的80映射到docker的80端
-e MYSQL_ROOT_PASSWORD=123456
設置MySQL密碼為123456
測試環境是否正確>>
編輯文件/opt/docker/www/index.php

然后在宿主機目錄/opt/docker/nginx/conf.d/新建index.conf
內容如下:

然后重啟nginx docker

訪問10.16.11.231【你部署Docker的機器的地址】查看是否輸出PHPINFO
如圖即為成功。
定制Docker
MySQL配置>>
由於Docker的MySQL默認是開放了Root的外連權限,因此在比賽中為了安全,Root用戶務必設置強密碼,比賽前數據庫務必先備份原始庫,方便數據庫被清了恢復,權限務必配置為一個庫一個用戶,禁止該庫所有權用戶訪問其他庫和禁掉相關高危權限。
部署靶場Docker>>
以dedecms為例子
首先從pull下來一個集成環境然后啟動並掛載到宿主機的一個數據卷上:
docker pull chengxulvtu/dedecms:utf8_full_5.7
docker run -d --name dede-lantinghe -p 8081:80 -v /opt/docker/
www/dedecms:/var/www/html chengxulvtu/dedecms:utf8_full_5.7
然后正常安裝,配置數據庫。
然后kill掉該docker並rm掉,FTP連接到宿主機找到安裝好dedecms的目錄/opt/docker/www/dedecms
在目錄下創建一個新的文件夾(這里我用的src)並把dedecms的所有文件src文件夾內,再/opt/docker/www/dedecms新建一Dockerfile文件,操作后的/opt/docker/www/dedecms目錄應該類似這樣。
編輯Dockerfile文件內容如下:

解釋下每行命令

在Dockerfile中第一條非注釋INSTRUCTION一定是FROM,它決定了以哪一個鏡像作為基准,<image>首選本地是否存在,如果不存在則會從公共倉庫下載(當然也可以使用私有倉庫的格式)。這里引用了eboraas最新的apache-php集成環境。

將文件<src>拷貝到container的文件系統對應的路徑<dest>下。
其中<src>可以是文件、文件夾,對於文件和文件夾<src>必須是在Dockerfile的相對路徑下,即只能是相對路徑且不能包含../path/。
<dest>只能是容器中的絕對路徑。如果路徑不存在則會自動級聯創建,根據你的需要是<dest>里是否需要反斜杠/,習慣使用/結尾從而避免被當成文件。
與ADD命令相比,ADD支持遠程URL獲取文件,但官方認為是strongly discouraged,建議使用wget或curl代替。
COPY的語法和功能與ADD相同,只是不支持上面講到的<src>是遠程URL、自動解壓這兩個特性,但是Best Practices for Writing Dockerfiles建議盡量使用COPY,並使用RUN與COPY的組合來代替ADD,這是因為雖然COPY只支持本地文件拷貝到container,但它的處理比ADD更加透明,建議只在復制tar文件時使用ADD,如ADD trusty-core-amd64.tar.gz /,會先自動解壓內容再COPY到在容器的/目錄下。
在本例中

復制相對於Dockerfile文件位置的src/下的所有內容到/var/www/html/下:

RUN指令會在當前鏡像的頂層執行任何命令,並commit成新的(中間)鏡像,提交的鏡像會在后面繼續用到。
另外RUN命令的格式有兩種寫法。
shell格式,相當於執行/bin/sh -c "<command>":
RUN apt-get install vim -y
exec格式,不會觸發shell,所以$HOME這樣的環境變量無法使用,但它可以在沒有bash的鏡像中執行,而且可以避免錯誤的解析命令字符串:

功能與shell風格相同
配置Flag項>>
進入src目錄,配置你需要的Flag項目,然后就可以打包了。
打包成鏡像>>
創建完上面的Dockerfile后在當前目錄執行。

命令原型

稍等片刻就可以運行docker images指令並能看到名為ctf,TAG為list1的鏡像了。
以上就是搭建WEB Docker靶場的全部內容,你學會了嗎?