我从事 IT 工作已经 20 多年了,但不知何故,我从来没有抽出时间接触容器。 从理论上讲,我了解它们的结构和工作原理。 但由于我从未在实践中遇到过它们,所以我不确定它们引擎盖下的齿轮到底是如何转动的。
此外,我不知道他们的安全状况如何。 但同样,这个理论听起来不错,“随着安全性的增加,可用性降低”这句老歌在我的脑海中挥之不去。 所以我想,既然用容器做一切都很容易,那么那里的安全性就低于标准。 事实证明,我是对的。
为了快速开始,我报名了课程
该课程由 Sheila A. Berta 和 Sol Ozzan 教授,首先描述了 Docker 容器的工作原理以及部署到 Kubernetes 时的流程。 这是一门完全实践性的课程 - 学生必须在上课前在他们的机器上安装 Docker 和 microk8s - 这是了解这些工具如何相互交互、找到弱点以及最重要的是尝试阻止它们的好方法。
不幸的是,虽然课程承诺两天后成为“王子”,但我感觉一切才刚刚开始,我还有很多东西要学。
在深入探讨我的崇高观察之前,有必要先解释一下什么是容器。 在开发世界中,在个人计算机上编写的代码完美运行被认为是正常的,但是当您尝试在某个服务器上运行它时,它根本无法运行。 容器试图通过提供独立的机器来克服这个问题,您可以轻松地将这些机器从一台服务器移动到另一台服务器,并且知道它们将始终工作。 顾名思义,它们包含完成工作所需的代码、库和其他软件。 另一方面,Kubernetes 是
以下是我从红队和蓝队角度的一些发现。
红队
大多数容器内容以 root 身份运行:这意味着如果容器遭到破坏,您将拥有对该容器的完全访问权限。 这使得接下来的步骤变得更加容易。
在容器内安装 docker.sock 是危险的:如果您在容器内拥有 root 权限,并且还在具有 Docker 套接字 (/var/run/docker.sock) 的容器内安装了 Docker,则您有可能探索整个集群,包括访问任何其他容器。 此类访问无法通过网络隔离或其他方式来阻止。
环境变量通常包含秘密数据:在大多数情况下,人们使用普通环境变量将密码发送到容器。 因此,如果您有权访问该帐户,则可以监视这些环境变量,以便以后扩展您的权限。
Docker API可以给出很多信息:默认配置的 Docker API 会在未经授权的情况下运行,并且会产生大量信息。 使用 Shodan,您可以轻松找到开放端口的列表,然后获取有关集群的详细信息 - 并继续进行完整捕获。 趋势科技写了这篇文章
蓝队
不要以 root 身份运行容器内容:尽管以 root 身份运行更容易,但您不应该这样做。 相反,通过显示 uid 来运行具有重置权限的应用程序,或者在从 CLI 运行时使用 --user 选项,或者在 Dockerfile 中指定 USER。
不允许将软件安装在容器中:几乎每次攻击都是从种植东西开始的。 从 nmap 到 ifconfig 再到 Docker 本身(在容器内),在容器中安装任何东西已经很常见了。 出于同样的原因,您应该始终阻止所有未使用的端口。 这还有助于防止在您的计算机被感染时传输控制命令。 除了防止安装程序之外,值得确保在容器本身中安装完成任务所需的最少数量的应用程序。
保护 docker.sock:必须受到保护,因为容器和集群之间的通信是通过此套接字进行处理的。 由于我不想在本文中详细介绍,请阅读
使用 Docker 密钥代替环境变量: 有秘密
如果本文激起了您对容器的兴趣,您可以轻松安装 Docker 或 microk8s(Kubernetes 的小型版本)。
安装后就可以去
如果您想要或需要参加有关 Docker 的综合课程,其中实用的演讲者会检查其所有工具:从基本抽象到网络参数、使用各种操作系统和编程语言的细微差别,那么请尝试“
来源: habr.com