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

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 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认证中心完成授权登录


相关文章
|
3月前
|
Kubernetes Devops 持续交付
DevOps实践:使用Docker和Kubernetes实现持续集成和部署网络安全的守护盾:加密技术与安全意识的重要性
【8月更文挑战第27天】本文将引导读者理解并应用DevOps的核心理念,通过Docker和Kubernetes的实战案例,深入探讨如何在现代软件开发中实现自动化的持续集成和部署。文章不仅提供理论知识,还结合真实示例,旨在帮助开发者提升效率,优化工作流程。
|
1月前
|
Docker 容器
docker中端口映射
【10月更文挑战第7天】
108 65
|
1月前
|
Docker 容器
一个docker容器暴露多个端口
一个docker容器暴露多个端口
25 3
|
3月前
|
安全 物联网 网络安全
揭秘网络防御:安全漏洞、加密技术与意识提升新兴技术浪潮下的未来社会:区块链、物联网与虚拟现实的融合与创新
【8月更文挑战第27天】在数字时代的浪潮中,网络安全已成为保护个人隐私和企业资产的盾牌。本文深入探讨了网络安全的核心要素:安全漏洞、加密技术和用户安全意识。我们将通过实际案例分析常见的安全威胁,并解释如何利用最新的加密算法来保护数据不被窃取。此外,我们还将揭示提升用户安全意识的重要性,并提供实用的策略,以增强个人和组织在网络空间的防御能力。
|
3月前
|
开发框架 .NET Linux
【Azure 应用服务】 部署到App Service for Linux 服务的Docker 镜像,如何配置监听端口呢?
【Azure 应用服务】 部署到App Service for Linux 服务的Docker 镜像,如何配置监听端口呢?
|
3月前
|
Docker 容器
【Azure 应用服务】App Server 部署后,Docker报错,找不到8080端口
【Azure 应用服务】App Server 部署后,Docker报错,找不到8080端口
|
3月前
|
Kubernetes 网络协议 Docker
在K8S中,ip-cer-pod与docker原生端口映射有何区别?
在K8S中,ip-cer-pod与docker原生端口映射有何区别?
|
4月前
|
人工智能 Serverless API
函数计算产品使用问题之如何在一个Docker容器内运行一个持续监听特定端口的应用程序
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
3月前
|
Docker 容器
docker: 修改运行容器的端口
docker: 修改运行容器的端口
|
3月前
|
Kubernetes 应用服务中间件 Docker
在K8S中,Pod网络访问与Docker容器端口映射有何不同?
在K8S中,Pod网络访问与Docker容器端口映射有何不同?

热门文章

最新文章