Mark Ku's Blog
首頁 關於我
防範蠕蟲的Docker的遠程管理攻擊
DevOps
防範蠕蟲的Docker的遠程管理攻擊
Mark Ku
Mark Ku
December 24, 2024
1 min

時空背景

先前將台灣的開發環境從 Windows 11 換成 Linux 後,沒想到,在網路設備中發異常流量,甚至導致網路堵塞。

原本開發環境是採用 Windows 11 ,由於微軟已針對蠕蟲和惡意程式提供許多防護措施,使得系統的安全性相對較高,但 Linux,並沒有不安全,只資訊安全需要自行控管,像是有次網路分享資料庫(samba),忘了限制寫入權限,放幾個晚上,該資料夾出現一些不明的exe。

初步調查

剛開始以為是安裝了不該裝的軟體,導致 NAT 流量異常,但經過多次移除軟體與交叉測試,問題依舊存在。最終,在 Docker 容器中發現了幾個異常的容器服務,顯然問題出在這裡。

即使在防火牆上限制 TCP/IP 300個連線數,但路由器仍然頻繁被打爆,導致辦公室網路多次癱瘓。

找到關鍵問題

經過調查,最後在Docker Host 中多出了幾個異常的Ubuntu的容器在運行,進而推測,內網可能有人的電腦中了蠕蟲,而蠕蟲透過Docker 的遠端管理連接埠,拉取的官方的Ubuntu Docker 映像檔,並可以連線進容器中做任何的操作,並利用這些惡意容器耗盡主機資源,包括網路、CPU 和硬碟,或偷取資料。

docker 中跑出不明的容器
docker 中跑出不明的容器

如何避免類似問題

了解蠕蟲如何利用 Docker 權限過大的漏洞後,在找到蠕蟲在那台電腦之前,我決定加上 TLS 憑證來強化安全性,防止開發機的 Docker 被駭客劫持。

預先準備

  • 開發機(Docker 主機):Ubuntu(192.168.0.123),並開啟遠端管理端口
  • Docker 遠程管理 - 用戶端:Windows 11
  • 環境需求:在兩台機器上安裝 Docker

產生 TLS 憑證的步驟

1. 在 Ubuntu Docker Host 主機上生成 CA 金鑰,並輸入憑證密碼

openssl genrsa -aes256 -out ca-key.pem 4096

提示:輸入密碼時需妥善保存。

生成 CA 憑證:

openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem

2. 生成伺服器金鑰與憑證

生成伺服器金鑰:

openssl genrsa -out server-key.pem 4096

生成伺服器憑證簽署請求 (CSR):

openssl req -subj "/CN=*" -sha256 -new -key server-key.pem -out server.csr

使用 CA 簽署伺服器憑證:

openssl x509 -req -days 1000 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem

3. 生成客戶端金鑰與憑證

生成客戶端金鑰:

openssl genrsa -out key.pem 4096

生成客戶端憑證簽署請求 (CSR):

openssl req -subj "/CN=client" -new -key key.pem -out client.csr

使用 CA 簽署客戶端憑證:

openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem

4. 修改 Docker 配置文件

編輯 Docker 服務配置:

vim /lib/systemd/system/docker.service

ExecStart 修改為以下內容:

ExecStart=/usr/bin/dockerd --tlsverify --tlscacert=/var/tls/ca.pem --tlscert=/var/tls/server-cert.pem --tlskey=/var/tls/server-key.pem -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock

5. 設置文件權限

設置金鑰和憑證的權限:

chmod 0400 ca-key.pem server-key.pem key.pem
chmod 0444 ca.pem server-cert.pem cert.pem

6. 複製憑證到遠程客戶端

使用 SCP 將憑證複製到 Windows 客戶端:

scp -r [email protected]:/var/tls E:\tls

Windows 用戶可以將憑證放入 %USERPROFILE%/.docker 資料夾中,以便自動使用憑證連線。(ca.pem 和 cert.pem 及 key.pem )

copy certificate
copy certificate

7. 重啟 Docker 服務

重載並重啟 Docker:

systemctl daemon-reload
systemctl restart docker

測試

透過原先可以直接不透過憑證管理Docker 的指令測試

docker  -H="tcp://192.168.0.123:2376" ps

現在沒有 tls 憑證,就不允許管理 Docker

Error response from daemon: Client sent an HTTP request to an HTTPS server.

接著,我們我們帶上 tls 的憑證,就能遠端管理 Docker

docker --tls -H="tcp://192.168.0.123:2376" ps

docker ps with tls
docker ps with tls

結語

加上 tls 後 就沒在跑出不明容器或塞爆NAT 的狀,但真的沒想到未加密的Docker 遠程管理連接埠,這麼容易被蠕蟲利用,資訊安全在Linux 上格外的重要,最後通過部署 TLS 憑證,有效提昇 Docker 遠程管理的安全性,避免因駭客利用漏洞造成的資源損耗與網路癱瘓,同時,建議定期審核 Docker 容器與映像檔來源,以降低安全風險。

參考


Tags

Mark Ku

Mark Ku

Software Developer

10年以上豐富網站開發經驗,開發過各種網站,電子商務、平台網站、直播系統、POS系統、SEO 優化、金流串接、AI 串接,Infra 出身,帶過幾次團隊,也加入過大團隊一起開發。

Expertise

前端(React)
後端(C#)
網路管理
DevOps
溝通
領導

Social Media

facebook github website

Related Posts

Ubuntu 22.04 上的 Kubernetes 安裝與配置教學
Ubuntu 22.04 上的 Kubernetes 安裝與配置教學
November 10, 2024
1 min

Quick Links

關於我

Social Media