Docker - Docker远程安全访问
发布日期:2021-06-30 16:04:43 浏览次数:2 分类:技术文章

本文共 10381 字,大约阅读时间需要 34 分钟。

Docker - Docker远程安全访问

上一篇博客介绍了关于Docker远程访问的内容:。

但直接把Docker这样对外暴露是非常危险的,就跟你服务器上的Redis对外开放(无保护暴露6379端口),还不设置密码一样。

其实官方文档已经提供基于CA证书的加密方法:。

生成CA私钥和CA公钥

创建一个ca文件夹用来存放密钥。

[root@izoq008ryseuupz ~]# mkdir -p ca[root@izoq008ryseuupz ~]# lltotal 1094964-rw-r--r-- 1 root root  19278570 Dec  5 13:05 blog.jardrwxr-xr-x 2 root root      4096 Dec 21 21:17 ca-rw-r--r-- 1 root root 716177408 Nov 19 05:01 CentOS-8.3.2011-x86_64-boot.iso-rw-r--r-- 1 root root        41 Dec 18 09:33 Dockerfile-rwxr-xr-x 1 root root     16424 Nov 22 12:30 hello-rw-r--r-- 1 root root        91 Nov 22 12:27 hello.cdrwxr-xr-x 2 root root      4096 Dec 18 12:20 home-rw-r--r-- 1 root root        14 Nov 23 20:21 kaven-rw-r--r-- 1 root root 201551872 Nov 22 11:53 kaven.blog.tardrwxr-xr-x 4 root root      4096 Dec  3 21:37 logs-rw-r--r-- 1 root root 184168474 Sep 25 20:35 mall.jardrwxr-xr-x 2 root root      4096 Nov 25 20:08 volume[root@izoq008ryseuupz ~]# cd ca

首先,在Docker守护进程的主机上,生成CA私钥和公钥:

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

执行上面这条命令后,会要求我们输入密码以及再次输入密码进行验证,其实就是设置一个密码。

[root@izoq008ryseuupz ca]# openssl genrsa -aes256 -out ca-key.pem 4096Generating RSA private key, 4096 bit long modulus......................................................................................................++............++e is 65537 (0x10001)Enter pass phrase for ca-key.pem:Verifying - Enter pass phrase for ca-key.pem:

生成了ca-key.pem文件。

[root@izoq008ryseuupz ca]# lltotal 4-rw-r--r-- 1 root root 3326 Dec 21 21:22 ca-key.pem

看一下ca-key.pem文件里面的内容。

vim ca-key.pem

在这里插入图片描述

补全CA证书信息

执行如下命令:

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

然后依次输入:密码、国家、省、市、组织名称、单位名称、通用名称、邮箱等。组织名称、单位名称、通用名称博主这里都用kaven代替了,邮箱是博主的QQ邮箱。

[root@izoq008ryseuupz ca]# openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pemEnter pass phrase for ca-key.pem:You are about to be asked to enter information that will be incorporatedinto your certificate request.What you are about to enter is what is called a Distinguished Name or a DN.There are quite a few fields but you can leave some blankFor some fields there will be a default value,If you enter '.', the field will be left blank.-----Country Name (2 letter code) [XX]:cnState or Province Name (full name) []:hunanLocality Name (eg, city) [Default City]:changshaOrganization Name (eg, company) [Default Company Ltd]:kavenOrganizational Unit Name (eg, section) []:kavenCommon Name (eg, your name or your server's hostname) []:kavenEmail Address []:xxxxxxxxx@qq.com

现在CA证书就创建完成了,有了CA证书之后,就可以创建服务器密钥和证书签名请求(CSR)了,确保“通用名称”(博主设置的是kaven)与你连接Docker时使用的主机名相匹配。

生成了ca.pem文件。

