Docker暴露2375端口,引起安全漏洞
今天有小夥伴發現Docker暴露出2375端口,引起了安全漏洞。我現在給大家介紹整個事情的來龍去脈,並告訴小夥伴們,怎麼修復這個漏洞。
爲了實現集羣管理,Docker提供了遠程管理接口。Docker Daemon作爲守護進程,運行在後臺,可以執行發送到管理接口上的Docker命令。正是因爲錯誤的使用了Docker遠端接口,引起安全漏洞。
啓動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是美國的使用率最高,國內也會在一兩年內大規模使用Docker。所有小夥伴們必須解決安全問題。
黑客在查詢到主機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.用戶在精靈雲管理平臺上註冊
2.進入控制檯,通過導航欄->集羣->我的主機,選擇接入新主機。把主機加入到精靈雲管理平臺。
3.控制檯提供了圖形化操作界面和完整的Docker操作,用戶可以方便的創建、克隆、快照、刪除容器。同時精靈雲管理平臺也提供了鏡像倉庫服務,爲你提供豐富的容器鏡像。精靈雲鏡像倉庫使用OSS對象存儲,採用了安全認證,保證你的鏡像不會泄露。