docker開(kāi)通2375端口防漏洞問(wèn)題
前言
最近因?yàn)樽约旱脑品?wù)器開(kāi)放了Docker 2375端口,導(dǎo)致被注入蠕蟲(chóng),一直在跑挖礦程序。
所以大家一定要注意外網(wǎng)環(huán)境下不要輕易打開(kāi)此端口,如果要對(duì)外開(kāi)放此端口,可以參考下面的解決方案,下面就Docker對(duì)外開(kāi)放2375端口引發(fā)安全漏洞進(jìn)行一個(gè)詳細(xì)的說(shuō)明。
緣由
2375:未加密的docker socket,遠(yuǎn)程root無(wú)密碼訪問(wèn)主機(jī)為了實(shí)現(xiàn)集群管理,Docker提供了遠(yuǎn)程管理接口。
Docker Daemon作為守護(hù)進(jìn)程,運(yùn)行在后臺(tái),可以執(zhí)行發(fā)送到管理接口上的Docker命令。
正是因?yàn)殄e(cuò)誤的使用了Docker遠(yuǎn)端接口,引起安全漏洞。
啟動(dòng)Docker Daemon時(shí),加入-H 0.0.0.0:2375,Docker Daemon就可以接收遠(yuǎn)端的Docker Client發(fā)送的指令。
注意,Docker是把2375端口作為非加密端口暴露出來(lái),一般是用在內(nèi)網(wǎng)環(huán)境中。
此時(shí),沒(méi)有任何加密和認(rèn)證過(guò)程,只要知道Docker主機(jī)的IP,任何人都可以管理這臺(tái)主機(jī)上的容器和鏡像。
黑客可以?huà)呙璩鲋鳈C(jī)上的暴露的端口,因?yàn)闆](méi)有加密,知道了主機(jī)IP以后,黑客就可以為所欲為了。
解決方案
知道了來(lái)龍去脈,下面就如何安全開(kāi)放Docker 2375端口進(jìn)行一個(gè)詳細(xì)的介紹。
我們可以通過(guò)添加安全傳輸層協(xié)議(TLS)和CA認(rèn)證對(duì)2375端口進(jìn)行一個(gè)驗(yàn)證。
這樣黑客只要拿不到我們的證書(shū)秘鑰,就無(wú)法進(jìn)行攻擊了。
1. 創(chuàng)建一個(gè)目錄用于存儲(chǔ)生成的證書(shū)和秘鑰
mkdir /docker-ca && cd /docker-ca
2. 使用openssl創(chuàng)建CA證書(shū)私鑰
期間需要輸入兩次密碼,生成文件為ca-key.pem
openssl genrsa -aes256 -out ca-key.pem 4096 Enter pass phrase for ca-key.pem: Your password (hylink2014)
3. 根據(jù)私鑰創(chuàng)建CA證書(shū)
期間需要輸入上一步設(shè)置的私鑰密碼,然后依次輸入國(guó)家是 CN,省例如是Guangdong、市Guangzhou、組織名稱(chēng)、組織單位、姓名或服務(wù)器名、郵件地址,都可以隨意填寫(xiě),生成文件為ca.pem(注意證書(shū)有效期)
openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem
4. 創(chuàng)建服務(wù)端私鑰
生成文件為server-key.pem
openssl genrsa -out server-key.pem 4096
5. 創(chuàng)建服務(wù)端證書(shū)簽名請(qǐng)求文件
用于CA證書(shū)給服務(wù)端證書(shū)簽名。IP需要換成自己服務(wù)器的IP地址,或者域名都可以。生成文件server.csr
openssl req -subj "/CN=Your server IP" -sha256 -new -key server-key.pem -out server.csr openssl req -subj "/CN=35.1.176.8" -sha256 -new -key server-key.pem -out server.csr
6. 配置白名單,用多個(gè)用逗號(hào)隔開(kāi)
例如: IP:192.168.0.1,IP:0.0.0.0,這里需要注意,雖然0.0.0.0可以匹配任意,但是仍然需要配置你的服務(wù)器IP,如果省略會(huì)造成錯(cuò)誤
echo subjectAltName = IP:Your server IP,IP:0.0.0.0 >> extfile.cnf echo subjectAltName = IP:35.1.176.8,IP:0.0.0.0 >> extfile.cnf
7. 將Docker守護(hù)程序密鑰的擴(kuò)展
使用屬性設(shè)置為僅用于服務(wù)器身份驗(yàn)證
echo extendedKeyUsage = serverAuth >> extfile.cnf
8. 創(chuàng)建CA證書(shū)簽名好的服務(wù)端證書(shū)
期間需要輸入CA證書(shū)私鑰密碼,生成文件為server-cert.pem
openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem \-CAcreateserial -out server-cert.pem -extfile extfile.cnf
9. 創(chuàng)建客戶(hù)端私鑰
生成文件為key.pem
openssl genrsa -out key.pem 4096
10. 創(chuàng)建客戶(hù)端證書(shū)簽名請(qǐng)求文件
用于CA證書(shū)給客戶(hù)證書(shū)簽名,生成文件client.csr
openssl req -subj '/CN=client' -new -key key.pem -out client.csr
11. 要使密鑰適合客戶(hù)端身份驗(yàn)證
請(qǐng)創(chuàng)建擴(kuò)展配置文件
echo extendedKeyUsage = clientAuth >> extfile.cnf
12. 創(chuàng)建CA證書(shū)簽名好的客戶(hù)端證書(shū)
期間需要輸入CA證書(shū)私鑰密碼,生成文件為cert.pem
openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem \-CAcreateserial -out cert.pem -extfile extfile.cnf
13. 刪除不需要的文件
兩個(gè)證書(shū)簽名請(qǐng)求
rm -v client.csr server.csr
14. 修改證書(shū)為只讀權(quán)限保證證書(shū)安全
chmod -v 0400 ca-key.pem key.pem server-key.pem chmod -v 0444 ca.pem server-cert.pem cert.pem
15. 歸集服務(wù)器證書(shū)
cp server-*.pem /etc/docker/ && cp ca.pem /etc/docker/
最終生成文件如下,有了它們我們就可以進(jìn)行基于TLS的安全訪問(wèn)了
ca.pem CA證書(shū)
- ca-key.pem CA證書(shū)私鑰
- server-cert.pem 服務(wù)端證書(shū)
- server-key.pem 服務(wù)端證書(shū)私鑰
- cert.pem 客戶(hù)端證書(shū)
- key.pem 客戶(hù)端證書(shū)私鑰
16. 配置Docker支持TLS
修改docker.service文件
vi /usr/lib/systemd/system/docker.service
實(shí)際位置:
vi /etc/systemd/system/docker.service
修改以ExecStart開(kāi)頭的配置,開(kāi)啟TLS認(rèn)證,并配置好CA證書(shū)、服務(wù)端證書(shū)和服務(wù)端私鑰
ExecStart=/usr/bin/dockerd --tlsverify --tlscacert=/etc/docker/ca.pem --tlscert=/etc/docker/server-cert.pem --tlskey=/etc/docker/server-key.pem -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
重新加載daemon
systemctl daemon-reload && systemctl restart docker
重啟docker
service docker restart
17. 在客戶(hù)端測(cè)試連接
保存相關(guān)客戶(hù)端的pem文件到本地
IDEA->Preferences->Bulild, Execution,Deployment->Docker->TCP socket
到此,Docker對(duì)外開(kāi)放2375端口再也不怕被攻擊了!
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
關(guān)于docker部署的jenkins跑git上的程序的問(wèn)題
這篇文章主要介紹了docker部署的jenkins跑git上的程序的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11k8s和Docker關(guān)系簡(jiǎn)單說(shuō)明
這篇文章主要介紹了k8s和Docker關(guān)系簡(jiǎn)單說(shuō)明,本文利于圖文講解的很透徹,有需要的同學(xué)可以研究下2021-03-03docker nginx 配置文件要點(diǎn)及注意事項(xiàng)
本文介紹了Nginx的配置要點(diǎn)及注意事項(xiàng),包括訪問(wèn)靜態(tài)資源、負(fù)載均衡等,在訪問(wèn)靜態(tài)資源時(shí),可以使用root或alias指令指定路徑,本文給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧2025-02-02