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>