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,修改
