声如洪钟 發表於 2020-12-7 01:46:00

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

<h2 id="一-前言">一. 前言</h2>
<p><font style="color: rgba(255, 0, 0, 1); font-weight: bold">文末有惊喜!!希望会对您有帮助~</font></p>
<p>在之前的文章中 IDEA集成Docker插件实现一键自动打包部署微服务项目,其中开放了服务器2375端口监听,此做法却引发出来一个安全问题,在上篇文章评论也有好心的童鞋提示,但自己心存侥幸心理,以为争取时间就没问题。</p>
<p><img src="https://i.loli.net/2020/12/06/uyTVlEq9h7mQ2kC.png" alt="" loading="lazy"></p>
<p>想知道为什么暴露2375不安全看一下大佬的具体操作 传送门。</p>
<p>写这篇时候自己开放2375端口的3台云服务器中招了,两台阿里云服务器root账号被劫权,root这个超级用户俨然已成为傀儡皇帝,有名无权,还有一台ucloud服务器被挖矿内存被打满。意味着环境都要重新装了,想洗洗睡的心都有了,做人真的不能装~</p>
<p><img src="https://i.loli.net/2020/12/06/uYjnM6ZO4fmVk3R.png" alt="" loading="lazy"></p>
<h2 id="二-实操">二. 实操</h2>
<h3 id="1--设置主机名">1.设置主机名</h3>
<p>编辑/etc/hostname,服务器主机名 <code>a.youlai.store</code></p>
<pre><code>vi /etc/hostname
</code></pre>
<h3 id="2-生成tls证书">2. 生成TLS证书</h3>
<p>创建证书生成脚本 cert.sh,放置/script目录</p>
<pre><code>mkdir -p /script /data/cert/docker
touch /script/cert.sh
vim /script/cert.sh
</code></pre>
<p>cert.sh添加内容</p>
<pre><code>#!/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 &gt; 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 &gt; 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
</code></pre>
<p>执行 cert.sh 脚本,生成证书放置 /data/cert/docker 目录中</p>
<pre><code># a.youlai.store是服务器的主机名
sh /script/cert.sh a.youlai.store
</code></pre>
<p>按照提示输入相关信息,密码一致就行,其他信息可留空,等脚本指定完成之后,可在 /data/cert/docker 目录查看到生成的证书。</p>
<p><img src="https://i.loli.net/2020/12/06/WQqxMta7o34vTfL.png" alt="" loading="lazy"></p>
<h3 id="3-配置docker启用tls">3. 配置Docker启用TLS</h3>
<pre><code>vim /usr/lib/systemd/system/docker.service
</code></pre>
<p>在ExecStart属性后追加</p>
<pre><code>--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

</code></pre>
<p><img src="https://i.loli.net/2020/12/06/1vWsQmyfpC9DY6H.png" alt="" loading="lazy"></p>
<p>重新加载docker配置后重启</p>
<pre><code>systemctl daemon-reload
systemctl restart docker
</code></pre>
<p>查看2376端口是否启动</p>
<pre><code>netstat -nltp | grep 2376
</code></pre>
<p><img src="https://i.loli.net/2020/12/06/s4uoR6pWBMmtAnr.png" alt="" loading="lazy"></p>
<p><strong>本地连接测试Docker API是否可用</strong></p>
<ul>
<li>没有指定证书访问测试</li>
</ul>
<pre><code>curl https://a.youlai.store:2376/info
</code></pre>
<ul>
<li>指定证书访问测试</li>
</ul>
<pre><code>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
</code></pre>
<h3 id="4-idea配置">4. IDEA配置</h3>
<p>将客户端所需的ca.pem、cert.pem、key.pem3个密钥文件从服务器下载到本地</p>
<p><img src="https://i.loli.net/2020/12/06/dLPAsIak5KT7ogv.png" alt="" loading="lazy"></p>
<p>IDEA连接Docker配置修改</p>
<p><img src="https://i.loli.net/2020/12/06/T2ejKwkHlvpJ1fL.png" alt="" loading="lazy"></p>
<p>pom.xml</p>
<pre><code>&lt;build&gt;
    &lt;plugins&gt;
      &lt;plugin&gt;
            &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
            &lt;artifactId&gt;spring-boot-maven-plugin&lt;/artifactId&gt;
      &lt;/plugin&gt;
      &lt;plugin&gt;
            &lt;groupId&gt;com.spotify&lt;/groupId&gt;
            &lt;artifactId&gt;docker-maven-plugin&lt;/artifactId&gt;
            &lt;version&gt;1.0.0&lt;/version&gt;
            &lt;executions&gt;
                &lt;!--执行mvn package,即执行 mvn clean package docker:build--&gt;
                &lt;execution&gt;
                  &lt;id&gt;build-image&lt;/id&gt;
                  &lt;phase&gt;package&lt;/phase&gt;
                  &lt;goals&gt;
                        &lt;goal&gt;build&lt;/goal&gt;
                  &lt;/goals&gt;
                &lt;/execution&gt;
            &lt;/executions&gt;

            &lt;configuration&gt;
                &lt;!-- 镜像名称 --&gt;
                &lt;imageName&gt;${project.artifactId}&lt;/imageName&gt;
                &lt;!-- 指定标签 --&gt;
                &lt;imageTags&gt;
                  &lt;imageTag&gt;latest&lt;/imageTag&gt;
                &lt;/imageTags&gt;
                &lt;!-- 基础镜像--&gt;
                &lt;baseImage&gt;openjdk:8-jdk-alpine&lt;/baseImage&gt;

                &lt;!-- 切换到容器工作目录--&gt;
                &lt;workdir&gt;/&lt;/workdir&gt;

                &lt;entryPoint&gt;["java","-jar","${project.build.finalName}.jar"]&lt;/entryPoint&gt;

                &lt;!-- 指定远程 Docker API地址--&gt;
                &lt;dockerHost&gt;https://a.youlai.store:2376&lt;/dockerHost&gt;
                &lt;!-- 指定tls证书的目录 --&gt;
                &lt;dockerCertPath&gt;C:\certs\docker\a.youlai.store&lt;/dockerCertPath&gt;

                &lt;!-- 复制 jar包到docker容器指定目录--&gt;
                &lt;resources&gt;
                  &lt;resource&gt;
                        &lt;targetPath&gt;/&lt;/targetPath&gt;
                        &lt;!-- 用于指定需要复制的根目录,${project.build.directory}表示target目录 --&gt;
                        &lt;directory&gt;${project.build.directory}&lt;/directory&gt;
                        &lt;!-- 用于指定需要复制的文件,${project.build.finalName}.jar就是打包后的target目录下的jar包名称 --&gt;
                        &lt;include&gt;${project.build.finalName}.jar&lt;/include&gt;
                  &lt;/resource&gt;
                &lt;/resources&gt;
            &lt;/configuration&gt;
      &lt;/plugin&gt;
    &lt;/plugins&gt;
