1. 程式人生 > >Docker實戰 | 第四篇:Docker啟用TLS加密解決暴露2375埠引發的安全漏洞,被黑掉三臺雲主機的教訓總結

Docker實戰 | 第四篇:Docker啟用TLS加密解決暴露2375埠引發的安全漏洞,被黑掉三臺雲主機的教訓總結

## 一. 前言 在之前的文章中 [IDEA整合Docker外掛實現一鍵自動打包部署微服務專案](https://www.cnblogs.com/haoxianrui/p/14088400.html),其中開放了伺服器2375埠監聽,此做法卻引發出來一個安全問題,在上篇文章評論也有好心的童鞋提示,但自己心存僥倖心理,以為爭取時間就沒問題。 ![](https://i.loli.net/2020/12/06/uyTVlEq9h7mQ2kC.png) 想知道為什麼暴露2375不安全看一下大佬的具體操作 [傳送門](https://www.cnblogs.com/hanyifeng/p/5526799.html)。 寫這篇時候自己開放2375埠的3臺雲伺服器中招了,兩臺阿里雲伺服器root賬號被劫權,root這個超級使用者儼然已成為傀儡皇帝, 還有一臺ucloud伺服器被挖礦記憶體被打滿。意味著環境都要重新裝了,想洗洗睡的心都有了,做人真的不能裝~ ![](https://i.loli.net/2020/12/06/uYjnM6ZO4fmVk3R.png) ## 二. 實操 ### 1. 設定主機名 編輯/etc/hostname,伺服器主機名 `a.youlai.store` ``` vi /etc/hostname ``` ### 2. 生成TLS證書 建立證書生成指令碼 createcert.sh,放置/opt/sh目錄 ``` mkdir -p /opt/sh /opt/cert/docker touch /opt/sh/createcert.sh vim /opt/sh/createcert.sh ``` 在createcret.sh新增內容 ``` #!/bin/bash set -e if [ -z $1 ];then echo "請輸入Docker伺服器主機名" exit 0 fi HOST=$1 mkdir -p /opt/cert/docker cd /opt/cert/docker openssl genrsa -aes256 -out ca-key.pem 4096 openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem openssl genrsa -out server-key.pem 4096 openssl req -subj "/CN=$HOST" -sha256 -new -key server-key.pem -out server.csr # 配置白名單,推薦配置0.0.0.0,允許所有IP連線但只有證書才可以連線成功 echo subjectAltName = DNS:$HOST,IP:0.0.0.0 > extfile.cnf openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem -extfile extfile.cnf openssl genrsa -out key.pem 4096 openssl req -subj '/CN=client' -new -key key.pem -out client.csr echo extendedKeyUsage = clientAuth > extfile.cnf openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -extfile extfile.cnf rm -v client.csr server.csr chmod -v 0400 ca-key.pem key.pem server-key.pem chmod -v 0444 ca.pem server-cert.pem cert.pem ``` 執行 createcert.sh 指令碼,生成證書放置 /opt/cert/docker 目錄中 ``` # a.youlai.store是伺服器的主機名 sh /opt/sh/createcert.sh a.youlai.store ``` 按照提示輸入相關資訊,密碼一致,其他資訊可留空,等指令碼指定完成之後,可在 /opt/cert/docker 目錄檢視到生成的證書。 ![](https://i.loli.net/2020/12/06/WQqxMta7o34vTfL.png) ### 3. 配置Docker啟用TLS ``` vim /usr/lib/systemd/system/docker.service ``` 在ExecStart屬性後追加 ``` --tlsverify --tlscacert=/opt/cert/docker/ca.pem \ --tlscert=/opt/cert/docker/server-cert.pem \ --tlskey=/opt/cert/docker/server-key.pem \ -H tcp://0.0.0.0:2376 -H unix://var/run/docker.sock ``` ![](https://i.loli.net/2020/12/06/1vWsQmyfpC9DY6H.png) 重新載入docker配置後重啟 ``` systemctl daemon-reload systemctl restart docker ``` 檢視2376埠是否啟動 ``` netstat -nltp | grep 2376 ``` ![](https://i.loli.net/2020/12/06/s4uoR6pWBMmtAnr.png) **本地連線測試Docker API是否可用** - 沒有指定證書訪問測試 ``` curl https://a.youlai.store:2376/info ``` - 指定證書訪問測試 ``` curl https://a.youlai.store:2376/info --cert /opt/cert/docker/cert.pem --key /opt/cert/docker/key.pem --cacert /opt/cert/docker/ca.pem ``` ### 4. IDEA配置 將客戶端所需的祕鑰檔案從伺服器下載到本地 ![](https://i.loli.net/2020/12/06/dLPAsIak5KT7ogv.png) IDEA連線Docker配置修改 ![](https://i.loli.net/2020/12/06/T2ejKwkHlvpJ1fL.png) pom.xml ``` org.springframework.boot
spring-boot-maven-plugin
com.spotify docker-maven-plugin 1.0.0 build-image package build
${project.artifactId} latest openjdk:8-jdk-alpine / ["java","-jar","${project.build.finalName}.jar"]
https://a.youlai.store:2376 C:\certs\docker\a.youlai.store / ${project.build.directory} ${project.build.finalName}.jar
``` 打包測試 ![](https://i.loli.net/2020/12/07/OrHz6BQEuYqVA3a.png) 可以看到閘道器應用已成功部署至伺服器,詳細操作步驟請參考 [Docker實戰 | 第二篇:IDEA整合Docker外掛實現一鍵自動打包部署微服務專案](https://www.cnblogs.com/haoxianrui/p/14088400.html) ## 三. 結語 其實沒啥好說的,如果大家有云伺服器Docker API的2375埠暴露出來的話,建議新增TLS加密認證。不然被黑掉機率非常大,自己就是個活生生栗子,截止到凌晨一點半,還剩下一臺機器的環境沒有恢復,心累~ 如果大家有什麼問題,歡迎下方留言,看到第一時間回覆~ **最後再推薦一下開源專案: [youlai-mall](https://github.com/hxrui/youlai-mall.git)** > 後端 1. [Spring Cloud實戰 | 第一篇:Windows搭建Nacos服務 ](https://www.cnblogs.com/haoxianrui/p/13581881.html) 2. [Spring Cloud實戰 | 第二篇:Spring Cloud整合Nacos實現註冊中心](https://www.cnblogs.com/haoxianrui/p/13584204.html) 3. [Spring Cloud實戰 | 第三篇:Spring Cloud整合Nacos實現配置中心](https://www.cnblogs.com/haoxianrui/p/13585125.html) 4. [Spring Cloud實戰 | 第四篇:Spring Cloud整合Gateway實現API閘道器](https://www.cnblogs.com/haoxianrui/p/13608650.html) 5. [Spring Cloud實戰 | 第五篇:Spring Cloud整合OpenFeign實現微服務之間的呼叫](https://www.cnblogs.com/haoxianrui/p/13615592.html) 6. [Spring Cloud實戰 | 第六篇:Spring Cloud Gateway+Spring Security OAuth2+JWT實現微服務統一認證授權](https://www.cnblogs.com/haoxianrui/p/13719356.html) 7. [Spring Cloud實戰 | 最七篇:Spring Cloud Gateway+Spring Security OAuth2整合統一認證授權平臺下實現登出使JWT失效方案](https://www.cnblogs.com/haoxianrui/p/13740264.html) 8. [Spring Cloud實戰 | 最八篇:Spring Cloud +Spring Security OAuth2+ Vue前後端分離模式下無感知重新整理實現JWT續期](https://www.cnblogs.com/haoxianrui/p/14022632.html) > 管理前端 1. [vue-element-admin實戰 | 第一篇: 移除mock接入後臺,搭建有來商城youlai-mall前後端分離管理平臺](https://www.cnblogs.com/haoxianrui/p/13624548.html) 2. [vue-element-admin實戰 | 第二篇: 最小改動接入後臺實現根據許可權動態載入選單](https://www.cnblogs.com/haoxianrui/p/13676619.html) > 微信小程式 1. [vue+uniapp商城實戰 | 第一篇:【有來小店】微信小程式快速開發接入Spring Cloud OAuth2認證中心完成授權登入](https://www.cnblogs.com/haoxianrui/p/13882310.html)