Docker远程访问控制的安全问题(Docker remote api 访问控制)以及Docker-TLS加密通讯 操作测试

环境:

名字 ip
master 20.0.0.100
client 20.0.0.101

Docker remote api 访问控制

Docker的远程调用 API 接口存在未授权访问漏洞,至少应限制外网访问。建议使用 Socket 方式访问。

监听内网 ip,docker daemon 启动方式如下。

docker -d -H uninx:///var/run/docker.sock -H tcp://主机ip地址:端口号

或者
master服务端开放本地监听地址和端口

服务端开放本地监听地址和端口

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

ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://主机ip地址:端口号

然后,在服务端的 firewalld 上做 IP 访问控制即可。(source address 是客户端地址)

firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="客户端ip" port protocol="tcp" port="2375" accept"

firewall-cmd --reload '重载'

或者
关闭防火墙

[root@master ~]# systemctl stop firewalld
[root@master ~]# setenforce 0
vim /usr/lib/systemd/system/docker.service
添加
ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://20.0.0.100:2375   
systemctl daemon-reload 守护进程
systemctl restart docker
netstat -ntap | grep 2375
tcp        0      0 20.0.0.100:2375          0.0.0.0:*               LISTEN      69634/dockerd  

docker pull nginx '下载镜像测试'

客户端操作实现远程调用

客户机查看master的镜像

docker -H tcp://20.0.0.10 images

master服务器启动nginx 测试查看

docker run -itd nginx:latest /bin/bash '在服务端运行容器'

docker -H tcp://20.0.0.100 ps -a  '客户端远程查看'

Docker-TLS加密通讯

主要作用为了防止链路劫持、会话劫持等问题导致 Docker 通信时被中间人攻击,c/s 两端应该通过加密方式通讯。

加密通信:

1.密钥
2.身份信息
3.证书的有效期

证书制作要有规范
CA:证书颁发架构 X509格式(国际标准)

密钥,名称---CA---》服务器端的证书
证书验证---》通过---》访问

以下master服务器部署tls
创建 存放目录位置 tls

[root@master ~]# cd /
[root@master /]# mkdir tls
[root@master /]# ls
[root@master /]# cd tls
[root@master tls]# ls
[root@master tls]# ping master

创建ca密钥

[root@master tls]# openssl genrsa -aes256 -out ca-key.pem 4096
'密码123456 .pem:证书扩展名   通用非对称密钥 密文长度256'

创建ca证书

[root@master tls]# openssl req -new -x509 -days 1000 -key ca-key.pem -sha256 -subj "/CN=*" -out ca.pem
'哈希认证(数据完整性验证) 证书名称 证书标准x509 有效期1000天  '

创建服务器私钥

[root@master tls]# openssl genrsa -out server-key.pem 4096

创建签名私钥(添加身份信息)

[root@master tls]# openssl req -subj "/CN=*" -sha256 -new -key server-key.pem -out server.csr
'.csr:签名文件扩展名'

使用ca证书与私钥证书签名,生成服务端证书

[root@master tls]# openssl x509 -req -days 1000 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem

生成客户端密钥

[root@master tls]# openssl genrsa -out key.pem 4096

签名客户端

[root@master tls]# openssl req -subj "/CN=client" -new -key key.pem -out client.csr

创建配置文件

[root@master tls]# echo extendedKeyUsage=clientAuth > extfile.cnf

生成客户端证书,需要(签名客户端,ca证书,ca密钥)

[root@master tls]# openssl x509 -req -days 1000 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -extfile extfile.cnf

在这里插入图片描述
修改docker配置文件

[root@master tls]# vim /lib/systemd/system/docker.service 
......
添加
ExecStart=/usr/bin/dockerd --tlsverify --tlscacert=/tls/ca.pem --tlscert=/tls/server-cert.pem --tlskey=/tls/server-key.pem -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock
[root@master tls]# systemctl daemon-reload   守护进程
[root@master tls]# systemctl restart docker       重启服务

在这里插入图片描述

[root@master tls]# netstat -napt | grep 2376
tcp6       0      0 :::2376                 :::*                    LISTEN      77183/dockerd  

将 /tls/ca.pem /tls/cert.pem /tls/key.pem 三个文件复制到客户端上

[root@master tls]# scp ca.pem root@20.0.0.101:/etc/docker/     '拷贝本地的ca密钥到用户名是root ip地址为20.0.0.101的/etc/docker/目录下'
[root@master tls]# scp cert.pem root@20.0.0.101:/etc/docker/   '客户端证书'
[root@master tls]# scp key.pem root@20.0.0.101:/etc/docker/    '客户端密钥'

在这里插入图片描述
报错现象:
在这里插入图片描述
解决方法:

原因是我的云服务器重装了系统(清除了与我本地SSH连接协议相关信息),本地的SSH信息便失效了,使用SSH连接相同的ip地址时使用的是失效的协议信息,所以会报错,使用上述命令便可以清除known_hosts里旧缓存文件
在这里插入图片描述
可以直接去客户机进入/root/.ssh/known_hosts.old 清除相关信息

客户端测试

在客户端查看文件有没有

[root@client1 ~]# cd /etc/docker/
[root@client1 docker]# ls
ca.pem  cert.pem  daemon.json  key.json  key.pem

vi /etc/hosts
添加映射
20.0.0.100 master 

ping master

在客户端查看镜像

[root@client docker]# docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem -H tcp://master:2376 images
REPOSITORY   TAG       IMAGE ID       CREATED      SIZE
nginx        latest    6084105296a9   4 days ago   133MB
'master就一个nginx镜像'

在客户端下载镜像并查看

[root@client docker]# docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem -H tcp://master:2376 pull cirros
Using default tag: latest
latest: Pulling from library/cirros
d0b405be7a32: Pull complete 
bd054094a037: Pull complete 
c6a00de1ec8a: Pull complete 
Digest: sha256:4e8ac7a10251079ad68188b1aab16f6e94d8708d82d0602953c43ad48c2f08ed
Status: Downloaded newer image for cirros:latest
docker.io/library/cirros:latest

'再次查看'
[root@client docker]# docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem -H tcp://master:2376 images
REPOSITORY   TAG       IMAGE ID       CREATED      SIZE
nginx        latest    6084105296a9   4 days ago   133MB
cirros       latest    f9cae1daf5f6   8 days ago   12.6MB

在master上查看
在这里插入图片描述
客户机查看版本

[root@client1 docker]# docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem -H tcp://master:2376 version
Client: Docker Engine - Community
 Version:           20.10.5
 API version:       1.41
 Go version:        go1.13.15
 Git commit:        55c4c88
 Built:             Tue Mar  2 20:33:55 2021
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true

Server: Docker Engine - Community
 Engine:
  Version:          20.10.5
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.13.15
  Git commit:       363e9a8
  Built:            Tue Mar  2 20:32:17 2021
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.4.3
  GitCommit:        269548fa27e0089a8b8278fc4fc781d7f65a939b
 runc:
  Version:          1.0.0-rc92
  GitCommit:        ff819c7e9184c13b7c2607fe6c30ae19403a7aff
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

猜你喜欢

转载自blog.csdn.net/weixin_50344807/article/details/114916264