&lt;/build&gt;
</code></pre>
<p>打包测试</p>
<p><img src="https://i.loli.net/2020/12/07/OrHz6BQEuYqVA3a.png" alt="" loading="lazy"></p>
<p>可以看到网关应用已成功部署至服务器,详细操作步骤请参考 Docker实战 | 第二篇:IDEA集成Docker插件实现一键自动打包部署微服务项目</p>
<h2 id="三-结语">三. 结语</h2>
<p>其实没啥好说的,如果大家有云服务器Docker API的2375端口暴露出来的话,建议添加TLS加密认证。不然被黑掉几率非常大,自己就是个活生生栗子,截止到凌晨一点半,还剩下一台机器的环境没有恢复,心累~</p>
<p>如果大家有什么问题,欢迎下方留言,看到第一时间回复~</p>
<p><font style="font-weight: bold; color: rgba(255, 0, 0, 1)">文章主旨:</font>服务器被黑什么的都没啥,重点是下面要说的,youlai-mall 自己在工作之余整理的一套 (微服务架构 + 前后端分离 + 微信小程序)的开源项目, 希望能给需要的童鞋提供一个很不错开源项目经验,有兴趣的可以加我(微信号:haoxianrui)一起来“玩”呗~</p>
<p>下面整理出项目开发相关的往期的文章:</p>
<blockquote>
<p>后台微服务</p>
</blockquote>
<ol>
<li>Spring Cloud实战 | 第一篇:Windows搭建Nacos服务 </li>
<li>Spring Cloud实战 | 第二篇:Spring Cloud整合Nacos实现注册中心</li>
<li>Spring Cloud实战 | 第三篇:Spring Cloud整合Nacos实现配置中心</li>
<li>Spring Cloud实战 | 第四篇:Spring Cloud整合Gateway实现API网关</li>
<li>Spring Cloud实战 | 第五篇:Spring Cloud整合OpenFeign实现微服务之间的调用</li>
<li>Spring Cloud实战 | 第六篇:Spring Cloud Gateway+Spring Security OAuth2+JWT实现微服务统一认证授权</li>
<li>Spring Cloud实战 | 最七篇:Spring Cloud Gateway+Spring Security OAuth2集成统一认证授权平台下实现注销使JWT失效方案</li>
<li>Spring Cloud实战 | 最八篇:Spring Cloud +Spring Security OAuth2+ Vue前后端分离模式下无感知刷新实现JWT续期</li>
<li>Spring Cloud实战 | 最九篇:Spring Security OAuth2认证服务器统一认证自定义异常处理</li>
<li>Spring Cloud实战 | 第十篇 :Spring Cloud + Nacos整合Seata 1.4.1最新版本实现微服务架构中的分布式事务,进阶之路必须要迈过的槛</li>
<li>Spring Cloud实战 | 第十一篇 :Spring Cloud Gateway网关实现对RESTful接口权限和按钮权限细粒度控制<br>
</li>
</ol>
<blockquote>
<p>后台管理前端</p>
</blockquote>
<ol>
<li>vue-element-admin实战 | 第一篇: 移除mock接入微服务接口,搭建SpringCloud+Vue前后端分离管理平台</li>
<li>vue-element-admin实战 | 第二篇: 最小改动接入后台实现根据权限动态加载菜单</li>
</ol>
<blockquote>
<p>微信小程序</p>
</blockquote>
<ol>
<li>vue+uni-app商城实战 | 第一篇:从0到1快速开发一个商城微信小程序,无缝接入Spring Cloud OAuth2认证授权登录</li>
</ol>
<blockquote>
<p>应用部署</p>
</blockquote>
<ol>
<li>Docker实战 | 第一篇:Linux 安装 Docker</li>
<li>Docker实战 | 第二篇:Docker部署nacos-server:1.4.0</li>
<li>Docker实战 | 第三篇:IDEA集成Docker插件实现一键自动打包部署微服务项目,一劳永逸的技术手段值得一试</li>
<li>Docker实战 | 第四篇:Docker安装Nginx,实现基于vue-element-admin框架构建的项目线上部署</li>
<li>Docker实战 | 第五篇:Docker启用TLS加密解决暴露2375端口引发的安全漏洞,被黑掉三台云主机的教训总结</li>
</ol><br><br>
来源:https://www.cnblogs.com/haoxianrui/p/14095306.html
頁: [1]
查看完整版本: Docker实战 | 第五篇:Docker启用TLS加密解决暴露2375端口引发的安全漏洞,被黑掉三台云主机的教训总结