如何保证docker2375端口的安全
情景再现:
之前有很多朋友提过,当使用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端口的安全相关推荐
- Docker2375端口未授权getshell
Docker2375端口未授权getshell 靶机:192.168.196.133 利用条件:docker2375未授权.有可启动的主机镜像 1.判断是否可以利用漏洞 扫描端口发现开放端口22和23 ...
- windows下,解决docker2375端口连不上,telnet不通
1.首先看ip地址能不能ping的通 2.看防火墙有没有关闭,或者对2375端口有没有放开 3.在Docker Desktop 中设置2375端口对外开放 但是这个默认是绑定localhost的 所以 ...
- ubuntu配置docker2375端口
/lib/systemd/system下docker.service文件 修改ExecStart为: ExecStart=/usr/bin/dockerd -H fd:// --containerd= ...
- Verilog中inout端口的使用方法
Verilog中inout端口的使用方法 (本文中所有Verilog描述仅为展示inout端口的用法,实际描述则需要更丰富的功能描述) Inout端口的使用 在芯片中为了管脚复用,很多管脚都是双向的, ...
- python3 得到一个可用未绑定端口
单线程 单进程环境 def getPort():pscmd = "netstat -ntl |grep -v Active| grep -v Proto|awk '{print $4}'|a ...
- 交换机端口灯闪烁频率一样_思创易控cetron-新品S2024GE 24口全千兆非网管交换机即将上市!...
思创24口全千兆非网管交换机 - S2024GE即将上市,大型商用网络项目也有可接入型交换机供选择啦! 这款交换机能带给我们哪些惊喜呢?一起看看吧: 1 全千兆端口 全线速转发 S2024GE提供24 ...
- 网络:常见的端口号及分类
一.端口号概念 在网络技术中,端口(Port)包括逻辑端口和物理端口两种类型.物理端口指的是物理存在的端口,如ADSL Modem.集线器.交换机.路由器上用 于连接其他网络设备的接口, 如RJ-45 ...
- Shell脚本学习-阶段二十六-Web服务与端口
文章目录-Shell阶段二十六-端口与服务对照表 前言 端口与Web服务对照表 简介 前言 端口与Web服务对照表 2端口:管理实用程序 3端口:压缩进程 5端口:远程作业登录 7端口:回显 9端口: ...
- tcp服务器修改端口号,RAKsmart服务器:Windows修改远程端口号的图文教程
在使用RAKsmart服务器的时候,很多站长不会修改远程端口号,主机侦探教大家Windows修改远程端口号的图文教程. windows远程桌面默认使用的是3389,为了提高服务器安全性,可以修改默认端 ...
最新文章
- 中文信息处理的主流技术是什么?
- Kettle使用_17 计算器生成时间维度数据
- SpringBoot整合Shiro实现登录认证和授权CHCache
- 使用拦截器分析Java EE应用程序的性能下降/提高
- vbs向指定的日志文件添加日志
- 计算机网络的构成教学反思,《计算机网络知识》教学反思.doc
- VMware vSphere Management Assistant Guide
- 成为Android高手的十个建议
- 2019 支付宝App支付 --- PHP
- ai转型指南_穿越AI转型的转折点
- SpringBoot整合Quartz
- 初学者入门——NOI题库1.3
- 数据挖掘之航空公司客户价值分析
- mxh缩写英语_mxh的含义,mxh是什么的缩写,mxh的词语,mxh代表的意思
- nas磁盘用什么软件测试,手把手教你从NAS拿点空间当电脑硬盘使用 iSCSI开启网络硬盘共享...
- 1.4 安装Kali Linux
- 将禾赛激光雷达在rviz中采集的点云保存成pcd格式
- 图形验证码接口及其重构思想
- 新手使用Docker教程
- DBeaver连接mysql数据库执行.sql脚本,Windows