一. 前言
文末有驚喜!!希望會對您有幫助~
在之前的文章中 IDEA集成Docker插件實現一鍵自動打包部署微服務項目,其中開放了服務器2375端口監聽,此做法卻引發出來一個安全問題,在上篇文章評論也有好心的童鞋提示,但自己心存僥幸心理,以為爭取時間就沒問題。
想知道為什么暴露2375不安全看一下大佬的具體操作 傳送門。
寫這篇時候自己開放2375端口的3台雲服務器中招了,兩台阿里雲服務器root賬號被劫權,root這個超級用戶儼然已成為傀儡皇帝,有名無權,還有一台ucloud服務器被挖礦內存被打滿。意味着環境都要重新裝了,想洗洗睡的心都有了,做人真的不能裝~
二. 實操
1. 設置主機名
編輯/etc/hostname,服務器主機名 a.youlai.store
vi /etc/hostname
2. 生成TLS證書
創建證書生成腳本 cert.sh,放置/script目錄
mkdir -p /script /data/cert/docker
touch /script/cert.sh
vim /script/cert.sh
cert.sh添加內容
#!/bin/bash
set -e
if [ -z $1 ];then
echo "請輸入Docker服務器主機名"
exit 0
fi
HOST=$1
mkdir -p /data/cert/docker
cd /data/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
執行 cert.sh 腳本,生成證書放置 /data/cert/docker 目錄中
# a.youlai.store是服務器的主機名
sh /script/cert.sh a.youlai.store
按照提示輸入相關信息,密碼一致就行,其他信息可留空,等腳本指定完成之后,可在 /data/cert/docker 目錄查看到生成的證書。
3. 配置Docker啟用TLS
vim /usr/lib/systemd/system/docker.service
在ExecStart屬性后追加
--tlsverify --tlscacert=/data/cert/docker/ca.pem \
--tlscert=/data/cert/docker/server-cert.pem \
--tlskey=/data/cert/docker/server-key.pem \
-H tcp://0.0.0.0:2376 -H unix://var/run/docker.sock
重新加載docker配置后重啟
systemctl daemon-reload
systemctl restart docker
查看2376端口是否啟動
netstat -nltp | grep 2376
本地連接測試Docker API是否可用
- 沒有指定證書訪問測試
curl https://a.youlai.store:2376/info
- 指定證書訪問測試
curl https://a.youlai.store:2376/info --cert /data/cert/docker/cert.pem --key /data/cert/docker/key.pem --cacert /data/cert/docker/ca.pem
4. IDEA配置
將客戶端所需的ca.pem、cert.pem、key.pem3個密鑰文件從服務器下載到本地
IDEA連接Docker配置修改
pom.xml
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.0.0</version>
<executions>
<!--執行mvn package,即執行 mvn clean package docker:build-->
<execution>
<id>build-image</id>
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
<configuration>
<!-- 鏡像名稱 -->
<imageName>${project.artifactId}</imageName>
<!-- 指定標簽 -->
<imageTags>
<imageTag>latest</imageTag>
</imageTags>
<!-- 基礎鏡像-->
<baseImage>openjdk:8-jdk-alpine</baseImage>
<!-- 切換到容器工作目錄-->
<workdir>/</workdir>
<entryPoint>["java","-jar","${project.build.finalName}.jar"]</entryPoint>
<!-- 指定遠程 Docker API地址 -->
<dockerHost>https://a.youlai.store:2376</dockerHost>
<!-- 指定tls證書的目錄 -->
<dockerCertPath>C:\certs\docker\a.youlai.store</dockerCertPath>
<!-- 復制 jar包到docker容器指定目錄-->
<resources>
<resource>
<targetPath>/</targetPath>
<!-- 用於指定需要復制的根目錄,${project.build.directory}表示target目錄 -->
<directory>${project.build.directory}</directory>
<!-- 用於指定需要復制的文件,${project.build.finalName}.jar就是打包后的target目錄下的jar包名稱 -->
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
</plugins>
</build>
打包測試
可以看到網關應用已成功部署至服務器,詳細操作步驟請參考 Docker實戰 | 第二篇:IDEA集成Docker插件實現一鍵自動打包部署微服務項目
三. 結語
其實沒啥好說的,如果大家有雲服務器Docker API的2375端口暴露出來的話,建議添加TLS加密認證。不然被黑掉幾率非常大,自己就是個活生生栗子,截止到凌晨一點半,還剩下一台機器的環境沒有恢復,心累~
如果大家有什么問題,歡迎下方留言,看到第一時間回復~
文章主旨: 服務器被黑什么的都沒啥,重點是下面要說的,youlai-mall 自己在工作之余整理的一套 (微服務架構 + 前后端分離 + 微信小程序)的開源項目, 希望能給需要的童鞋提供一個很不錯開源項目經驗,有興趣的可以加我(微信號:haoxianrui)一起來“玩”唄~
下面整理出項目開發相關的往期的文章:
后台微服務
- Spring Cloud實戰 | 第一篇:Windows搭建Nacos服務
- Spring Cloud實戰 | 第二篇:Spring Cloud整合Nacos實現注冊中心
- Spring Cloud實戰 | 第三篇:Spring Cloud整合Nacos實現配置中心
- Spring Cloud實戰 | 第四篇:Spring Cloud整合Gateway實現API網關
- Spring Cloud實戰 | 第五篇:Spring Cloud整合OpenFeign實現微服務之間的調用
- Spring Cloud實戰 | 第六篇:Spring Cloud Gateway+Spring Security OAuth2+JWT實現微服務統一認證授權
- Spring Cloud實戰 | 最七篇:Spring Cloud Gateway+Spring Security OAuth2集成統一認證授權平台下實現注銷使JWT失效方案
- Spring Cloud實戰 | 最八篇:Spring Cloud +Spring Security OAuth2+ Vue前后端分離模式下無感知刷新實現JWT續期
- Spring Cloud實戰 | 最九篇:Spring Security OAuth2認證服務器統一認證自定義異常處理
- Spring Cloud實戰 | 第十篇 :Spring Cloud + Nacos整合Seata 1.4.1最新版本實現微服務架構中的分布式事務,進階之路必須要邁過的檻
- Spring Cloud實戰 | 第十一篇 :Spring Cloud Gateway網關實現對RESTful接口權限和按鈕權限細粒度控制
后台管理前端
- vue-element-admin實戰 | 第一篇: 移除mock接入微服務接口,搭建SpringCloud+Vue前后端分離管理平台
- vue-element-admin實戰 | 第二篇: 最小改動接入后台實現根據權限動態加載菜單
微信小程序
應用部署