Docker - Docker远程安全访问

忘是亡心i 2022-12-29 09:39 234阅读 0赞

Docker - Docker远程安全访问

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

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

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

生成CA私钥和CA公钥

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

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

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

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

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

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

生成了ca-key.pem文件。

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

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

  1. vim ca-key.pem

在这里插入图片描述

补全CA证书信息

执行如下命令:

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

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

  1. [root@izoq008ryseuupz ca]# openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem
  2. Enter pass phrase for ca-key.pem:
  3. You are about to be asked to enter information that will be incorporated
  4. into your certificate request.
  5. What you are about to enter is what is called a Distinguished Name or a DN.
  6. There are quite a few fields but you can leave some blank
  7. For some fields there will be a default value,
  8. If you enter '.', the field will be left blank.
  9. -----
  10. Country Name (2 letter code) [XX]:cn
  11. State or Province Name (full name) []:hunan
  12. Locality Name (eg, city) [Default City]:changsha
  13. Organization Name (eg, company) [Default Company Ltd]:kaven
  14. Organizational Unit Name (eg, section) []:kaven
  15. Common Name (eg, your name or your server's hostname) []:kaven
  16. Email Address []:xxxxxxxxx@qq.com

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

生成了ca.pem文件。

  1. [root@izoq008ryseuupz ca]# ll
  2. total 8
  3. -rw-r--r-- 1 root root 3326 Dec 21 21:22 ca-key.pem
  4. -rw-r--r-- 1 root root 2090 Dec 21 21:36 ca.pem

生成server-key.pem

执行如下命令:

  1. openssl genrsa -out server-key.pem 4096

生成了server-key.pem文件。

  1. [root@izoq008ryseuupz ca]# openssl genrsa -out server-key.pem 4096
  2. Generating RSA private key, 4096 bit long modulus
  3. .............................................................................................++
  4. .++
  5. e is 65537 (0x10001)
  6. [root@izoq008ryseuupz ca]# ll
  7. total 12
  8. -rw-r--r-- 1 root root 3326 Dec 21 21:22 ca-key.pem
  9. -rw-r--r-- 1 root root 2090 Dec 21 21:36 ca.pem
  10. -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文件。

  1. [root@izoq008ryseuupz ca]# ll
  2. total 16
  3. -rw-r--r-- 1 root root 3326 Dec 21 21:22 ca-key.pem
  4. -rw-r--r-- 1 root root 2090 Dec 21 21:36 ca.pem
  5. -rw-r--r-- 1 root root 1590 Dec 21 21:54 server.csr
  6. -rw-r--r-- 1 root root 3243 Dec 21 21:43 server-key.pem

配置白名单

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

  1. # 220.181.38.148 服务器上的 docker,只允许IP地址为101.102.103.104的客户连接
  2. echo subjectAltName = DNS:220.181.38.148,IP:101.102.103.104 >> extfile.cnf
  3. # www.baidu.com 服务器上的 docker,只允许IP地址为101.102.103.104与127.0.0.1的客户连接
  4. 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地址可以远程连接:

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

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

  1. [root@izoq008ryseuupz ca]# ll
  2. total 20
  3. -rw-r--r-- 1 root root 3326 Dec 21 21:22 ca-key.pem
  4. -rw-r--r-- 1 root root 2090 Dec 21 21:36 ca.pem
  5. -rw-r--r-- 1 root root 76 Dec 21 22:14 extfile.cnf
  6. -rw-r--r-- 1 root root 1590 Dec 21 21:54 server.csr
  7. -rw-r--r-- 1 root root 3243 Dec 21 21:43 server-key.pem

将Docker守护进程密钥的扩展使用属性设置为仅用于服务器身份验证:
在这里插入图片描述
在这里插入图片描述

生成签名证书

执行如下命令:

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

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

  1. [root@izoq008ryseuupz ca]# openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem \
  2. > -CAcreateserial -out server-cert.pem -extfile extfile.cnf
  3. Signature ok
  4. subject=/CN=www.baidu.com
  5. Getting CA Private Key
  6. Enter pass phrase for ca-key.pem:

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

  1. [root@izoq008ryseuupz ca]# ll
  2. total 28
  3. -rw-r--r-- 1 root root 3326 Dec 21 21:22 ca-key.pem
  4. -rw-r--r-- 1 root root 2090 Dec 21 21:36 ca.pem
  5. -rw-r--r-- 1 root root 17 Dec 21 22:17 ca.srl
  6. -rw-r--r-- 1 root root 76 Dec 21 22:14 extfile.cnf
  7. -rw-r--r-- 1 root root 1911 Dec 21 22:17 server-cert.pem
  8. -rw-r--r-- 1 root root 1590 Dec 21 21:54 server.csr
  9. -rw-r--r-- 1 root root 3243 Dec 21 21:43 server-key.pem

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

执行如下命令:

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

生成了key.pem文件。

  1. [root@izoq008ryseuupz ca]# ll
  2. total 32
  3. -rw-r--r-- 1 root root 3326 Dec 21 21:22 ca-key.pem
  4. -rw-r--r-- 1 root root 2090 Dec 21 21:36 ca.pem
  5. -rw-r--r-- 1 root root 17 Dec 21 22:17 ca.srl
  6. -rw-r--r-- 1 root root 76 Dec 21 22:14 extfile.cnf
  7. -rw-r--r-- 1 root root 3243 Dec 21 22:20 key.pem
  8. -rw-r--r-- 1 root root 1911 Dec 21 22:17 server-cert.pem
  9. -rw-r--r-- 1 root root 1590 Dec 21 21:54 server.csr
  10. -rw-r--r-- 1 root root 3243 Dec 21 21:43 server-key.pem

执行如下命令:

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

生成了client.csr文件。

  1. [root@izoq008ryseuupz ca]# ll
  2. total 36
  3. -rw-r--r-- 1 root root 3326 Dec 21 21:22 ca-key.pem
  4. -rw-r--r-- 1 root root 2090 Dec 21 21:36 ca.pem
  5. -rw-r--r-- 1 root root 17 Dec 21 22:17 ca.srl
  6. -rw-r--r-- 1 root root 1582 Dec 21 22:35 client.csr
  7. -rw-r--r-- 1 root root 76 Dec 21 22:14 extfile.cnf
  8. -rw-r--r-- 1 root root 3243 Dec 21 22:20 key.pem
  9. -rw-r--r-- 1 root root 1911 Dec 21 22:17 server-cert.pem
  10. -rw-r--r-- 1 root root 1590 Dec 21 21:54 server.csr
  11. -rw-r--r-- 1 root root 3243 Dec 21 21:43 server-key.pem

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

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

  1. echo extendedKeyUsage = clientAuth > extfile-client.cnf

生成了extfile-client.cnf文件。

  1. [root@izoq008ryseuupz ca]# ll
  2. total 40
  3. -rw-r--r-- 1 root root 3326 Dec 21 21:22 ca-key.pem
  4. -rw-r--r-- 1 root root 2090 Dec 21 21:36 ca.pem
  5. -rw-r--r-- 1 root root 17 Dec 21 22:17 ca.srl
  6. -rw-r--r-- 1 root root 1582 Dec 21 22:35 client.csr
  7. -rw-r--r-- 1 root root 30 Dec 21 22:37 extfile-client.cnf
  8. -rw-r--r-- 1 root root 76 Dec 21 22:14 extfile.cnf
  9. -rw-r--r-- 1 root root 3243 Dec 21 22:20 key.pem
  10. -rw-r--r-- 1 root root 1911 Dec 21 22:17 server-cert.pem
  11. -rw-r--r-- 1 root root 1590 Dec 21 21:54 server.csr
  12. -rw-r--r-- 1 root root 3243 Dec 21 21:43 server-key.pem

生成签名证书

执行如下命令:

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

输入密码:

  1. [root@izoq008ryseuupz ca]# openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem \
  2. > -CAcreateserial -out cert.pem -extfile extfile-client.cnf
  3. Signature ok
  4. subject=/CN=client
  5. Getting CA Private Key
  6. Enter pass phrase for ca-key.pem:

生成了cert.pem文件。

  1. [root@izoq008ryseuupz ca]# ll
  2. total 44
  3. -rw-r--r-- 1 root root 3326 Dec 21 21:22 ca-key.pem
  4. -rw-r--r-- 1 root root 2090 Dec 21 21:36 ca.pem
  5. -rw-r--r-- 1 root root 17 Dec 21 22:39 ca.srl
  6. -rw-r--r-- 1 root root 1858 Dec 21 22:39 cert.pem
  7. -rw-r--r-- 1 root root 1582 Dec 21 22:35 client.csr
  8. -rw-r--r-- 1 root root 30 Dec 21 22:37 extfile-client.cnf
  9. -rw-r--r-- 1 root root 76 Dec 21 22:14 extfile.cnf
  10. -rw-r--r-- 1 root root 3243 Dec 21 22:20 key.pem
  11. -rw-r--r-- 1 root root 1911 Dec 21 22:17 server-cert.pem
  12. -rw-r--r-- 1 root root 1590 Dec 21 21:54 server.csr
  13. -rw-r--r-- 1 root root 3243 Dec 21 21:43 server-key.pem

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

  1. rm -v client.csr server.csr extfile.cnf extfile-client.cnf
  2. [root@izoq008ryseuupz ca]# rm -v client.csr server.csr extfile.cnf extfile-client.cnf
  3. rm: remove regular file client.csr’? y
  4. removed client.csr
  5. rm: remove regular file server.csr’? y
  6. removed server.csr
  7. rm: remove regular file extfile.cnf’? y
  8. removed extfile.cnf
  9. rm: remove regular file extfile-client.cnf’? y
  10. removed extfile-client.cnf

修改权限

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

  1. chmod -v 0400 ca-key.pem key.pem server-key.pem
  2. [root@izoq008ryseuupz ca]# chmod -v 0400 ca-key.pem key.pem server-key.pem
  3. mode of ca-key.pem changed from 0644 (rw-r--r--) to 0400 (r--------)
  4. mode of key.pem changed from 0644 (rw-r--r--) to 0400 (r--------)
  5. mode of server-key.pem changed from 0644 (rw-r--r--) to 0400 (r--------)

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

  1. [root@izoq008ryseuupz ca]# chmod -v 0444 ca.pem server-cert.pem cert.pem
  2. mode of ca.pem changed from 0644 (rw-r--r--) to 0444 (r--r--r--)
  3. mode of server-cert.pem changed from 0644 (rw-r--r--) to 0444 (r--r--r--)
  4. mode of cert.pem changed from 0644 (rw-r--r--) to 0444 (r--r--r--)

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

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

修改Docker配置

  1. vim /lib/systemd/system/docker.service

ExecStart参数修改如下:

  1. 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服务。

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

测试

IDEA现在是无法远程连接服务器上的Docker了,因为它没有证书。
在这里插入图片描述

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

发表评论

表情:
评论列表 (有 0 条评论,234人围观)

还没有评论,来说两句吧...

相关阅读