Docker - Docker远程安全访问
Docker - Docker远程安全访问
上一篇博客介绍了关于Docker远程访问的内容:Docker - Docker开启远程访问。
但直接把Docker这样对外暴露是非常危险的,就跟你服务器上的Redis对外开放(无保护暴露6379
端口),还不设置密码一样。
其实官方文档已经提供基于CA证书的加密方法:Protect the Docker daemon socket。
生成CA私钥和CA公钥
创建一个ca
文件夹用来存放密钥。
[root@izoq008ryseuupz ~]# mkdir -p ca
[root@izoq008ryseuupz ~]# ll
total 1094964
-rw-r--r-- 1 root root 19278570 Dec 5 13:05 blog.jar
drwxr-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.c
drwxr-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.tar
drwxr-xr-x 4 root root 4096 Dec 3 21:37 logs
-rw-r--r-- 1 root root 184168474 Sep 25 20:35 mall.jar
drwxr-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 4096
Generating 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]# ll
total 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.pem
Enter pass phrase for ca-key.pem:
You are about to be asked to enter information that will be incorporated
into 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 blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:cn
State or Province Name (full name) []:hunan
Locality Name (eg, city) [Default City]:changsha
Organization Name (eg, company) [Default Company Ltd]:kaven
Organizational Unit Name (eg, section) []:kaven
Common Name (eg, your name or your server's hostname) []:kaven
Email Address []:xxxxxxxxx@qq.com
现在CA证书就创建完成了,有了CA证书之后,就可以创建服务器密钥和证书签名请求(CSR)了,确保“通用名称”(博主设置的是kaven
)与你连接Docker时使用的主机名相匹配。
生成了ca.pem
文件。
[root@izoq008ryseuupz ca]# ll
total 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 4096
Generating RSA private key, 4096 bit long modulus
.............................................................................................++
.++
e is 65537 (0x10001)
[root@izoq008ryseuupz ca]# ll
total 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]# ll
total 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]# ll
total 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.cnf
Signature ok
subject=/CN=www.baidu.com
Getting CA Private Key
Enter pass phrase for ca-key.pem:
生成了ca.srl
、server-cert.pem
文件。
[root@izoq008ryseuupz ca]# ll
total 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 4096
Generating RSA private key, 4096 bit long modulus
....................................................................++
....++
e is 65537 (0x10001)
生成了key.pem
文件。
[root@izoq008ryseuupz ca]# ll
total 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]# ll
total 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]# ll
total 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.cnf
Signature ok
subject=/CN=client
Getting CA Private Key
Enter pass phrase for ca-key.pem:
生成了cert.pem
文件。
[root@izoq008ryseuupz ca]# ll
total 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.pem
,server-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.cnf
rm: remove regular file ‘client.csr’? y
removed ‘client.csr’
rm: remove regular file ‘server.csr’? y
removed ‘server.csr’
rm: remove regular file ‘extfile.cnf’? y
removed ‘extfile.cnf’
rm: remove regular file ‘extfile-client.cnf’? y
removed ‘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.pem
mode 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.pem
mode 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
与守护进程进行加密通信):
还没有评论,来说两句吧...