vlambda博客
学习文章列表

docker服务安全认证

docker服务安全认证

制作证书和秘钥

  • 首先创建一个目录,例如 /data/docker-ca,用于存放证书

         mkdir /data/docker-ca && cd /data/docker-ca
  • 创建ca证书私钥,需要输入设置的ca私钥密码

         openssl genrsa -aes256 -out ca-key.pem 4096
  • 根据上一步创建的ca证书私钥创建ca证书,需要输入上一步设置的ca私钥密密码

    openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -subj "/CN=*" -out ca.pem
  • 创建服务端私钥

       openssl genrsa -out server-key.pem 4096
  • openssl req -subj "/CN=16.21.2.234" -sha256 -new -key server-key.pem -out server.csr
  •  echo subjectAltName = IP:116.21.2.234,IP:0.0.0.0 >> extfile.cnf
  • 把 extendedKeyUsage = serverAuth 键值设置到extfile.cnf文件里,限制扩展只能用在服务器认证


  echo extendedKeyUsage = serverAuth >> extfile.cnf
  • 根据证书请求签名文件生成服务端证书

      openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem -extfile extfile.cnf
  • 创建客户端私钥

    openssl genrsa -out key.pem 4096
  • 生成客户端证书请求签名文件

      openssl req -subj "/CN=client" -new -key key.pem -out client.csr
  • 继续生成客户端拓展文件

     echo extendedKeyUsage = clientAuth >> extfile.cnf
  • 生成客户端证书

       openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -extfile extfile.cnf
  • 删除临时文件

     rm -rf ca.srl server.csr client.csr extfile.cnf
  • 修改证书为只读权限保证证书安全

      chmod -v 0400 ca-key.pem key.pem server-key.pem

      chmod -v 0444 ca.pem server-cert.pem cert.pem
  • 最终生成的文件,有了它们我们就可以进行基于TLS的安全访问了

       ca.pem CA证书
       ca-key.pem CA证书私钥
       server-cert.pem 服务端证书
       server-key.pem 服务端证书私钥
       cert.pem 客户端证书
       key.pem 客户端证书私钥

7.2 配置Docker支持TLS

  • 修改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服务

     systemctl daemon-reload && systemctl restart docker  

客户端访问


下面我们通过maven插件上传docker镜像到服务器,使用的docker-maven-plugin插件版本为1.2.2


  • 将上一步生成的ca.pem证书,cert.pem 客户端证书,key.pem 客户端证书私钥复制到某个目录,例如/Users/zhaozuowen98/docker

  • pom文件里的plugin需要修改为:将 dockerCertPath指定为上一步的目录,http改为https


<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>wenzi/${project.artifactId}:${project.version}</imageName>
        <dockerHost>https://192.168.0.50:2375</dockerHost>
        <baseImage>java:8</baseImage>
        <entryPoint>["java", "-jar","/${project.build.finalName}.jar"]
        </entryPoint>
        <dockerCertPath>/Users/zhaozuowen98/docker</dockerCertPath>
        <resources>
            <resource>
                <targetPath>/</targetPath>
                <directory>${project.build.directory}</directory>
                <include>${project.build.finalName}.jar</include>
            </resource>
        </resources>
    </configuration>
</plugin>