[root@izoq008ryseuupz ca]# lltotal 8-rw-r--r-- 1 root root 3326 Dec 21 21:22 ca-key.pem-rw-r--r-- 1 root root 2090 Dec 21 21:36 ca.pem

生成server-key.pem

执行如下命令:

openssl genrsa -out server-key.pem 4096

生成了server-key.pem文件。

[root@izoq008ryseuupz ca]# openssl genrsa -out server-key.pem 4096Generating RSA private key, 4096 bit long modulus.............................................................................................++.++e is 65537 (0x10001)[root@izoq008ryseuupz ca]# lltotal 12-rw-r--r-- 1 root root 3326 Dec 21 21:22 ca-key.pem-rw-r--r-- 1 root root 2090 Dec 21 21:36 ca.pem-rw-r--r-- 1 root root 3243 Dec 21 21:43 server-key.pem

用CA签署公钥

可以通过IP地址或域名建立TLS连接。

  • IP地址:openssl req -subj "/CN=220.181.38.148" -sha256 -new -key server-key.pem -out server.csr,填你主机的IP地址。
  • 域名: openssl req -subj "/CN=www.baidu.com" -sha256 -new -key server-key.pem -out server.csr,填与你主机IP地址绑定的域名。

这里填的IP地址或域名,都是将来用于对外的地址,就是远程设备连接服务器Docker的一个地址,博主最后会用IDEA连接服务器Docker,就是使用这里填写的域名(如下图所示,博主填的是域名)。

在这里插入图片描述
生成了server.csr文件。

[root@izoq008ryseuupz ca]# lltotal 16-rw-r--r-- 1 root root 3326 Dec 21 21:22 ca-key.pem-rw-r--r-- 1 root root 2090 Dec 21 21:36 ca.pem-rw-r--r-- 1 root root 1590 Dec 21 21:54 server.csr-rw-r--r-- 1 root root 3243 Dec 21 21:43 server-key.pem

配置白名单

配置白名单的意义在于,允许哪些IP地址可以远程连接服务器上的Docker:

# 220.181.38.148 服务器上的 docker,只允许IP地址为101.102.103.104的客户连接echo subjectAltName = DNS:220.181.38.148,IP:101.102.103.104 >> extfile.cnf# www.baidu.com 服务器上的 docker,只允许IP地址为101.102.103.104与127.0.0.1的客户连接echo subjectAltName = DNS:www.baidu.com,IP:101.102.103.104,IP:127.0.0.1 >> extfile.cnf

允许指定的IP地址可以远程连接到服务器上的Docker,多个IP地址用逗号分隔。

配置IP地址0.0.0.0可以远程连接服务器上的Docker,即允许所有的IP地址可以远程连接:

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

在这里插入图片描述

生成了extfile.cnf文件。

[root@izoq008ryseuupz ca]# lltotal 20-rw-r--r-- 1 root root 3326 Dec 21 21:22 ca-key.pem-rw-r--r-- 1 root root 2090 Dec 21 21:36 ca.pem-rw-r--r-- 1 root root   76 Dec 21 22:14 extfile.cnf-rw-r--r-- 1 root root 1590 Dec 21 21:54 server.csr-rw-r--r-- 1 root root 3243 Dec 21 21:43 server-key.pem

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

在这里插入图片描述
在这里插入图片描述

生成签名证书

执行如下命令:

openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem \  -CAcreateserial -out server-cert.pem -extfile extfile.cnf

输入密码(www.baidu.com这里应该是你之前填的域名或者IP地址)。

[root@izoq008ryseuupz ca]# openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem \>   -CAcreateserial -out server-cert.pem -extfile extfile.cnfSignature oksubject=/CN=www.baidu.comGetting CA Private KeyEnter pass phrase for ca-key.pem:

生成了ca.srlserver-cert.pem文件。

