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

一. 前言

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

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

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

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

二. 实操

1. 设置主机名

编辑/etc/hostname,服务器主机名 a.youlai.store

  
  
复制代码
  • 1
nginx
vi /etc/hostname

2. 生成TLS证书

创建证书生成脚本 cert.sh,放置/script目录

  
  
复制代码
  • 1
  • 2
  • 3
properties
mkdir -p /script /data/cert/docker touch /script/cert.sh vim /script/cert.sh

cert.sh添加内容

  
  
复制代码
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
bash
#!/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 目录中

  
  
复制代码
  • 1
  • 2
nginx
# a.youlai.store是服务器的主机名 sh /script/cert.sh a.youlai.store

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

3. 配置Docker启用TLS

  
  
复制代码
  • 1
nginx
vim /usr/lib/systemd/system/docker.service

在ExecStart属性后追加

  
  
复制代码
  • 1
  • 2
  • 3
  • 4
  • 5
javascript
--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配置后重启

 
 
复制代码
  • 1
  • 2
properties
systemctl daemon-reload systemctl restart docker

查看2376端口是否启动

 
 
复制代码
  • 1
apache
netstat -nltp | grep 2376

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

  • 没有指定证书访问测试
 
 
复制代码
  • 1
cpp
curl https://a.youlai.store:2376/info
  • 指定证书访问测试
 
 
复制代码
  • 1
powershell
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

 
 
复制代码
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
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>
        <span class="hljs-tag">&lt;<span class="hljs-name">configuration</span>&gt;</span>
            <span class="hljs-comment">&lt;!-- 镜像名称 --&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">imageName</span>&gt;</span>${project.artifactId}<span class="hljs-tag">&lt;/<span class="hljs-name">imageName</span>&gt;</span>
            <span class="hljs-comment">&lt;!-- 指定标签 --&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">imageTags</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">imageTag</span>&gt;</span>latest<span class="hljs-tag">&lt;/<span class="hljs-name">imageTag</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">imageTags</span>&gt;</span>
            <span class="hljs-comment">&lt;!-- 基础镜像--&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">baseImage</span>&gt;</span>openjdk:8-jdk-alpine<span class="hljs-tag">&lt;/<span class="hljs-name">baseImage</span>&gt;</span>

            <span class="hljs-comment">&lt;!-- 切换到容器工作目录--&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">workdir</span>&gt;</span>/<span class="hljs-tag">&lt;/<span class="hljs-name">workdir</span>&gt;</span>

            <span class="hljs-tag">&lt;<span class="hljs-name">entryPoint</span>&gt;</span>["java","-jar","${project.build.finalName}.jar"]<span class="hljs-tag">&lt;/<span class="hljs-name">entryPoint</span>&gt;</span>

            <span class="hljs-comment">&lt;!-- 指定远程 Docker API地址  --&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">dockerHost</span>&gt;</span>https://a.youlai.store:2376<span class="hljs-tag">&lt;/<span class="hljs-name">dockerHost</span>&gt;</span>
            <span class="hljs-comment">&lt;!-- 指定tls证书的目录 --&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">dockerCertPath</span>&gt;</span>C:\certs\docker\a.youlai.store<span class="hljs-tag">&lt;/<span class="hljs-name">dockerCertPath</span>&gt;</span>

            <span class="hljs-comment">&lt;!-- 复制 jar包到docker容器指定目录--&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">resources</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">resource</span>&gt;</span>
                    <span class="hljs-tag">&lt;<span class="hljs-name">targetPath</span>&gt;</span>/<span class="hljs-tag">&lt;/<span class="hljs-name">targetPath</span>&gt;</span>
                    <span class="hljs-comment">&lt;!-- 用于指定需要复制的根目录,${project.build.directory}表示target目录 --&gt;</span>
                    <span class="hljs-tag">&lt;<span class="hljs-name">directory</span>&gt;</span>${project.build.directory}<span class="hljs-tag">&lt;/<span class="hljs-name">directory</span>&gt;</span>
                    <span class="hljs-comment">&lt;!-- 用于指定需要复制的文件,${project.build.finalName}.jar就是打包后的target目录下的jar包名称 --&gt;</span>
                    <span class="hljs-tag">&lt;<span class="hljs-name">include</span>&gt;</span>${project.build.finalName}.jar<span class="hljs-tag">&lt;/<span class="hljs-name">include</span>&gt;</span>
                <span class="hljs-tag">&lt;/<span class="hljs-name">resource</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">resources</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">configuration</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">plugin</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">plugins</span>&gt;</span>

</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端口引发的安全漏洞,被黑掉三台云主机的教训总结
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值