网站首页 > 技术教程 正文
01 Docker 架构
如果你正在阅读这篇文章,我想你知道 Docker 是如何工作的,但是让我们快速回顾一下主要概念:
Docker 客户端
这是用户通常使用较多的部分,客户端是 Docker 守护进程的 CLI,它有助于管理容器、镜像和注册表。
它还可用于管理容器使用的网络和卷。
您可以在 Docker 客户端中使用的一些命令:
#RUN A NGINX CONTAINER WITH PORT 80 BINDING HOST-CONTAINER
docker run -d -p 80:80 nginx
#PULL UBUNTU 22.04 DOCKER IMAGE
docker pull ubuntu:22.04
#SHOWS DOCKER IMAGES IN YOUR DOCKER SYSTEM
docker images
#HELPER FOR DOCKER NETWORKS
docker network
#HELPER FOR DOCKER VOLUMES
docker volume
Docker 守护进程
Docker 守护进程实际上是 docker 环境的核心,它运行容器,拉取镜像并管理所有的网络和卷。
你可以通过客户端使用 Docker 守护进程,或者如果你想让事情变得困难,你可以直接连接到 Docker 套接字。它会监听 API 请求。
Docker 镜像仓库
Docker 镜像仓库是存储 Docker 镜像的地方。默认情况下,Docker 检查 Docker Hub 中的镜像,但如果配置了镜像,将从设置的镜像仓库中拉取镜像。此外,镜像仓库可以是公共的或私有的,并带有身份验证。
02 Docker环境面临的威胁
Docker 套接字
Docker 套接字 /var/run/docker.sock 是 Docker 正在侦听的 UNIX 套接字,它由 root 用户所有,这是 Docker API 的主要入口点。
攻击者可以向 Docker 守护进程(在 Docker 主机上以 root 身份运行)发出请求,
docker run -d -v /var/run/docker.sock:/var/run/docker.sock <image_name>:<image_tag>
以便:
启动一个特权容器并突破它;
拉一个公共的后门镜像,运行它并进入它进行突破。
攻击示例:
find / -name docker.sock 2>/dev/null
docker images
docker run -it -v /:/host <image_name>:<image_tag> chroot /host bash
Docker socket 可以是本地的,正如我们在上面看到的。如果你使用这个标志运行你的 docker 守护进程,它甚至可以暴露在互联网上:
docker -H tcp://0.0.0.0:XXX
在这种情况下,Docker 套接字将暴露给 XXX 中指定的端口,并且可以从互联网访问。
特权容器
默认情况下,Docker 容器是“非特权”的,例如,不能在 Docker 容器内运行 Docker 守护进程。
—privileged 标志赋予容器所有的能力。当操作员执行 docker run — privileged 时,Docker 将启用对主机上所有设备的访问,并在 AppArmor 或 SELinux 中设置一些配置,以允许容器几乎与在主机上容器外运行的进程一样访问主机。
docker run -d --privileged <image_name>:<image_tag>
攻击者可以挂载主机文件系统并使用 chroot 访问主机。
攻击示例:
capsh --print
fdisk -l
mount /target/disk /mnt/
chroot /mnt/ bash
能力滥用
一般来说,你应该检查容器的能力,如果它有以下任何一个,你可能能够从它中突破或做坏事(利用时间很长并且在每个场景中都不同):
CAP_SYS_ADMIN
CAP_SYS_PTRACE
CAP_SYS_MODULE
DAC_READ_SEARCH
DAC_OVERRIDE
CAP_SYS_RAWIO
CAP_SYSLOG
CAP_NET_RAW
CAP_NET_ADMIN
您可以使用以下方法检查当前容器的功能:
capsh --print共享网络
docker run -d --network host <image_name>:<image_tag>
最初立足于易受攻击容器的攻击者可以转向其他容器。如果有管理容器,例如 Portainer,攻击者可以使用它们来实例化可用于突破的特权容器。
您可以发现执行如下命令查看Docker 网络的接口:
ip addr
主机主要创建一个接口作为 Docker 网络的网关,通常,该范围的第一个 IP 地址用于此功能。默认情况下,Docker 网络的 IP 范围是 172.17.0.0/16,宿主机的 IP 地址是 172.17.0.1。如果容器的 IP 地址是 172.17.0.1,那么可以断定容器共享宿主机网络命名空间。
滥用组成员资格
Docker 组的成员可以运行 Docker 操作,此选项允许所有非 root 用户使用 Docker,假设 Docker 守护进程以 root 身份运行。但是,此成员身份可能会被滥用以在 Docker 主机上执行权限提升。
检查用户是否可以执行 Docker 操作并通过检查 /etc/group 文件验证它:
docker images
cat /etc/group | grep docker
容器滥用
如果宿主机上运行着 Containerd 守护进程并且安装了 ctr 程序,那么它可能会被滥用来攻击宿主机并获得 root 权限。
ctr 程序可以由主机上的其他用户使用(如果可用)。
攻击可以向以 root 权限运行的 Containerd 守护进程发出请求,运行容器并将主机文件系统挂载到它,然后使用 chroot 从容器内部获取 root 访问权限。
runc 滥用
如果机器上安装了runc,任何人都可以运行runc命令,那么它就可以被滥用来攻击主机并获得root权限。
攻击者可以向以 root 权限运行的 runc 守护进程发出请求,运行容器并将主机文件系统挂载到它,使用 chroot 从容器内部获取 root 访问权限。
管理工具滥用
如果管理工具,例如 Portainer,正在使用弱密码运行或易受攻击,这可能导致主机接管。
攻击者可以登录它,启动一个特权容器,并从新启动的容器内部 chroot 到主机文件系统。
vulns 或 psw
不安全的 Docker 镜像仓库
如果私有 Docker 镜像仓库未使用身份验证,或者不够强大,则可能会受到攻击。
攻击者可以在不使用 Docker 的情况下与 Docker 镜像仓库交互,与其机器交互并下载图像。
信息收集:
curl http://<target_registry>:5000/v2/_catalog
curl http://<target_registry>:5000/v2/<repository_name>/tags/list
curl http://<target_registry>:5000/v2/<repository_name>/manifests/<tag>
curl -s http://<target_registry>:5000/v2/<repository_name>/blobs/<blobSum_value> --output <output_filename>.tar
假镜像(后门)
攻击者可以从镜像仓库中拉取原始镜像,了解其结构并创建一个带有后门的新镜像。然后攻击者可以覆盖 Docker 镜像仓库中的镜像并等待某人/某物部署它。
攻击者可以从镜像仓库中提取一个多用途镜像,了解其结构并制作它以在部署后为攻击者提供 shell 访问权限。然后攻击者可以覆盖 Docker 镜像仓库中的镜像并等待某人/某物部署它。 此时,此处描述的技术可用于在 Docker 主机上获得 root 访问权限。
03 Docker安全审计
审核 Docker 套接字并保护它
检查 UNIX 套接字的权限:其他人不应有任何访问权限。
检查 TCP 套接字并确保 TCP 套接字仅在本地接口上侦听,或者在其上部署了身份验证。
默认 Docker TCP 套接字不受保护,例如 tcp://<host_ip>:2375,所以我们需要实现:
身份验证
加密通信隧道
如何实现?
使用 SSH
使用 TLS(TCP 端口 2376)
审核 Docker 组
检查成员(/etc/group):非成员将无法访问 Docker。
审核 Docker 配置
检查是否存在允许的不安全注册表 (/etc/docker/daemon.json)。
Docker 安全工具
https://github.com/docker/docker-bench-security
https://github.com/kost/dockscan
https://github.com/genuinetools/amicontained
04 容器保护
Seccomp
Seccomp(安全计算模式)是 Linux 内核的一项功能,充当系统调用过滤器。它不是沙箱,但经常与沙箱一起使用以阻止系统调用。
Docker 支持 Seccomp-eBPF(模式 2),以限制来自容器的系统调用,有效地减少表面积。Seccomp 配置文件可以以 JSON 文件的形式定义。Docker 的默认 Seccomp 配置文件是一个阻止 44 个系统调用的白名单。
AppArmor
AppArmor 是一种内核增强功能,可将程序限制在一组有限的资源中。将访问控制属性绑定到程序,而不是用户。
用户命名空间重映射
此技术允许将容器用户映射到主机的不存在的用户 ID。例如。容器中的 root,UID = 0,主机上的同一用户,UID = 27072;由于用户不存在,没有特权!
影响:
没有特权模式;
没有使用绑定挂载的 chroot。
了解更多:
https://docs.docker.com/engine/security/userns-remap/
Rootless模式
可以将 Docker 守护进程运行到 rootless 模式。不幸的是,存在一些已知限制:
https://docs.docker.com/engine/security/rootless/#known-limitations
05 结论
1、如果不被滥用,Docker 容器提供了一种将应用程序与底层主机系统隔离的安全方法。
2、确保 Docker 中使用的所有图像都来自可信来源并定期更新非常重要。
3、保护 Docker 守护进程、容器镜像和容器是确保在 Docker 中运行的应用程序安全的重要步骤。
4、实施基于角色的访问控制和监控有助于确保安全地使用 Docker。
5、不要忘记主机安全!
参考及来源:
https://infosecwriteups.com/attacking-and-securing-docker-containers-cc8c80f05b5b
06 免责&版权声明
安全小白团是帮助用户了解信息安全技术、安全漏洞相关信息的微信公众号。安全小白团提供的程序(方法)可能带有攻击性,仅供安全研究与教学之用,用户将其信息做其他用途,由用户承担全部法律及连带责任,安全小白团不承担任何法律及连带责任。欢迎大家转载,转载请注明出处。如有侵权烦请告知,我们会立即删除并致歉。谢谢!
猜你喜欢
- 2024-10-16 Evilginx - 一个用于钓鱼攻击的中间人攻击框架
- 2024-10-16 新CC攻击中的慢速攻击(cc攻击教学)
- 2024-10-16 快速云:服务器针对DDOS攻击有哪些对策?
- 2024-10-16 DDOS攻击会带来什么危害?有什么应对策略?
- 2024-10-16 通过一次安全处理暴露的问题(通过一次安全处理暴露的问题的英文)
- 2024-10-16 一文搞懂Web的攻击技术(web攻击手段)
- 2024-10-16 Linux基础14-网络安全之模拟CC攻击以及防御(连载中)
- 2024-10-16 利用APR缓存攻击实例(arp高速缓存)
- 2024-10-16 Nginx并发模型与traffic_server并发模型比较
- 2024-10-16 2.7KStar!程序员必备!NginxUI,让服务器配置不再难!
你 发表评论:
欢迎- 最近发表
-
- linux日志文件的管理、备份及日志服务器的搭建
- Linux下挂载windows的共享目录操作方法
- Linux系统中的备份文件命令(linux系统中的备份文件命令有哪些)
- 麒麟KYLINOS|通过不同方法设置用户访问文件及目录权限
- 「Linux笔记」系统目录结构(linux目录的结构及含义)
- linux中修改归属权chown命令和chgrp命令
- 工作日报 2021.10.27 Android-SEAndroid权限问题指南
- Windows和Linux环境下,修改Ollama的模型默认保存路径
- 如何强制用户在 Linux 上下次登录时更改密码?
- 如何删除Linux文件夹中除某些扩展名之外的所有文件?
- 标签列表
-
- 下划线是什么 (87)
- 精美网站 (58)
- qq登录界面 (90)
- nginx 命令 (82)
- nginx .http (73)
- nginx lua (70)
- nginx 重定向 (68)
- Nginx超时 (65)
- nginx 监控 (57)
- odbc (59)
- rar密码破解工具 (62)
- annotation (71)
- 红黑树 (57)
- 智力题 (62)
- php空间申请 (61)
- 按键精灵 注册码 (69)
- 软件测试报告 (59)
- ntcreatefile (64)
- 闪动文字 (56)
- guid (66)
- abap (63)
- mpeg 2 (65)
- column (63)
- dreamweaver教程 (57)
- excel行列转换 (56)
本文暂时没有评论,来添加一个吧(●'◡'●)