今天有小夥伴發現Docker暴露出2375,引起了安全漏洞。我現在給大家介紹整個事情的來龍去脈,並告訴小夥伴們,怎麼修復這個漏洞。

為了實現集群管理,Docker提供了遠程管理介面。Docker Daemon作為守護進程,運行在後台,可以執行發送到管理介面上的Docker命令。正是因為錯誤的使用了Docker遠端介面,引起安全漏洞。

Docker暴露2375埠,引起安全漏洞

啟動Docker Daemon時,加入-H 0.0.0.0:2375,Docker Daemon就可以接收遠端的Docker Client發送的指令。注意,Docker是把2375埠作為非加密埠暴露出來,一般是用在測試環境中。此時,沒有任何加密和認證過程,只要知道Docker主機的IP,任何人都可以管理這台主機上的容器和鏡像。

漏洞是什麼

國內牛人開發了一套牛逼的搜索引擎-鍾馗之眼,可以掃描出主機上的暴露的埠。在ZoomEye.org上輸入關鍵字docker port:2375,立即可以掃描出所有暴露了2375埠的Docker主機。因為沒有加密,知道了主機IP以後,黑客就可以為所欲為了。 目前全球有717台機器暴露出2375埠!真是太可怕了!

Docker暴露2375埠,引起安全漏洞

這些主機分布在全球各個國家,其中,美國的主機最多。這是因為Docker是美國的使用率最高,國內也會在一兩年內大規模使用Docker。所有小夥伴們必須解決安全問題。

Docker暴露2375埠,引起安全漏洞

黑客在查詢到主機IP以後,就可以管理這些主機上的容器了。

docker -H IP:2375 infoContainers: 8 Running: 8 Paused: 0 Stopped: 0 Images: 62 Server Version: 1.11.0 

通過這個漏洞,甚至可以獲取主機信息。攻擊者簡直就能為所欲為。

docker -H IP:2375 run --rm -v /:/root alpine cat /root/etc/hostnamedocker-node-5 

如何發現漏洞

小夥伴們,趕快檢查一下你的Docker是否暴露了2375埠。

1.檢查docker daemon進程,查看是否開啟2375埠。

ps -ef | grep docker/usr/bin/docker daemon -H=tcp://0.0.0.0:2375 

2.通過遠程管理的方式,向Docker主機發送命令。

docker -H 192.168.0.10:2375 infoContainers: 41 Running: 16 Paused: 0 Stopped: 25 Images: 821 Server Version: 1.10.3

如何修復該漏洞

如果要安全的管理遠程Docker主機,應該怎麼做呢?其實,Docker本身提供了加密的遠程管理埠2376,配合CA證書,就能提供TLS連接了。

首先要準備5個證書和秘鑰文件,分別是ca.pem、server-cert.pem、server-key.pem、client-cert.pem和client-key.pem。其中,server-cert.pem中限制了能夠訪問Docker主機的客戶端列表。

啟動Docker Deamon時,需要設置-H、–tls、–tlscacert=ca.pem、–tlscert=server-cert.pem和–tlskey=server-key.pem。此時,只有客戶端列表中的主機能夠訪問Docker主機。

具體配置比較複雜,我現在為大家詳細介紹這些步驟。

1.生成CA私鑰ca-key.pem,使用該私鑰對CA證書籤名。

ca-key.pem是一個臨時文件,最後可以刪除。

openssl genrsa -out ~/docker/ca-key.pem 4096

2.使用CA私鑰生成自簽名CA證書ca.pem。生成證書時,通過-days 365設置證書的有效期。單位為天,默認情況下為30天。

openssl req -x509 -sha256 -batch -subj '/C=CN/ST=Sichuan/L=Chengdu/O=Ghostcloud Co.,Ltd/OU=Laboratory/CN=www.ghostcloud.cn' -new -days 365 -key ~/docker/ca-key.pem -out ~/docker/ca.pem

生成CA證書時,需要提供一些公司信息。


C表示國家,中國為CN。

ST表示省,比如Sichuan。

L表示城市,比如Chengdu。

O表示公司,比如Ghostcloud Co.,Ltd。

OU表示部門名字,比如Laboratory。

CN表示公司域名,比如www.ghostcloud.cn。

3.生成伺服器私鑰server-key.pem和CSR(Certificate Signing Request)server-csr.pem。CN為DockerDaemon。

server-csr.pem是一個臨時文件,生成server-cert.pem以後,可以刪除。

openssl genrsa -out ~/docker/server-key.pem 4096openssl req -subj '/CN=DockerDaemon' -sha256 -new -key ~/docker/server-key.pem -out ~/docker/server-csr.pem

4.使用CA證書生成伺服器證書server-cert.pem。TLS連接時,需要限制客戶端的IP列表或者域名列表。只有在列表中的客戶端才能通過客戶端證書訪問Docker Daemon。在本例中,只允許127.0.0.1和192.168.1.100的客戶端訪問。如果添加0.0.0.0,則所有客戶端都可以通過證書訪問Docker Daemon。

allow.list是一個臨時文件,生成server-cert.pem以後,可以刪除。

echo subjectAltName = IP:127.0.0.1,IP:192.168.1.100 > ~/docker/allow.listopenssl x509 -req -days 365 -sha256 -in ~/docker/server-csr.pem -CA ~/docker/ca.pem -CAkey ~/docker/ca-key.pem -CAcreateserial -out ~/docker/server-cert.pem -extfile ~/docker/allow.list

5.生成客戶端私鑰client-key.pem和CSRclient-csr.pem。CN為DockerClient。

client-csr.pem是一個臨時文件,生成client-cert.pem以後,可以刪除。

openssl genrsa -out ~/docker/client-key.pem 4096openssl req -subj '/CN=DockerClient' -new -key ~/docker/client-key.pem -out ~/docker/client-csr.pem

6.使用CA證書生成客戶端證書client-cert.pem。需要加入extendedKeyUsage選項。

echo extendedKeyUsage = clientAuth > ~/docker/options.listopenssl x509 -req -days 365 -sha256 -in ~/docker/client-csr.pem -CA ~/docker/ca.pem -CAkey ~/docker/ca-key.pem -CAcreateserial -out ~/docker/client-cert.pem -extfile ~/docker/options.list

7.成功生成了需要的證書和秘鑰,可以刪除臨時文件。

rm -f ~/docker/server-csr.pem ~/docker/client-csr.pem ~/docker/allow.list ~/docker/options.list

8.為了保證證書和私鑰的安全,需要修改文件的訪問許可權。

chmod 0444 ~/docker/ca.pem ~/docker/server-cert.pem ~/docker/client-cert.pemchmod 0400 ~/docker/ca-key.pem ~/docker/server-key.pem ~/docker/client-key.pem

9.重啟Docker Daemon,加入ca.pem、server-cert.pem和server-key.pem。-H=0.0.0.0:2376表示Docker Daemon監聽在2376埠。

docker daemon --tlsverify --tlscacert=~/docker/ca.pem --tlscert=~/docker/server-cert.pem --tlskey=~/docker/server-key.pem -H=0.0.0.0:2376

10.在客戶端,運行docker命令時,加入ca.pem、client-cert.pem和client-key.pem。本例中,只有127.0.0.1和192.168.1.100的客戶端可以訪問Docker Daemon。

docker --tlsverify --tlscacert=~/docker/ca.pem --tlscert=~/docker/client-cert.pem --tlskey=~/docker/client-key.pem -H=tcp://127.0.0.1:2376 infoContainers: 41 Running: 16 Paused: 0 Stopped: 25 Images: 821 Server Version: 1.10.3 

現在小夥伴們就可以安全的遠程控制Docker主機了。

精靈雲Docker遠程管理解決方案

生成CA證書的過程複雜而繁瑣,稍有錯誤,就不能啟動安全連接。精靈云為用戶提供了基於TLS的Docker遠程管理解決方案,用戶可以通過精靈雲管理平台,安全的管理自己的Docker主機。

1.用戶在精靈雲管理平台上註冊

Docker暴露2375埠,引起安全漏洞

2.進入控制台,通過導航欄->集群->我的主機,選擇接入新主機。把主機加入到精靈雲管理平台。

Docker暴露2375埠,引起安全漏洞

3.控制台提供了圖形化操作界面和完整的Docker操作,用戶可以方便的創建、克隆、快照、刪除容器。同時精靈雲管理平台也提供了鏡像倉庫服務,為你提供豐富的容器鏡像。精靈雲鏡像倉庫使用OSS對象存儲,採用了安全認證,保證你的鏡像不會泄露。