[root@izoq008ryseuupz ca]# lltotal 28-rw-r--r-- 1 root root 3326 Dec 21 21:22 ca-key.pem-rw-r--r-- 1 root root 2090 Dec 21 21:36 ca.pem-rw-r--r-- 1 root root   17 Dec 21 22:17 ca.srl-rw-r--r-- 1 root root   76 Dec 21 22:14 extfile.cnf-rw-r--r-- 1 root root 1911 Dec 21 22:17 server-cert.pem-rw-r--r-- 1 root root 1590 Dec 21 21:54 server.csr-rw-r--r-- 1 root root 3243 Dec 21 21:43 server-key.pem

创建客户端密钥和证书签名请求

执行如下命令:

openssl genrsa -out key.pem 4096ll
[root@izoq008ryseuupz ca]# openssl genrsa -out key.pem 4096Generating RSA private key, 4096 bit long modulus....................................................................++....++e is 65537 (0x10001)

生成了key.pem文件。

[root@izoq008ryseuupz ca]# lltotal 32-rw-r--r-- 1 root root 3326 Dec 21 21:22 ca-key.pem-rw-r--r-- 1 root root 2090 Dec 21 21:36 ca.pem-rw-r--r-- 1 root root   17 Dec 21 22:17 ca.srl-rw-r--r-- 1 root root   76 Dec 21 22:14 extfile.cnf-rw-r--r-- 1 root root 3243 Dec 21 22:20 key.pem-rw-r--r-- 1 root root 1911 Dec 21 22:17 server-cert.pem-rw-r--r-- 1 root root 1590 Dec 21 21:54 server.csr-rw-r--r-- 1 root root 3243 Dec 21 21:43 server-key.pem

执行如下命令:

openssl req -subj '/CN=client' -new -key key.pem -out client.csr

生成了client.csr文件。

[root@izoq008ryseuupz ca]# lltotal 36-rw-r--r-- 1 root root 3326 Dec 21 21:22 ca-key.pem-rw-r--r-- 1 root root 2090 Dec 21 21:36 ca.pem-rw-r--r-- 1 root root   17 Dec 21 22:17 ca.srl-rw-r--r-- 1 root root 1582 Dec 21 22:35 client.csr-rw-r--r-- 1 root root   76 Dec 21 22:14 extfile.cnf-rw-r--r-- 1 root root 3243 Dec 21 22:20 key.pem-rw-r--r-- 1 root root 1911 Dec 21 22:17 server-cert.pem-rw-r--r-- 1 root root 1590 Dec 21 21:54 server.csr-rw-r--r-- 1 root root 3243 Dec 21 21:43 server-key.pem

使密钥适合客户端身份验证

为了使密钥适合客户端身份验证,请创建一个新的扩展配置文件:

echo extendedKeyUsage = clientAuth > extfile-client.cnf

生成了extfile-client.cnf文件。

[root@izoq008ryseuupz ca]# lltotal 40-rw-r--r-- 1 root root 3326 Dec 21 21:22 ca-key.pem-rw-r--r-- 1 root root 2090 Dec 21 21:36 ca.pem-rw-r--r-- 1 root root   17 Dec 21 22:17 ca.srl-rw-r--r-- 1 root root 1582 Dec 21 22:35 client.csr-rw-r--r-- 1 root root   30 Dec 21 22:37 extfile-client.cnf-rw-r--r-- 1 root root   76 Dec 21 22:14 extfile.cnf-rw-r--r-- 1 root root 3243 Dec 21 22:20 key.pem-rw-r--r-- 1 root root 1911 Dec 21 22:17 server-cert.pem-rw-r--r-- 1 root root 1590 Dec 21 21:54 server.csr-rw-r--r-- 1 root root 3243 Dec 21 21:43 server-key.pem

生成签名证书

执行如下命令:

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

输入密码:

[root@izoq008ryseuupz ca]# openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem \>   -CAcreateserial -out cert.pem -extfile extfile-client.cnfSignature oksubject=/CN=clientGetting CA Private KeyEnter pass phrase for ca-key.pem:

