Docker實戰 | 第四篇:Docker啟用TLS加密解決暴露2375埠引發的安全漏洞,被黑掉三臺雲主機的教訓總結
阿新 • • 發佈:2020-12-07
## 一. 前言
在之前的文章中 [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)