当前位置: 首页 > Linux

Docker服务打开这个端口,服务器分分钟变肉机!

时间:2023-04-06 04:05:00 Linux

SpringBoot实战电商项目商城(39k+star)地址:https://github.com/macrozheng/mall服务端需要开放2375端口,由于开放端口没有任何安全保护,会导致被入侵、挖矿、CPU飙升等安全漏洞。今天我们就来说说如何解决这个问题。问题的原因首先我们要了解问题的原因,才能更好的解决问题!为了实现集群管理,Docker提供了远程管理端口。DockerDaemon作为守护进程在后台运行,可以执行发送到管理端口的Docker命令。当我们修改docker.service文件,修改启动命令,加上-Htcp://0.0.0.0:2375,2375端口会被打开,不经过任何加密和认证过程。这种方式一般用于内网测试环境。如果你的服务器部署在公网,任何知道你IP的人都可以管理这台主机上的容器和镜像,想想都觉得可怕。解决思路开启远程管理端口后,没有安全保护,导致出现这个问题。我们只需要使用传输层安全协议(TLS)进行传输,并使用CA认证。为了制作证书和密钥,我们需要使用OpenSSL制作CA证书、服务器证书和客户端证书。以下操作均在安装了Docker的Linux服务器上进行。首先创建一个目录存放生成的证书和秘钥;mkdir/mydata/docker-ca&&cd/mydata/docker-ca创建CA证书私钥,期间需要输入两次用户名和密码,生成的文件为ca-key.pem;opensslgenrsa-aes256-outca-key.pem4096根据私钥创建CA证书,期间需要输入上一步设置的私钥密码,生成的文件为ca.pem;opensslreq-new-x509-days365-keyca-key.pem-sha256-subj"/CN=*"-outca.pem创建服务器私钥,生成文件为server-key.pem;opensslgenrsa-outserver-key.pem4096创建服务器证书签名请求文件,用于CA证书对服务器证书进行签名,生成文件server.csr;opensslreq-subj"/CN=*"-sha256-new-keyserver-key.pem-outserver.csr创建CA证书签名一个好的服务器证书,期间需要输入CA证书私钥密码,生成的文件是server-cert.pem;opensslx509-req-days365-sha256-inserver.csr-CAca.pem-CAkeyca-key.pem-CAcreateserial-outserver-cert.pem创建客户端私钥,生成文件为key.pem;opensslgenrsa-outkey.pem4096创建客户端证书签名请求文件,用于CA证书对客户端证书进行签名,生成文件client.csr;opensslreq-subj"/CN=client"-new-keykey.pem-outclient.csr为了使密钥适合客户端认证,创建扩展配置文件extfile-client.cnf;echoextendedKeyUsage=clientAuth>extfile-client.cnf创建一个由CA证书签名的客户端证书,期间需要输入CA证书的私钥密码,生成的文件为cert.pem;opensslx509-req-days365-sha256-inclient.csr-CAca.pem-CAkeyca-key.pem-CAcreateserial-outcert.pem-extfileextfile-client.cnf创建时删除多余的文件;rm-rfca.srlserver.csrclient.csrextfile-client.cnf最终生成的文件如下,有了它们我们就可以进行基于TLS的安全访问ca.pemCA证书ca-key.pemCA证书私钥服务器-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-Hfd://-Htcp://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远程访问!systemctldaemon-reload&&systemctlrestartdockerclientaccess接下来我们使用docker-maven-plugin来打包Docker镜像,使用的代码是原来的mall-tiny-docker例子。直接使用docker-maven-plugin打包试试。由于我们的插件版本有点低,使用较新版本的Docker会出现以下问题。升级到1.2.2版本解决该问题;[错误]无法在项目mall-tiny-docker上执行目标com.spotify:docker-maven-plugin:1.1.0:build(build-image):异常捕获:com.spotify.docker.client.shaded.com。fasterxml.jackson.databind.exc.MismatchedInputException:无法构造com.spotify.docker.client.messages.RegistryAuth的实例(尽管至少存在一个Creator):没有字符串参数构造函数/工厂方法来反序列化字符串值('桌面')[错误][来源:未知;line:-1,column:-1](通过引用链:java.util.LinkedHashMap["credsStore"])[ERROR]->[求助1]修改版本打包后发现TLS不再支持http,现在需要改用https,修改的配置为https;[错误]无法在项目mall-tiny-docker上执行目标com.spotify:docker-maven-plugin:1.2.2:build(build-image):捕获异常:请求错误:GEThttp://192.168.3.101:2375/版本:400,正文:客户端向HTTPS发送了一个HTTP请求永远。HTTP400BadRequest->【求助1】修改完成后,再次打包,继续失败。需要添加对应的客户端证书才能访问;[错误]无法执行目标com.spotify:docker-maven-plugin:1.2。2:在项目mall-tiny-docker上构建(build-image):异常捕获:java.util.concurrent.ExecutionException:com.spotify.docker.client.shaded.javax.ws.rs.ProcessingException:javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIXpathbuildingfailed:sun.security.provider.certpath.SunCertPathBuilderException:unabletofindvalidcertificationpathtorequestedtarget->[Help1]将以下文件复制到指定目录,这里复制到I:\developer\env\docker-ca;ca.pemCAcertificatecert.pemclientcertificatekey.pemclientcertificateprivatekey然后在插件的节点下配置目录,最终插件配置如下;com.spotifydocker-maven-plugin1.2.2build-imagepackagebuildmall-tiny/${project.artifactId}:${项目.version}https://192.168.3.101:2375java:8["java","-jar","/${project.build.finalName}.jar"]I:\developer\env\docker-ca<资源><资源><目标路径>/<目录>${project.build.directory}${project.build.finalName}.jar再次打包镜像,发现镜像可以打包成功,我们的2375端口终于可以安全使用了![信息]构建映像mall-tiny/mall-tiny-docker:0.0.1-SNAPSHOT步骤1/3:从java:8--->d23bdf5b1b1b步骤2/3:ADD/mall-tiny-docker-0.0.1-SNAPSHOT.jar//--->5cb5a64cceddStep3/3:ENTRYPOINT["java","-jar","/mall-tiny-docker-0.0.1-SNAPSHOT.jar"]--->Runningin5f3ceefdd974Removingintermediatecontainer5f3ceefdd974--->ee9d0e2b0114ProgressMessage{id=null,status=null,stream=null,error=null,progress=null,progressDetail=null}成功构建ee9d0e2b0114成功OT标记mall-tiny/mall-tiny-docker:0SH。[信息]内置商城小/商城小码头:0.0.1-SNAPSHOT[信息]--------------------------------------------------------------------[信息]构建成功[信息]------------------------------------------------------------------[信息]总时间:20.550秒[信息]完成时间:2020-07-31T15:02:15+08:00[INFO]最终内存:50M/490M[INFO]------------------------------------------------------------------------参考官方文档:https://docs.docker.com/engin...项目源码地址https://github.com/macrozheng...本文已收录GitHubhttps://github.com/macrozheng/mall-learning,欢迎大家Star!