Docker Remote 未授权访问漏洞修复方法

Docker Remote 未授权访问漏洞修复方法

一、漏洞介绍

攻击者通过此漏洞⽆需认证即可访问到Docker数据,可能导致敏感信息泄露,⿊客也可以删除 Docker上的数据,直接访问宿主机上的敏感 信息,或对敏感⽂件进⾏修改。

二、漏洞原因

docker服务开启了远程访问端口配置:

bash 复制代码
dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock

三、漏洞复现

可通过docker命令直接查看容器信息等其他操作

bash 复制代码
docker -H tcp://漏洞docker-ip:2375 ps

四、漏洞解决

本篇主要介绍启用 TLS 认证(使用 --tlsverify 等选项)这一方式。

证书文件生成部分比较繁琐,按照以下步骤一步一步做即可:

1. 创建证书目录并进入

执行:

bash 复制代码
mkdir -p /etc/docker/certs && cd /etc/docker/certs
2. 生成 CA 私钥(不使用密码,避免交互)

执行:

bash 复制代码
openssl genrsa -out ca-key.pem 4096

输出:

bash 复制代码
Generating RSA private key, 4096 bit long modulus
........++
..............................................................................................++
e is 65537 (0x10001)
[root@localhost certs]# 
3. 生成 CA 证书(自动填写信息,静默完成)

执行:

bash 复制代码
openssl req -new -x509 -days 3650 -key ca-key.pem -sha256 -out ca.pem -subj "/C=CN/ST=Beijing/L=Beijing/O=Docker/OU=CA/CN=MyDockerCA"

输出:

bash 复制代码
[root@localhost certs]# ls
ca-key.pem  ca.pem
4. 生成服务端私钥

执行:

bash 复制代码
openssl genrsa -out server-key.pem 4096

输出:

bash 复制代码
Generating RSA private key, 4096 bit long modulus
...................................................................................................................................................................................++
.........................++
e is 65537 (0x10001)
5. 生成服务端证书请求(CSR),CN 写你的 Docker 宿主机 IP(请把下面的 192.168.1.100 替换成你的真实 IP)

执行:

bash 复制代码
openssl req -subj "/CN=192.168.247.200" -sha256 -new -key server-key.pem -out server.csr
6. 创建服务端证书扩展文件(支持多个访问地址)

执行:

bash 复制代码
cat > extfile-server.cnf <<EOF
subjectAltName = DNS:localhost,IP:192.168.1.100,IP:127.0.0.1
extendedKeyUsage = serverAuth
EOF

注意:上面的 192.168.1.100 请替换为你的真实 IP

7. 签发服务端证书

执行:

bash 复制代码
openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem -extfile extfile-server.cnf

输出:

bash 复制代码
Signature ok
subject=/CN=192.168.1.100
Getting CA Private Key
8. 生成客户端私钥

执行:

bash 复制代码
openssl genrsa -out key.pem 4096

输出:

bash 复制代码
Generating RSA private key, 4096 bit long modulus
.....................................................................................................++
.................++
e is 65537 (0x10001)
9. 生成客户端证书请求

执行:

bash 复制代码
openssl req -subj '/CN=client' -new -key key.pem -out client.csr

无输出

10. 创建客户端证书扩展文件

执行:

bash 复制代码
cat > extfile-client.cnf <<EOF
extendedKeyUsage = clientAuth
EOF
11. 签发客户端证书

执行:

bash 复制代码
openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -extfile extfile-client.cnf

输出:

bash 复制代码
Signature ok
subject=/CN=client
Getting CA Private Key

全部文件:

bash 复制代码
[root@localhost certs]# ll
total 44
-rw-r--r--. 1 root root 3243 Apr 24 01:51 ca-key.pem
-rw-r--r--. 1 root root 2004 Apr 24 01:52 ca.pem
-rw-r--r--. 1 root root   17 Apr 24 01:53 ca.srl
-rw-r--r--. 1 root root 1814 Apr 24 01:53 cert.pem
-rw-r--r--. 1 root root 1582 Apr 24 01:53 client.csr
-rw-r--r--. 1 root root   30 Apr 24 01:53 extfile-client.cnf
-rw-r--r--. 1 root root   93 Apr 24 01:52 extfile-server.cnf
-rw-r--r--. 1 root root 3243 Apr 24 01:53 key.pem
-rw-r--r--. 1 root root 1874 Apr 24 01:53 server-cert.pem
-rw-r--r--. 1 root root 1594 Apr 24 01:52 server.csr
-rw-r--r--. 1 root root 3243 Apr 24 01:52 server-key.pem
12. 删除临时文件

执行:

bash 复制代码
rm -v client.csr server.csr extfile-server.cnf extfile-client.cnf

输出:

bash 复制代码
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-server.cnf'? y
removed 'extfile-server.cnf'
rm: remove regular file 'extfile-client.cnf'? y
removed 'extfile-client.cnf'
13. 设置私钥权限(仅所有者可读)
bash 复制代码
chmod 0400 ca-key.pem server-key.pem key.pem
chmod 0444 ca.pem server-cert.pem cert.pem
14. 查看生成的文件

最终文件:

bash 复制代码
[root@localhost certs]# ll
total 28
-r--------. 1 root root 3243 Apr 24 01:51 ca-key.pem
-r--r--r--. 1 root root 2004 Apr 24 01:52 ca.pem
-rw-r--r--. 1 root root   17 Apr 24 01:53 ca.srl
-r--r--r--. 1 root root 1814 Apr 24 01:53 cert.pem
-r--------. 1 root root 3243 Apr 24 01:53 key.pem
-r--r--r--. 1 root root 1874 Apr 24 01:53 server-cert.pem
-r--------. 1 root root 3243 Apr 24 01:52 server-key.pem

至此证书TLS相关操作已完成,接下来配置docker参数

15. docker配置文件添加配置:

/etc/docker/daemon.json (没有就新建) 添加以下配置

bash 复制代码
{
  "tlsverify": true,
  "tlscacert": "/etc/docker/certs/ca.pem",
  "tlscert": "/etc/docker/certs/server-cert.pem",
  "tlskey": "/etc/docker/certs/server-key.pem"
}
16. 重启docker:
bash 复制代码
systemctl daemon-reload
systemctl restart docker
17. 验证:

找一台其它docker机器远程访问一下目标docker即可,或者浏览器直接输入192.168.1.100:2375/info

浏览器会输出:Client sent an HTTP request to an HTTPS server.

正确访问方式:

bash 复制代码
docker --tlsverify --tlscacert=/etc/docker/certs/ca.pem --tlscert=/etc/docker/certs/cert.pem --tlskey=/etc/docker/certs/key.pem -H tcp://172.28.112.143:2375 version

证书文件正确的话,可以正常输出信息,否则输出Client sent an HTTP request to an HTTPS server.

相关推荐
生物信息与育种2 小时前
JIPB | 一个表观多组学整合分析与可视化工具OmicsCanvas
运维·人工智能·算法·自动化·transformer
汤愈韬2 小时前
防火墙双击热备的工作模式详解
运维·服务器
humors2212 小时前
SSH管理github代码
运维·ssh·github
小夏子_riotous2 小时前
Docker学习路径——10、Docker Compose 一站式编排:从入门到生产级部署
linux·运维·服务器·docker·容器·centos·云计算
小菜同学爱学习2 小时前
兜底保障!MySQL运维实战与常见问题排查全解析
运维·mysql·adb
雅斯驰2 小时前
工业自动化、物联网传感器、车身控制:PIC18F26K20-I/ML的典型应用场景
运维·物联网·自动化
云栖梦泽2 小时前
Linux内核与驱动:GPIO设备树与SPI设备树的区别
linux·运维·c++·嵌入式硬件
smallcelebration2 小时前
132 docker入门学习
学习·docker·容器
A-刘晨阳2 小时前
K8s 之 Ingress 及 Ingress Controller
云原生·容器·kubernetes·负载均衡·ingress