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


一. 前言

文末有驚喜!!希望會對您有幫助~

在之前的文章中 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)一起來“玩”唄~

下面整理出項目開發相關的往期的文章:

后台微服務

  1. Spring Cloud實戰 | 第一篇:Windows搭建Nacos服務
  2. Spring Cloud實戰 | 第二篇:Spring Cloud整合Nacos實現注冊中心
  3. Spring Cloud實戰 | 第三篇:Spring Cloud整合Nacos實現配置中心
  4. Spring Cloud實戰 | 第四篇:Spring Cloud整合Gateway實現API網關
  5. Spring Cloud實戰 | 第五篇:Spring Cloud整合OpenFeign實現微服務之間的調用
  6. Spring Cloud實戰 | 第六篇:Spring Cloud Gateway+Spring Security OAuth2+JWT實現微服務統一認證授權
  7. Spring Cloud實戰 | 最七篇:Spring Cloud Gateway+Spring Security OAuth2集成統一認證授權平台下實現注銷使JWT失效方案
  8. Spring Cloud實戰 | 最八篇:Spring Cloud +Spring Security OAuth2+ Vue前后端分離模式下無感知刷新實現JWT續期
  9. Spring Cloud實戰 | 最九篇:Spring Security OAuth2認證服務器統一認證自定義異常處理
  10. Spring Cloud實戰 | 第十篇 :Spring Cloud + Nacos整合Seata 1.4.1最新版本實現微服務架構中的分布式事務,進階之路必須要邁過的檻
  11. Spring Cloud實戰 | 第十一篇 :Spring Cloud Gateway網關實現對RESTful接口權限和按鈕權限細粒度控制

后台管理前端

  1. vue-element-admin實戰 | 第一篇: 移除mock接入微服務接口,搭建SpringCloud+Vue前后端分離管理平台
  2. vue-element-admin實戰 | 第二篇: 最小改動接入后台實現根據權限動態加載菜單

微信小程序

  1. vue+uni-app商城實戰 | 第一篇:從0到1快速開發一個商城微信小程序,無縫接入Spring Cloud OAuth2認證授權登錄

應用部署

  1. Docker實戰 | 第一篇:Linux 安裝 Docker
  2. Docker實戰 | 第二篇:Docker部署nacos-server:1.4.0
  3. Docker實戰 | 第三篇:IDEA集成Docker插件實現一鍵自動打包部署微服務項目,一勞永逸的技術手段值得一試
  4. Docker實戰 | 第四篇:Docker安裝Nginx,實現基於vue-element-admin框架構建的項目線上部署
  5. Docker實戰 | 第五篇:Docker啟用TLS加密解決暴露2375端口引發的安全漏洞,被黑掉三台雲主機的教訓總結


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM