Docker实战 | 第四篇:Docker启用TLS加密解决暴露2375端口引发的安全漏洞,被黑掉三台云主机的教训总结

简介: Docker实战 | 第四篇:Docker启用TLS加密解决暴露2375端口引发的安全漏洞,被黑掉三台云主机的教训总结

一. 前言

文末有惊喜!!希望会对您有帮助~


在之前的文章中 IDEA集成Docker插件实现一键自动打包部署微服务项目,其中开放了服务器2375端口监听,此做法却引发出来一个安全问题,在上篇文章评论也有好心的童鞋提示,但自己心存侥幸心理,以为争取时间就没问题。


微信图片_20230709230728.png


想知道为什么暴露2375不安全看一下大佬的具体操作 传送门。


写这篇时候自己开放2375端口的3台云服务器中招了,两台阿里云服务器root账号被劫权,root这个超级用户俨然已成为傀儡皇帝,有名无权,还有一台ucloud服务器被挖矿内存被打满。意味着环境都要重新装了,想洗洗睡的心都有了,做人真的不能装~


微信图片_20230709230739.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

1

2

按照提示输入相关信息,密码一致,其他信息可留空,等脚本指定完成之后,可在 /opt/cert/docker 目录查看到生成的证书。

微信图片_20230709230752.png



3. 配置Docker启用TLS

vim /usr/lib/systemd/system/docker.service

1

在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


微信图片_20230709230802.png



重新加载docker配置后重启


systemctl daemon-reload

systemctl restart docker

1

2

查看2376端口是否启动


netstat -nltp | grep 2376

1

微信图片_20230709230822.png


本地连接测试Docker API是否可用


没有指定证书访问测试

curl https://a.youlai.store:2376/info

1

指定证书访问测试

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

1

4. IDEA配置

将客户端所需的秘钥文件从服务器下载到本地

微信图片_20230709230834.png



IDEA连接Docker配置修改


微信图片_20230709230849.png


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>


打包测试

微信图片_20230709230902.png


可以看到网关应用已成功部署至服务器,详细操作步骤请参考 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续期

管理前端


vue-element-admin实战 | 第一篇: 移除mock接入后台,搭建有来商城youlai-mall前后端分离管理平台

vue-element-admin实战 | 第二篇: 最小改动接入后台实现根据权限动态加载菜单

微信小程序


vue+uniapp商城实战 | 第一篇:【有来小店】微信小程序快速开发接入Spring Cloud OAuth2认证中心完成授权登录


相关文章
|
4月前
|
Docker 容器
电子书阅读分享《4天实战 轻松玩转docker》
电子书阅读分享《4天实战 轻松玩转docker》
123 3
|
4月前
|
JSON 网络协议 数据安全/隐私保护
nps npc docker 部署 解决端口报错问题
nps npc docker 部署 解决端口报错问题
139 0
|
4月前
|
分布式计算 Java Linux
【深入浅出Docker原理及实战】「原理实战体系」零基础+全方位带你学习探索Docker容器开发实战指南(Dockerfile使用手册)
Docker 是一套构建在 Linux 内核之上的高级工具,旨在帮助开发人员和运维人员更轻松地交付应用程序和依赖关系,实现跨系统和跨主机的部署。使用安全且轻量级的容器环境来实现这一目标。容器可以手动创建,也可以通过编写 Dockerfile 自动创建。开发人员和运维人员可以将应用程序及其依赖打包到容器中,实现应用程序的可移植性和环境一致性。
121 5
【深入浅出Docker原理及实战】「原理实战体系」零基础+全方位带你学习探索Docker容器开发实战指南(Dockerfile使用手册)
|
6天前
|
jenkins Java 持续交付
Jenkins与Docker的自动化CI/CD实战
Jenkins与Docker的自动化CI/CD实战
|
20天前
|
JavaScript 前端开发 Docker
全栈开发实战:结合Python、Vue和Docker进行部署
【4月更文挑战第10天】本文介绍了如何使用Python、Vue.js和Docker进行全栈开发和部署。Python搭配Flask创建后端API,Vue.js构建前端界面,Docker负责应用的容器化部署。通过编写Dockerfile,将Python应用构建成Docker镜像并运行,前端部分使用Vue CLI创建项目并与后端交互。最后,通过Nginx和另一个Dockerfile部署前端应用。这种组合提升了开发效率,保证了应用的可维护性和扩展性,适合不同规模的企业使用。
|
2月前
|
Cloud Native Shell Linux
云原生专题 | 【深入浅出Docker原理及实战】「原理实战体系」零基础+全方位带你学习探索Docker容器开发实战指南(实战技术总结)
云原生专题 | 【深入浅出Docker原理及实战】「原理实战体系」零基础+全方位带你学习探索Docker容器开发实战指南(实战技术总结)
14 0
|
2月前
|
Cloud Native Linux 虚拟化
云原生专题 |【深入浅出Docker原理及实战】「原理实战体系」零基础+全方位带你学习探索Docker容器开发实战指南(底层实现系列)
云原生专题 |【深入浅出Docker原理及实战】「原理实战体系」零基础+全方位带你学习探索Docker容器开发实战指南(底层实现系列)
45 0
|
2月前
|
网络协议 Docker 容器
docker查看映射端口
docker查看映射端口
15 0
|
2月前
|
NoSQL 应用服务中间件 nginx
Docker命令实战
Docker命令实战
61 1
|
2月前
|
Unix Docker 容器
【超强图解Docker常见命令与实战】
【超强图解Docker常见命令与实战】
54 0