环境:
名字 | 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