编辑
2024-08-18
Docker
0
请注意,本文编写于 64 天前,最后修改于 64 天前,其中某些信息可能已经过时。

目录

使用 OpenSSL 创建 CA、服务器和客户端密钥
使用OpenSSL生成 CA 私钥和公钥文件
使用 CA 签署公钥
生成签名证书
继续创建客户端密钥和证书签名请求:
要使密钥适合客户端身份验证,请创建一个新的扩展配置文件:
现在,生成签名证书:
生成后cert.pem,server-cert.pem您可以安全地删除两个证书签名请求和扩展配置文件:
让 Docker daemon只接受来自提供 CA 信任的证书的客户端的连接
把dockerd要用到的文件找个地方单独存放:
在启动docker daemon时开启TSL认证,并指定ca、公钥秘钥:
使用service
修改ExecStart为如下:
客户端设置
将客户端密钥和签名证书拉取到客户端

Screenshot 2024-08-18 at 19.25.48.png Docker不仅仅只能本地管理,也可以远程连接,很多应用就需要用到它,但是默认的连接端口2375并不加密,总感觉不安全,所以我们需要开启TLS并使用2376端口。

具体操作步骤:

使用 OpenSSL 创建 CA、服务器和客户端密钥

首先,在远端的docker宿主主机上新建个文件夹,保存生成的 CA 私钥和公钥文件:

mkdir ~/ca cd ~/ca

使用OpenSSL生成 CA 私钥和公钥文件

依次执行以下命令:

openssl genrsa -aes256 -out ca-key.pem 4096

这里需要输入一个密码,请牢记这个密码,后面要用到

openssl req -new -x509 -days 3650 -key ca-key.pem -sha256 -out ca.pem

这里需要输入密码、国家、省、市、组织、单位、Common name、邮箱等。Common name填写 ip地址

openssl genrsa -out server-key.pem 4096
openssl req -subj "/CN=$HOST" -sha256 -new -key server-key.pem -out server.csr

注意,将/CN=后面的$HOST替换成docker所在主机的域名或者IP地址。

使用 CA 签署公钥

echo subjectAltName = DNS:$HOST,IP:0.0.0.0 >> extfile.cnf

同样要替换$HOST为docker所在主机的域名或者IP地址

由于这是服务器公钥,所以这里的IP是指服务器IP。上面是允许所有IP远程访问,也可以只允许指定的IP访问。例如,只允许192.88.9.8进行连接

将 Docker 守护程序密钥的扩展使用属性设置为仅用于服务器身份验证:

echo extendedKeyUsage = serverAuth >> extfile.cnf

生成签名证书

openssl x509 -req -days 3650 -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-client.cnf

现在,生成签名证书:

openssl x509 -req -days 3650 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -extfile extfile-client.cnf

生成后cert.pem,server-cert.pem您可以安全地删除两个证书签名请求和扩展配置文件:

rm -v client.csr server.csr extfile.cnf extfile-client.cnf

默认umask值为 022,您的密钥对您和您的组来说是世界可读和可写的。

为保护您的密钥免受意外损坏,请移除其写入权限。要使它们只能由您读取,请按如下方式更改文件模式:

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

证书可以是全世界可读的,但您可能希望删除写入权限以防止意外损坏:

chmod -v 0444 ca.pem server-cert.pem cert.pem

让 Docker daemon只接受来自提供 CA 信任的证书的客户端的连接

把dockerd要用到的文件找个地方单独存放:

cp {ca,server-*}.pem /etc/docker/

在启动docker daemon时开启TSL认证,并指定ca、公钥秘钥:

注意:基于 TLS 的 Docker 应该在 TCP 端口 2376 上运行。

使用service

一般是使用service管理docker daemon,配置:

vim /lib/systemd/system/docker.service

修改ExecStart为如下:

ExecStart=/usr/bin/dockerd -H fd:// -H unix:///var/run/docker.sock --containerd=/run/containerd/containerd.sock --tlsverify --tlscacert=/etc/docker/ca.pem --tlscert=/etc/docker/server-cert.pem --tlskey=/etc/docker/server-key.pem -H tcp://0.0.0.0:2376

修改后记得reload一下

systemctl daemon-reload

重启docker daemon服务:

systemctl restart docker

客户端设置

将客户端密钥和签名证书拉取到客户端

使用scp命令拉取服务器上的客户端秘钥和签名证书:

C:\Users\xxx> scp root@$HOST:~/ca/{ca,cert,key}.pem ./.ca/docker

同样将 $HOST 替换成docker daemon所在服务器的ip或域名

本文作者:Jackie.H

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!