首页 > 开发 > 云计算 > 正文

案例分析:保护 Menagerie 系统上的容器和有效负载

2016-07-12 21:13:46  来源:极客头条
  在前一篇文章中,我介绍了我们已经开放其源码的新的基于 Docker 的平台:Menagerie。Menagerie 在 Docker 容器内实现了批量有效负载调度和跟踪。这篇文章将重点介绍架构和开发流程,所以现在是时候转入部署和生产主题了。我们将从安全性开始介绍,这是我们最关心的问题。这篇文章主要以前一篇文章为基础,但对打算保障基于 Docker 的系统的安全性的新读者也很有用。
识别和计划  保护任何系统的第一个阶段都是确认薄弱环节并创建修复计划。对于 Menagerie,我们执行了以下操作:
  介绍了 CIS 最佳实践(已在它们的基准测试文档中详细介绍)。为了方便测试,Docker 中的热心人员提供了 docker-bench-security 项目,该项目输出一个可操作项列表。
  检查了我们代码中的数据流并识别潜在的漏洞,重点关注恶意或容易出错的用户输入。
  检查各种 Docker 版本,从中挑选安全特性。我们的假设是系统运行着任意的各种各样的有效负载。鉴于此,我们希望尽可能多地限制各种执行,避免与主机有任何交互。在下面会看到我们选择的操作的详细信息。

回页首
修复应用 CIS 最佳实践  我们在 Vagrant 环境中执行了 docker-bench-security 测试,然后获得了一个可操作项列表,我们检查了这个列表,并选择修复在离开特定试验台后仍会继续存在的问题。推荐在任何部署环境中运行此测试,以获取可能该部署环境特有的具体问题。这是我们根据测试结果来修复的一些问题:
  禁用 inter-container-communication(Docker 守护进程的 --icc=false 标志):只允许显式连接。
  为容器设置只读 rootfs(为 docker run 设置 --read-only 标志)。
  使用用户命名空间重新映射根用户;参见下文的详细说明。
  将 Apparmor 配置文件添加到基础架构和引擎容器中;参见下文的详细说明。
  vagrant 环境包含第三方基础架构容器:mysql、rabbitmq 和 docker-registry。这些可能单独部署在生产环境中,而且保护它们不在本文的介绍范围内。简单地讲,我们提供了足够的材料来帮助您操作。
预测和审核代码漏洞  这当然不属于 Docker 问题,但它是一个重要部分。在 Menagerie 中,数据流从一次 web-API 上传开始,随后是写入文件存储、数据库和消息队列,最后是由后端工作线程来读取和执行。我们检查了通过传递、写入、文件系统访问和执行而流动的数据,尽力确保外部输入已根据需要进行了净化,并尽力
  使用外部输入。您可以进一步了解净化外部输入的重要性
应用加固特性  正如我提到的,因为此系统在任意输入上运行多样化的引擎,所以我们希望确保即使悄悄渗入了有害的东西,系统也足够牢固,能够避免重大损害。这包括:
  拦截对 API 的未授权外部访问。
  避开对主机文件系统和其他资源的访问。
  因为过度使用资源而导致的 DoS。
  等等。
  我将详细介绍每项加固工作。
  限制 API 访问
  部署在生产环境中时,推荐将服务端口设为私有,并在它的前面放置一个安全的上游 Web 服务器(比如 Nginx)。应配置这个上游服务器来处理 SSL 通信,使用客户端证书,限制速率,并使用能够想到的其他所有安全特性。
  Docker 卷
  尽管这不是一个安全特性,但它通过消除将主机卷挂载到容器中,可以获得安全性提升。写入容器和 Docker 卷内的所有数据都会保留在那里,在它们处理的数据和配置之间保持了很好的分离。1.9 版提供了 Docker 卷。
  执行标志
  Menagerie 通过后端工作线程来执行各种引擎容器。由于此执行是间接的,所以我们希望系统管理员能够对执行进行限制。这可以通过在引擎配置中指定额外的运行标志来实现;这些标志被传递给 Docker create/run 命令。这是来自我为 apktool 提供的配置的示例: