天天看點

【實戰演練】隻需一行代碼,輕松解決Docker 和UFW 防火牆的安全漏洞

用過Docker 的人可能已經發現了,預設狀态下的Docker 有的時候并不總是遵守UFW 防火牆規則。今天在這裡為大家示範如何設定Docker來解決這一問題。

如果您在Linux上使用Docker,那麼您的系統防火牆可能會自動委托給UFW(Uncomplicated Firewall)防火牆。如果您不知道這一點的話,那麼很可能會引發由Docker 和UFW 防火牆結合使用所産生的安全問題。為什麼Docker 和UFW 防火牆結合使用會産生安全問題呢?因為Docker實際上繞過了UFW 防火牆,直接改變iptables(IP資訊包過濾系統),進而使容器綁定到端口。這意味着您所設定的所有UFW防火牆規則将不适用于Docker容器。

将設定UFW 防火牆(在Ubuntu Server 16.04上運作),使得SSH成為唯一被認可的通信。為此,我将在終端輸入以下指令:

一旦下達了上述指令,那麼将隻能通過預設的SSH(22)端口來通路機器。讓我們來測試一下,確定它是這樣的。我們将通過一個名為MongoDB的容器進行測試。一旦部署完成,我們是不能連接配接到容器的。為什麼呢?因為我們的防火牆隻允許SSH連接配接通路。

在Docker伺服器上,我們下載下傳MongoDB鏡像。這不是一個官方鏡像,我們隻是用它來進行測試。發出以下指令(作為docker組中的使用者)來下載下傳鏡像:

一旦鏡像下載下傳到機器上,我們就可以使用以下指令來部署MongoDB容器了:

現在,我們擁有了一個MongoDB容器來監聽27017端口(MongoDB的預設值)。如果我們使用另一台遠端機器(包含了mongodb-clients工具)嘗試連接配接到那個容器,我們應該無法連接配接通路。下面我将在這台遠端機器上輸入以下指令來進行測試:

其中SERVER_IP是我們的Docker伺服器的IP位址。

測試結果是我們并沒有被拒絕,而是連接配接到了該容器(如圖1所示)。

【實戰演練】隻需一行代碼,輕松解決Docker 和UFW 防火牆的安全漏洞

雖然我們将UFW防火牆設定為拒絕所有通信(除SSH),但是它竟然允許與MongoDB連接配接通路。

幸運的是,有一種方法可以解決這個問題。 回到Docker伺服器上的終端界面,并發出sudo nano /etc/default/docker 指令并添加以下指令:

儲存并關閉該檔案。使用sudo systemctl restart docker 指令來重新開機docker守護程序。現在,當您部署一個容器時,它将不再改變iptables并且嚴格遵守UFW防火牆的設定規則。下面我們繼續嘗試連接配接到MongoDB容器,這次卻提示連接配接失敗(如圖2所示)。

【實戰演練】隻需一行代碼,輕松解決Docker 和UFW 防火牆的安全漏洞

請注意,這可能意味着您必須直接設定UFW防火牆,以確定為您部署的容器打開必要的端口。對于本例來說,當我下達sudo ufw allow 27017 指令時,那麼我就可以正常連接配接到容器了。

Linux最好的一個方面就是它的靈活性。出現問題的時候,隻需要稍微搜尋下就能發現已經存在解決方案了。不要讓這個問題阻礙您使用Docker。隻需上述幾步,您就可以将容器和安全牢牢地綁定在一起了!

繼續閱讀