生成了cert.pem文件。

[root@izoq008ryseuupz ca]# lltotal 44-rw-r--r-- 1 root root 3326 Dec 21 21:22 ca-key.pem-rw-r--r-- 1 root root 2090 Dec 21 21:36 ca.pem-rw-r--r-- 1 root root   17 Dec 21 22:39 ca.srl-rw-r--r-- 1 root root 1858 Dec 21 22:39 cert.pem-rw-r--r-- 1 root root 1582 Dec 21 22:35 client.csr-rw-r--r-- 1 root root   30 Dec 21 22:37 extfile-client.cnf-rw-r--r-- 1 root root   76 Dec 21 22:14 extfile.cnf-rw-r--r-- 1 root root 3243 Dec 21 22:20 key.pem-rw-r--r-- 1 root root 1911 Dec 21 22:17 server-cert.pem-rw-r--r-- 1 root root 1590 Dec 21 21:54 server.csr-rw-r--r-- 1 root root 3243 Dec 21 21:43 server-key.pem

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

rm -v client.csr server.csr extfile.cnf extfile-client.cnf
[root@izoq008ryseuupz ca]# rm -v client.csr server.csr extfile.cnf extfile-client.cnfrm: remove regular file ‘client.csr’? yremoved ‘client.csr’rm: remove regular file ‘server.csr’? yremoved ‘server.csr’rm: remove regular file ‘extfile.cnf’? yremoved ‘extfile.cnf’rm: remove regular file ‘extfile-client.cnf’? yremoved ‘extfile-client.cnf’

修改权限

为了防止密钥意外损坏,请删除其写权限。要使它们仅供阅读,请按以下方式更改文件模式:

chmod -v 0400 ca-key.pem key.pem server-key.pem
[root@izoq008ryseuupz ca]# chmod -v 0400 ca-key.pem key.pem server-key.pemmode of ‘ca-key.pem’ changed from 0644 (rw-r--r--) to 0400 (r--------)mode of ‘key.pem’ changed from 0644 (rw-r--r--) to 0400 (r--------)mode of ‘server-key.pem’ changed from 0644 (rw-r--r--) to 0400 (r--------)

证书也需要删除写权限以防止意外损坏:

[root@izoq008ryseuupz ca]# chmod -v 0444 ca.pem server-cert.pem cert.pemmode of ‘ca.pem’ changed from 0644 (rw-r--r--) to 0444 (r--r--r--)mode of ‘server-cert.pem’ changed from 0644 (rw-r--r--) to 0444 (r--r--r--)mode of ‘cert.pem’ changed from 0644 (rw-r--r--) to 0444 (r--r--r--)

将证书放在主机目录的指定位置,方便之后修改Docker的配置文件:

[root@izoq008ryseuupz ca]# cp server-*.pem /etc/docker/[root@izoq008ryseuupz ca]# cp ca.pem /etc/docker/

修改Docker配置

vim /lib/systemd/system/docker.service

ExecStart参数修改如下:

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

在这里插入图片描述

重新加载服务配置文件并且重新启动Docker服务。

[root@izoq008ryseuupz ca]# systemctl daemon-reload[root@izoq008ryseuupz ca]# systemctl restart docker

测试

IDEA现在是无法远程连接服务器上的Docker了,因为它没有证书。

在这里插入图片描述

把证书下载到本地。

在这里插入图片描述
TCP协议需要改成HTTPS协议,之前填的是域名就写域名,填的是IP地址就写IP地址,不然会报错,具体内容如下图所示(官方推荐使用端口2376与守护进程进行加密通信):
在这里插入图片描述

转载地址:https://kaven.blog.csdn.net/article/details/111499910 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Kubernetes - Kubernetes是什么?
下一篇:Docker - Docker开启远程访问

发表评论

最新留言

很好
[***.229.124.182]2024年05月05日 07时51分13秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章