关于java:Docker服务开放了这个端口服务器分分钟变肉机

38次阅读

共计 5542 个字符,预计需要花费 14 分钟才能阅读完成。

SpringBoot 实战电商我的项目 mall(39k+star)地址:https://github.com/macrozheng/mall

摘要

之前有很多敌人提过,当应用 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 /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,批改<dockerHost> 配置为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 客户端证书私钥
  • 而后将该目录配置在插件的 <dockerCertPath> 节点下,最终插件配置如下;
<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] ------------------------------------------------------------------------

参考资料

官网文档:https://docs.docker.com/engin…

我的项目源码地址

https://github.com/macrozheng…

本文 GitHub https://github.com/macrozheng/mall-learning 曾经收录,欢送大家 Star!

正文完
 0