情景再现:

之前有很多朋友提过,当使用docker-maven-plugin打包SpringBoot应用的Docker镜像时,服务器需要开放2375端口。由于开放了端口没有做任何安全保护,会引起安全漏洞,被人入侵、挖矿、CPU飙升这些情况都有发生,今天我们来聊聊如何解决这个问题。

问题产生的原因

首先我们要明白问题产生的原因,才能更好地解决问题!

Docker为了实现集群管理,提供了远程管理的端口。Docker Daemon作为守护进程运行在后台,可以执行发送到管理端口上的Docker命令。

当我们修改docker.service文件,修改启动命令,加入-H tcp://0.0.0.0:2375时,就会开放2375端口,且没有任何加密和认证过程,这种方式一般用在内网测试环境。如果你的服务器部署在公网上,任何知道你IP的人,都可以管理这台主机上的容器和镜像,想想就觉得可怕。

解决思路

  • 制作证书及秘钥
    我们需要使用OpenSSL制作CA机构证书、服务端证书和客户端证书,以下操作均在安装Docker的Linux服务器上进行。

首先创建一个目录用于存储生成的证书和秘钥;

mkdir /mydata/docker-ca && cd /mydata/docker-ca

创建CA证书私钥,期间需要输入两次用户名和密码,生成文件为ca-key.pem;

openssl genrsa -aes256 -out ca-key.pem 4096

根据私钥创建CA证书,期间需要输入上一步设置的私钥密码,生成文件为ca.pem;

openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -subj "/CN=*" -out ca.pem

创建服务端私钥,生成文件为server-key.pem;

openssl genrsa -out server-key.pem 4096

创建服务端证书签名请求文件,用于CA证书给服务端证书签名,生成文件server.csr;

openssl req -subj "/CN=*" -sha256 -new -key server-key.pem -out server.csr

创建CA证书签名好的服务端证书,期间需要输入CA证书私钥密码,生成文件为server-cert.pem;

openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem

创建客户端私钥,生成文件为key.pem;

openssl genrsa -out key.pem 4096

创建客户端证书签名请求文件,用于CA证书给客户证书签名,生成文件client.csr;

openssl req -subj "/CN=client" -new -key key.pem -out client.csr

为了让秘钥适合客户端认证,创建一个扩展配置文件extfile-client.cnf;

echo extendedKeyUsage = clientAuth > extfile-client.cnf

创建CA证书签名好的客户端证书,期间需要输入CA证书私钥密码,生成文件为cert.pem;

openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -extfile extfile-client.cnf

删除创建过程中多余的文件;

rm -rf ca.srl server.csr client.csr extfile-client.cnf

最终生成文件如下,有了它们我们就可以进行基于TLS的安全访问了。

ca.pem CA证书
ca-key.pem CA证书私钥
server-cert.pem 服务端证书
server-key.pem 服务端证书私钥
cert.pem 客户端证书
key.pem 客户端证书私钥
  • 配置Docker支持TLS
    用vim编辑器修改docker.service文件;
vi /usr/lib/systemd/system/docker.service

修改以ExecStart开头的配置,开启TLS认证,并配置好CA证书、服务端证书和服务端私钥,修改内容如下;

ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2375 --tlsverify --tlscacert=/mydata/docker-ca/ca.pem --tlscert=/mydata/docker-ca/server-cert.pem --tlskey=/mydata/docker-ca/server-key.pem

重启Docker服务,这样我们的Docker服务就支持使用TLS进行远程访问了!

systemctl daemon-reload && systemctl restart docker
  • 客户端访问

接下来我们将使用docker-maven-plugin来打包Docker镜像,使用的代码为原来的mall-tiny-docker例子。
直接使用docker-maven-plugin打包试试,由于我们的插件版本有点低,使用新一点版本的Docker会出现如下问题,升级到1.2.2版本解决该问题;

