使用 Docker port publish 的注意事項

Docker 帶給開發者很多使用上的便利,不管在開發、測試、Production,都可以很快速的 setup 好我們所需要的環境
我們會很常需要將 Container 的 port publish 到我們的 host 上頭
讓我們看看 Nginx 官方的範例

1
$ docker run --name some-nginx -d -p 8080:80 some-content-nginx

我們可以看到在這裡使用了 -p (全名是 --publish) 來把 host 8080 跟 Container 80 port binding 在一起
此時的我們可以在瀏覽器輸入 localhost:8080, 就會看到 Nginx 的 歡迎畫面

事情沒這麼單純

Then you can hit http://localhost:8080 or http://host-ip:8080 in your browser.

仔細看了一下後頭的描述,才發現原來他幫我 bind 127.0.0.1 & 0.0.0.0,如果今天只是簡單的網頁開發那到無所謂
如果你今天悠閒的在咖啡店工作使用店裡的 Wi-Fi,剛好因為偷懶沒設定 docker 裡的 mongodb 權限,直接開放大家來參觀你的資料庫。

解法

為了避免悲劇發生,下面舉了幾個方法,依照你的狀況使用一個或多個來預防

1. 正確的 publish port

如果今天在 local development 我們不希望 container 的 port bind 到電腦外部,我們可以用下列指令來指定 port bind 127.0.0.1

1
$ docker run --name some-nginx -d -p 127.0.0.1:8080:80 some-content-nginx

2. 資料庫權限設定

即使是 local 的開發環境,還是不該偷懶設定一下帳號密碼,如果可以的話使用 key 認證更好
如果我們可以盡可能的顧好每個環節,就可以築起乳酪理論(Swiss Cheese Model) 裡的乳酪,避免資料外洩的可能。

3. 設定電腦的防火牆

設定好電腦的防火牆,讓他管理好電腦的 port 與 ip address 的進出權限管理,能夠最為最後一道防線。

乳酪理論 (Swiss Cheese Model)

乳酪理論 是一個著名的風險管理理論,將乳酪比擬成我們的安全防線,像是乳酪上的孔洞連成一線,就像是一層一層的安全漏洞所造成。
換句話說,我們應該盡可能的減少孔洞的發生,並增加防護的層數,只要其中一層擋下,就能夠避免漏洞的發生。

photo via wiki cc license

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×