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