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.