mysql不要放docker,Docker从入门到放弃
本文將以比較簡單的的方式讓大家理解docker,以平時常用到的測試環境為主,從用開始,慢慢理解docker。
0x00 用docker進行漏洞測試
0x01 docker運行busybox
0x02 Docker 搭建運行apache-php環境
0x03 用Dockerfile自動化構建可ssh登陸的鏡像
0x04 Docker搭建一個wordpress博客
0x05 Docker容器互聯
0x06 Docker安全
vulhub是一個開源的漏洞環境靶場(膜拜p牛一波)
接下來我們用docker來搭建一個jboss反序列漏洞的環境吧。
準備:Docker Docke-compose
以上環境安裝方法:Docker安裝?Docker-compose安裝
什么?一開始就學這么難的?其實docker邊用邊學是比較合適的,用到什么學什么,沒有必要從一大堆原理開始學。既然要學docker,那就先裝一個啦,邊學邊用。
那接下來就開始吧,其實也就一條命令。
復制如上鏈接,然后保存到文件docker-compose.yml,結果如下:?接下來,我們只需要
docker-compose up -d好了我們的靶場搭建完畢,訪問?localhost:8080
接下來就可以進行漏洞復現了,步驟見:
接下來我們邊搭建環境邊學習簡單的docker命令
Busybox是一個集成了三百多個最常用Linux命令和工具的軟件,簡單的cat ls echo等命令都集成在內,當然也有很多復雜的命令,我們就先來試試使用docker安裝一個busybox吧
docker pull busybox
好了,我們 從docker官方庫中得到了一個鏡像
可以通過 docker images 查看到id以及其他信息,這里可以看到busybox鏡像大小只有1mb左右
那接下來我們用這個id為8c811b4aec35的busybox鏡像運行一下命令吧
先用來看下ifconfig命令
docker run 8c811b4aec35 ifconfig
可以看到,docker使用busybox鏡像創建了一個busybox容器,并且運行了我們的測試命令,而且docker運行的容器有自己的ip地址,這說明容器是一個相對獨立的環境。
首先搜索下有哪些現成的apache-php環境
docker search apache-php這里我們選擇別人已經構建好的start數目較多的鏡像:eboraas/apache-php
docker pull eboraas/apache-php
部署完成?還是用?docker images查看我們pull到本地的鏡像
docker images
接下來我們進入到id為?1e9f5e13fb38的容器
和之前的命令有些區別,因為我們運行的是web服務,所以我們需要把容器內部端口映射出來這樣我們才能用外部的瀏覽器訪問它。
docker run -itd -p 80:80 1e9f5e13fb38好了,一個apache+php的容器就可以搭建成功,我們?可以在上面搭建其他服務了。
我們可以在宿主機curl測試一下我們?是否搭建成功(將容器放入后臺可以使用ctrl p+q)
那我們?php環境怎么樣了呢?那就寫一個phpinfo?頁面試試吧
php頁面?創建好了,接下來我們需要將他放在docker容器的web根目錄?里,?這里需要用到docker cp命令
使用docker?cp?命令復制到容器的web根目錄/var/www/html/,這?里指定容器我直接?簡寫了開頭的標識 4c1
可以看到,環境已經搭建好了。
我們已經在容器內做了改動?了,此時,如果我們停止容器,我們?的改動將會消失,如果我們想保存容器,那么就需要將我?們?的容器提交成鏡像。
首先用docker commit提交成新鏡像
docker commit -a “hayasec” -m "test.php" 4c1 haya/test此時可以查看一下鏡像id然后使用docker save將鏡?像導出
接下來我們可以將test.tar放到其他機器上,然后用docker load命令就可以進?行再次部署了。這里已經載入鏡?像了,我們可以用docker?tag?命令對docker鏡像?進行命名
這時候有個小問題,之前我們運行了一個apache-php容器,現在我們已經不需要它了,所以我們用docker ps查看鏡像id然后用docker stop 鏡像id 來停止它。
Dockerfile是由一系列命令和參數構成的腳本,這些命令應用于基?礎鏡?像并最終創建一個新的鏡像。
接下來就利用之前我們pull下來的apache-php鏡像來制作一個可以ssh登陸的鏡像吧
這里需要創建三個文件 Dockerfile run.sh?sources163.txt,處于同級目錄。
dockerfile如下內容如下:
FROM eboraas/apache-php #設置基礎鏡像鏡像
MAINTAINER haya #指定作者
COPY sources163.txt /etc/apt/sources.list #更換國內源
RUN apt-get -y update
RUN apt-get install -y openssh-server --force-yes #安裝ssh服務
RUN mkdir -p /root/.ssh #創建ssh目錄
ADD run.sh /run.sh #將run.sh添加到容器內
RUN chmod 755 /run.sh
EXPOSE 22 #為暴漏容器運行時的監聽端口給外部
EXPOSE 80
EXPOSE 443
CMD ["/run.sh"] #容器啟動時要運行的命令run.sh文件內容如下:
#!/bin/bash
service ssh startsources163.txt內容如下:
deb trusty main restricted universe multiverse
deb trusty-security main restricted universe multiverse
deb trusty-updates main restricted universe multiverse
deb trusty-proposed main restricted universe multiverse
deb trusty-backports main restricted universe multiverse
deb-src trusty main restricted universe multiverse
deb-src trusty-security main restricted universe multiverse
deb-src trusty-updates main restricted universe multiverse
deb-src trusty-proposed main restricted universe multiverse
deb-src trusty-backports main restricted universe multiverse然后利用這個dockerfile構建鏡像
鏡像構建完畢后,可以看到:
然后運行鏡像
docker run -itd -p 22222:22 57b46801d43c這時候看到,內部容器的ssh服務的22端口已經被映射到本機22222?端口了
接下來通過ssh服務連接容器
這時候有個問題,我們并不知道容器的密碼是多少?怎么辦呢?
而且這里需要注意一點是ssh的默認配置是不允許root登錄的,我們需要添加一個用戶或者修改sshd_config,這里進入容器的方法就有很多了
第一種:進入容器添加用戶
第二種:最開始build鏡像的時候將自己的公鑰添加進容器內的~/.ssh/authorized_keys,然后實現免密碼ssh?登錄
第三:通過docker exec -it 98defd0c6e6b /bin/bash進入容器添加用戶修改密碼,在通過ssh登錄
第四:修改ssh配置文件
這里說一下第一種,我們先用docker exec進入容器,然后添加一個可登錄的用戶
添加用戶、修改完密碼之后,我們再次登錄
到這里,我們就完成了利用dockerfile對原鏡像添加功能。
隨后我們可以通過docker commit將目前我們修改過的容器再次提交成一個新的鏡像。
最開始我們盡量使用最簡單方法部署,這里我們用到的是docker-compose。
Docker Compose?是?Docker?官方?編排(Orchestration)項?目之一,?負責快速的部署分布式應用
這里用到的github中的一個開源項目,作者已經編寫好用于worfpress的docker-compose文件,接下來我們只需要直接部署就行。
我們將項目clone下來
docker-compose.yml是容器運行的關鍵,具體編寫方法可以參考:
我們clone下來的是別人寫好的項目,所以可以直接用了
然后docker-compose up -d啟動
接下來講解docker容器通信。
網上大量文章采用docker link進行連接,根據目前官方文檔?—link是一個被遺棄,最終可能會被刪除的命令。
所以這里我們使用docker networks進行容器連接,我們將啟動兩個容器,一個apache-php 一個mysql,然后用docker network對容器進行連通。
首先創建一個名為test-net的網絡,默認連接方式bridge.
啟動一個mysql容器,映射3306端口,連接到test-net網絡,設置別名為db,設置mysql密碼為password
啟動一個apache-php容器,映射80端口,連接到test-net網絡,設置別名為web
tips:遇到容器已經存在的報錯
docker停止所有容器 docker stop?$(docker ps -q)
docker刪除所有容器?docker rm?$(docker ps -aq)
接下來我們進入到其中一個容器,初始容器是沒有ping命令的,所以我們現在安裝ping
然后安裝ping
apt-get install iputils-ping接下里我們在apache-php容器ping mysql容器,可以看到mysql容器與apache?容器實現互聯。
docker安全主要體現在以下方面:
docker容器的安全性
鏡像的安全性
docker daemon的安全性
———-摘自 Docker進階與實戰
容器安全性的根源在于,容器和host共用內核,因此受攻擊面特別大。
這里就拋磚引玉地講一下docker虛擬機逃逸。
Docker與宿主機是共享內核的,一旦內核出現漏洞,那么docker容器的安全問題將危機到宿主機。
這里以大名鼎鼎的Dirty COW臟牛為例,演示docker逃逸。
在做這個實驗之前,我們先了解下臟牛漏洞。
臟牛是一個linux本地提權漏洞,臟牛漏洞(CVE-2016_5195)是公開后影響范圍?最廣和最深的漏洞之一,這十年來的每一個Linux版本,包括?Android?、桌面版和服務器版都受到其影響。
我們現在一個下載一個ubuntu14.04?鏡像來對漏洞進行?簡單地復現
為了試驗方便,我選擇直接用vmware搭建虛擬機。
Docker利用臟牛逃逸的關鍵在于宿主機存在臟牛漏洞
這樣的內核版本是存在臟牛的,我們可以在主機上創建一個低權限用戶(可讀權限即可),然后提權,由于可讀即可寫,所以利用方式很多,具體見:
通過替換/ etc / passwd為用戶提供root權限
git clone make編譯運行。
這樣就可以直接提權了,這節主要關注docker安全,所以這里不再細講。
接下來我們給虛擬機安裝docker
apt-get install docker.io
然后pull一個帶了POC的容器(這樣做主要是為了方便,當然也可以用其他的)
然后運行鏡像?進入容器?make編譯POC
注意,這里并不是每次都能成功的,失敗之后vdso_patch數組也會被填充,payload的內存地址數據不?為0,無法再次復現。失敗輸出:
[-] failed to win race condition…
[-] failed to restore vDSO
這時候無法再次做實驗了,如果用虛擬機的話做之前最好做一個快照。
這里可以看到,已經完全獲得宿主機的權限了。
實際生產環境中,還經常遇到一個問題
docker通過環境變量的方式傳遞?MySQL?存儲引擎的密碼,所以造成mysql?密碼是明文
比較流行的解決辦法是
1.創建兩個 MySQL 容器 MySQL1 與 MySQL2,MySQL 的 root 密碼分別為 daocloud 與 docker;
2.待 MySQL1 啟動完畢,使用docker stop命令停止 MySQL1 容器,并將 MySQL1 容器的 volume1 全部拷貝出來,最終使用docker rm命令刪除 MySQL1 容器;
3.待 MySQL2 啟動完畢,使用docker stop命令停止 MySQL2 容器,并將 MySQL2 容器 volume2 內的文件全部刪除,接著將 volume1 的內容拷貝至 volume2 下,最終啟動 MySQL2。
還可以使用docker swarm 提供的 secret 機制,它允許將敏感信息加密后保存到 secret 中,用戶可以指定哪些容器可以使用此 secret
詳見:如何使用swarm中的secret
最后的建議:Docker近幾年發展迅速,官方為Docker的發展付出了很大的努力。官方了大量的官方文檔可以幫助我們更好地理解和使用Docker,日常閱讀官方文檔、更新日志是很有必要的。
Docker官方文檔
Docker命令文檔
總結
以上是生活随笔為你收集整理的mysql不要放docker,Docker从入门到放弃的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html控制浏览器宽度和高度,html
- 下一篇: linux 禁用 内核 驱动程序,Lin