[ERROR] Failed to execute goal com.spotify:docker-maven-plugin:1.1.0:build (build-image) on project mall-tiny-docker: Exception caught: com.spotify.docker.client.shaded.com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `com.spotify.docker.client.messages.RegistryAuth` (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('desktop')
[ERROR] at [Source: UNKNOWN; line: -1, column: -1] (through reference chain: java.util.LinkedHashMap["credsStore"])
[ERROR] -> [Help 1]

修改完版本后打包,发现TLS不再支持http了,需要改用https,修改配置为https;

[ERROR] Failed to execute goal com.spotify:docker-maven-plugin:1.2.2:build (build-image) on project mall-tiny-docker: Exception caught: Request error: GET http://192.168.3.101:2375/version: 400, body: Client sent an HTTP request to an HTTPS server. HTTP 400 Bad Request -> [Help 1]

修改完成后再次打包,继续失败,需要添加对应的客户端证书才能访问;

[ERROR] Failed to execute goal com.spotify:docker-maven-plugin:1.2.2:build (build-image) on project mall-tiny-docker: Exception caught: java.util.concurrent.ExecutionException: com.spotify.docker.client.shaded.javax.ws.rs.ProcessingException: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target -> [Help 1]

将如下文件复制到指定目录,这里复制到了I:\developer\env\docker-ca;

ca.pem CA证书
cert.pem 客户端证书
key.pem 客户端证书私钥

然后将该目录配置在插件的节点下,最终插件配置如下;

<plugin><groupId>com.spotify</groupId><artifactId>docker-maven-plugin</artifactId><version>1.2.2</version><executions><execution><id>build-image</id><phase>package</phase><goals><goal>build</goal></goals></execution></executions><configuration><imageName>mall-tiny/${project.artifactId}:${project.version}</imageName><dockerHost>https://192.168.3.101:2375</dockerHost><baseImage>java:8</baseImage><entryPoint>["java", "-jar","/${project.build.finalName}.jar"]</entryPoint><dockerCertPath>I:\developer\env\docker-ca</dockerCertPath><resources><resource><targetPath>/</targetPath><directory>${project.build.directory}</directory><include>${project.build.finalName}.jar</include></resource></resources></configuration>
</plugin>

再次打包镜像,发现已经可以成功打包镜像,从此我们的2375端口终于可以安全使用了!

[INFO] Building image mall-tiny/mall-tiny-docker:0.0.1-SNAPSHOT
Step 1/3 : FROM java:8---> d23bdf5b1b1b
Step 2/3 : ADD /mall-tiny-docker-0.0.1-SNAPSHOT.jar //---> 5cb5a64ccedd
Step 3/3 : ENTRYPOINT ["java", "-jar","/mall-tiny-docker-0.0.1-SNAPSHOT.jar"]---> Running in 5f3ceefdd974
Removing intermediate container 5f3ceefdd974---> ee9d0e2b0114
ProgressMessage{id=null, status=null, stream=null, error=null, progress=null, progressDetail=null}
Successfully built ee9d0e2b0114
Successfully tagged mall-tiny/mall-tiny-docker:0.0.1-SNAPSHOT
[INFO] Built mall-tiny/mall-tiny-docker:0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 20.550 s
[INFO] Finished at: 2020-07-31T15:02:15+08:00
[INFO] Final Memory: 50M/490M
[INFO] ------------------------------------------------------------------------

原创作者:梦想de星空

如何保证docker2375端口的安全相关推荐

  1. Docker2375端口未授权getshell

    Docker2375端口未授权getshell 靶机:192.168.196.133 利用条件:docker2375未授权.有可启动的主机镜像 1.判断是否可以利用漏洞 扫描端口发现开放端口22和23 ...

  2. windows下,解决docker2375端口连不上,telnet不通

    1.首先看ip地址能不能ping的通 2.看防火墙有没有关闭,或者对2375端口有没有放开 3.在Docker Desktop 中设置2375端口对外开放 但是这个默认是绑定localhost的 所以 ...

  3. ubuntu配置docker2375端口

    /lib/systemd/system下docker.service文件 修改ExecStart为: ExecStart=/usr/bin/dockerd -H fd:// --containerd= ...

  4. Verilog中inout端口的使用方法

    Verilog中inout端口的使用方法 (本文中所有Verilog描述仅为展示inout端口的用法,实际描述则需要更丰富的功能描述) Inout端口的使用 在芯片中为了管脚复用,很多管脚都是双向的, ...

  5. python3 得到一个可用未绑定端口

    单线程 单进程环境 def getPort():pscmd = "netstat -ntl |grep -v Active| grep -v Proto|awk '{print $4}'|a ...

  6. 交换机端口灯闪烁频率一样_思创易控cetron-新品S2024GE 24口全千兆非网管交换机即将上市!...

    思创24口全千兆非网管交换机 - S2024GE即将上市,大型商用网络项目也有可接入型交换机供选择啦! 这款交换机能带给我们哪些惊喜呢?一起看看吧: 1 全千兆端口 全线速转发 S2024GE提供24 ...

  7. 网络:常见的端口号及分类

    一.端口号概念 在网络技术中,端口(Port)包括逻辑端口和物理端口两种类型.物理端口指的是物理存在的端口,如ADSL Modem.集线器.交换机.路由器上用 于连接其他网络设备的接口, 如RJ-45 ...

  8. Shell脚本学习-阶段二十六-Web服务与端口

    文章目录-Shell阶段二十六-端口与服务对照表 前言 端口与Web服务对照表 简介 前言 端口与Web服务对照表 2端口:管理实用程序 3端口:压缩进程 5端口:远程作业登录 7端口:回显 9端口: ...

  9. tcp服务器修改端口号,RAKsmart服务器:Windows修改远程端口号的图文教程

    在使用RAKsmart服务器的时候,很多站长不会修改远程端口号,主机侦探教大家Windows修改远程端口号的图文教程. windows远程桌面默认使用的是3389,为了提高服务器安全性,可以修改默认端 ...

最新文章

  1. 中文信息处理的主流技术是什么?
  2. Kettle使用_17 计算器生成时间维度数据
  3. SpringBoot整合Shiro实现登录认证和授权CHCache
  4. 使用拦截器分析Java EE应用程序的性能下降/提高
  5. vbs向指定的日志文件添加日志
  6. 计算机网络的构成教学反思,《计算机网络知识》教学反思.doc
  7. VMware vSphere Management Assistant Guide
  8. 成为Android高手的十个建议
  9. 2019 支付宝App支付 --- PHP
  10. ai转型指南_穿越AI转型的转折点
  11. SpringBoot整合Quartz
  12. 初学者入门——NOI题库1.3
  13. 数据挖掘之航空公司客户价值分析
  14. mxh缩写英语_mxh的含义,mxh是什么的缩写,mxh的词语,mxh代表的意思
  15. nas磁盘用什么软件测试,手把手教你从NAS拿点空间当电脑硬盘使用 iSCSI开启网络硬盘共享...
  16. 1.4 安装Kali Linux
  17. 将禾赛激光雷达在rviz中采集的点云保存成pcd格式
  18. 图形验证码接口及其重构思想
  19. 新手使用Docker教程
  20. DBeaver连接mysql数据库执行.sql脚本,Windows

热门文章

  1. 视觉检测技术在半导体行业中的应用
  2. div背景透明文字不透明
  3. 资源网站分享之沃的资源网
  4. 类的关系(泛化, 实现,关联,聚合,组合,依赖)
  5. 计算机C语言学习心得
  6. linux dhcp 续租失败,51CTO博客-专业IT技术博客创作平台-技术成就梦想
  7. MSSQL2005+分组添加序号
  8. 要想做好日语翻译,你需要这样做?
  9. 仓库拣货:“播种式”好还是“摘果式”好? --转载
  10. CSS中动画——Z轴平移,旋转,缩放