文章目录
前言
开启dockerd 的远程访问非常利于日常运维 我们可以使用docker sdk 或者docker 命令行 进行容器的日常维护与管理,
在生产环境中 开启 TLS 双向认证是非常必要的安全规则,
但是我们不会用域名为每个docker服务器设置证书,
可以使用x509扩展 将common name 设置为ip 并且可以设置多个ip 意味着 多个docker 服务器可以使用一套证书
0 环境信息
docker 引擎服务端
192.168.3.16
docker 客户端
192.168.3.14
docker 版本
19.03.9
1 创建CA证书
1.1 创建CA私钥
可在任意一个可以使用 openssl 命令行工具的操作系统 创建证书相关的文件
创建一个目录存放证书相关文件
mkdir /opt/certs
cd /opt/certs/
创建ca 私钥
openssl genrsa -out ca-key.pem 4096
1.2 生成CA证书
openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem -subj "/C=CN/ST=Shanghai/O=WhoAreYou/CN=test1"
2 用ca 证书签发服务端 证书
cd /opt/certs/
创建私钥
openssl genrsa -out server-key.pem 4096
用私钥生成证书请求文件
openssl req -subj "/CN=test1" -sha256 -new -key server-key.pem -out server.csr
配置x509证书的扩展选项 使证书可以用ip 而不是域名
本次执行的命令
echo subjectAltName = IP:192.168.3.16 > extfile.cnf
如果是多个ip 可按如下配置
echo subjectAltName = IP:10.20.0.201,IP:10.20.0.202,IP:10.20.0.203,IP:10.255.128.133,IP:127.0.0.1 > extfile.cnf
也可以按照如下书写
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
IP.1=172.16.100.216
IP.2=10.20.0.201
IP.3=10.20.0.202
IP.4=10.20.0.203
IP.5=10.20.0.204
IP.6=10.20.0.205
IP.7=10.20.0.206
将Docker守护程序密钥的扩展使用属性设置为仅用于服务器身份验证
echo extendedKeyUsage = serverAuth >> extfile.cnf
用ca 签发证书
openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem \
-CAcreateserial -out server-cert.pem -extfile extfile.cnf
3 为docker引擎部署服务端证书
sudo mkdir /var/docker
sudo cp /opt/certs/{server-cert.pem,server-key.pem,ca.pem} /var/docker/
分别是 dockerd的 服务端证书 服务端私钥 和 ca 证书
sudo cp /usr/lib/systemd/system/docker.service /usr/lib/systemd/system/docker.service-bak
sudo vim /usr/lib/systemd/system/docker.service
修改如下行
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
修改后如下
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2376 -H fd:// --containerd=/run/containerd/containerd.sock \
--tlsverify=true \
--tlscert=/var/docker/server-cert.pem \
--tlskey=/var/docker/server-key.pem \
--tlscacert=/var/docker/ca.pem
sudo systemctl daemon-reload
sudo systemctl restart docker
5 用ca 证书签发客户端证书:
客户端私钥
cd /opt/certs/
openssl genrsa -out key.pem 4096
生成 客户端证书请求文件
openssl req -subj '/CN=client' -new -key key.pem -out client.csr
编辑配置文件 extfile.cnf
echo extendedKeyUsage = clientAuth > extfile.cnf
客户端的证书只需要开启clientAuth 所以是清空后仅写入了一行
extendedKeyUsage = clientAuth
用CA为客户端签署证书文件
openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem \
-CAcreateserial -out cert.pem -extfile extfile.cnf
6 验证 tls 证书
在 192.168.3.16 上验证
cd /opt/certs
docker --tlsverify --tlscacert=./ca.pem --tlscert=./cert.pem --tlskey=./key.pem -H 192.168.3.16:2376 version
在 192.168.3.14 上验证
拷贝证书
scp 192.168.3.16:/opt/certs/{ca.pem,cert.pem,key.pem} /opt/
cd /opt/
docker --tlsverify --tlscacert=./ca.pem --tlscert=./cert.pem --tlskey=./key.pem -H 192.168.3.16:2376 version
在任何可以访问到服务端 2376 端口的服务器上 都可以使用证书访问
7 补充
删除证书请求文件:
rm -v client.csr server.csr
默认的私钥权限太开放了,为了更加的安全,我们需要更改证书的权限,删除写入权限,限制阅读权限(只有你能查看):
chmod -v 0400 ca-key.pem key.pem server-key.pem
证书文件删除其写入权限:
chmod -v 0444 ca.pem server-cert.pem cert.pem