docker引擎开启TLS双向认证

前言

开启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
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值