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认证中心完成授权登录


相关文章
|
1月前
|
NoSQL 关系型数据库 Redis
Docker的通俗理解和通过宿主机端口访问Redis容器的实例
本文目标:引导初学者入门Docker,理解镜像、容器和宿主机概念,学习常用Docker命令,特别是如何创建并从Redis容器通过宿主机端口访问。 关键点: - Docker核心:镜像(类)、容器(实例)、宿主机(运行环境)。 - `docker pull` 拉取镜像,如 `redis:3.0`。 - `docker run -d --name` 后台运行容器,如 `my-redis`。 - `-p` 参数做端口映射,如 `6379:6379`。 - `docker exec -it` 交互式进入容器,如 `bash` 或执行命令。
134 4
|
2月前
|
NoSQL 测试技术 Go
【Golang】国密SM2公钥私钥序列化到redis中并加密解密实战_sm2反编(1)
【Golang】国密SM2公钥私钥序列化到redis中并加密解密实战_sm2反编(1)
|
1月前
|
机器学习/深度学习 安全 测试技术
【Docker项目实战】在Docker环境下使用RustScan端口扫描工具
【6月更文挑战第9天】在Docker环境下使用RustScan端口扫描工具
42 5
|
20天前
|
SQL 安全 物联网
网络防御前沿:探索安全漏洞与加密技术
在数字化时代,网络安全已成为维护信息完整性、保障个人隐私和公司资产的关键战场。本文深入探讨了网络安全漏洞的成因与影响,分析了加密技术的演进及其在现代网络防御中的作用,并强调了提升公众和企业安全意识的重要性。通过结合最新的研究成果和实际案例,本文旨在为读者提供一套全面的网络安全知识框架,以应对不断变化的网络威胁。
13 0
|
27天前
|
网络协议 安全 Docker
windows环境下的设置docker远程访问(开放2375端口)
windows环境下的设置docker远程访问(开放2375端口)
100 0
|
2月前
|
Docker 容器
docker: 如何不新建容器 修改运行容器的端口
docker: 如何不新建容器 修改运行容器的端口
|
2月前
|
安全 Linux 网络安全
|
2月前
|
SQL 安全 算法
网络防御先锋:洞悉安全漏洞与应用加密技术的实战指南
【5月更文挑战第25天】在数字信息时代,网络安全和信息安全已成为维护数据完整性、确保信息传输保密性和保障系统可用性的关键。本文将深入探讨网络安全领域的重要议题——安全漏洞的识别与防护,以及加密技术的应用与实践。通过对常见安全威胁的分析,结合最新的加密方法,文章旨在提升读者对网络防御策略的理解,并增强个人及组织的安全防护意识。
|
2月前
|
SQL 安全 算法
网络防线构建:揭秘安全漏洞、加密技术与提升安全意识
【5月更文挑战第27天】在数字化时代,网络安全与信息安全已成为维护个人隐私和公司资产的关键。本文将深入探讨网络安全中常见的漏洞类型,介绍现代加密技术的基本原理及其应用,并强调培养全民安全意识的重要性。通过分析具体案例,我们将展示如何有效防范网络威胁,保障数据安全,以及如何在不断演变的网络环境中保持警觉。
|
2月前
|
Docker 容器
两个docker能用同一个端口吗 - 蓝易云
然后,你可以在另一个容器中运行相同的应用,让它监听容器的80端口,并将其映射到主机的8081端口。
34 0