![86ef5d4b8ed1be56ef3ff63297686e04.png](https://img-blog.csdnimg.cn/img_convert/86ef5d4b8ed1be56ef3ff63297686e04.png)
推荐阅读:
无情的BUG杀手:京东资深架构师分享:RabbitMQ整体架构以及学习方法zhuanlan.zhihu.com![ea7c2c549ad8eb1960809283646a0f17.png](https://img-blog.csdnimg.cn/img_convert/ea7c2c549ad8eb1960809283646a0f17.png)
![5e20b55aaa99478910e84b2960556b27.png](https://img-blog.csdnimg.cn/img_convert/5e20b55aaa99478910e84b2960556b27.png)
![13270211bd6799b729dc542725d59dc3.png](https://img-blog.csdnimg.cn/img_convert/13270211bd6799b729dc542725d59dc3.png)
摘要
之前有很多朋友提过,当使用docker-maven-plugin打包SpringBoot应用的Docker镜像时,服务器需要开放2375端口。由于开放了端口没有做任何安全保护,会引起安全漏洞,被人入侵、挖矿、CPU飙升这些情况都有发生,今天我们来聊聊如何解决这个问题。
问题产生的原因
首先我们要明白问题产生的原因,才能更好地解决问题!
Docker为了实现集群管理,提供了远程管理的端口。Docker Daemon作为守护进程运行在后台,可以执行发送到管理端口上的Docker命令。
当我们修改docker.service文件,修改启动命令,加入-H tcp://0.0.0.0:2375时,就会开放2375端口,且没有任何加密和认证过程,这种方式一般用在内网测试环境。如果你的服务器部署在公网上,任何知道你IP的人,都可以管理这台主机上的容器和镜像,想想就觉得可怕。
解决思路
开放远程管理端口后,没有做任何安全保护导致了这个问题。我们只要使用安全传输层协议(TLS)进行传输并使用CA认证即可。
制作证书及秘钥
我们需要使用OpenSSL制作CA机构证书、服务端证书和客户端证书,以下操作均在安装Docker的Linux服务器上进行。
- 首先创建一个目录用于存储生成的证书和秘钥;
mkdir
- 创建CA证书私钥,期间需要输入两次用户名和密码,生成文件为ca-key.pem;
openssl
- 根据私钥创建CA证书,期间需要输入上一步设置的私钥密码,生成文件为ca.pem;
openssl
- 创建服务端私钥,生成文件为server-key.pem;
openssl
- 创建服务端证书签名请求文件,用于CA证书给服务端证书签名,生成文件server.csr;
openssl
- 创建CA证书签名好的服务端证书,期间需要输入CA证书私钥密码,生成文件为server-cert.pem;
openssl
- 创建客户端私钥,生成文件为key.pem;
openssl
- 创建客户端证书签名请求文件,用于CA证书给客户证书签名,生成文件client.csr;
openssl
- 为了让秘钥适合客户端认证,创建一个扩展配置文件extfile-client.cnf;
echo
- 创建CA证书签名好的客户端证书,期间需要输入CA证书私钥密码,生成文件为cert.pem;
openssl
- 删除创建过程中多余的文件;
rm
- 最终生成文件如下,有了它们我们就可以进行基于TLS的安全访问了。
ca
配置Docker支持TLS
- 用vim编辑器修改docker.service文件;
vi
- 修改以ExecStart开头的配置,开启TLS认证,并配置好CA证书、服务端证书和服务端私钥,修改内容如下;
ExecStart
- 重启Docker服务,这样我们的Docker服务就支持使用TLS进行远程访问了!
systemctl
客户端访问
接下来我们将使用docker-maven-plugin来打包Docker镜像,使用的代码为原来的mall-tiny-docker例子。
- 直接使用docker-maven-plugin打包试试,由于我们的插件版本有点低,使用新一点版本的Docker会出现如下问题,升级到1.2.2版本解决该问题;
[
- 修改完版本后打包,发现TLS不再支持http了,需要改用https,修改<dockerHost>配置为https;
[
- 修改完成后再次打包,继续失败,需要添加对应的客户端证书才能访问;
[
- 将如下文件复制到指定目录,这里复制到了I:developerenvdocker-ca;
ca
- 然后将该目录配置在插件的<dockerCertPath>节点下,最终插件配置如下;
<
- 再次打包镜像,发现已经可以成功打包镜像,从此我们的2375端口终于可以安全使用了!
[
作者:MacroZheng
链接:https://juejin.im/post/6861749836249563143