构builddockerfile时的安全限制

我工作的公司(严格监pipe/审计环境)尚未接受集装箱,但希望将其用于某些应用。 有一种观点认为,当图像构build过程以root身份发出命令(或者可以被用户通过使用USER命令覆盖)时,该构build(不运行)容器在构build期间实际上给予用户作为根的无限制访问处理。 这是对他们的诅咒,违背了公司的各种政策。 通过PowerBroker访问某些计算机的命令是受到限制的,即对某些命令的访问需要明确的许可,并被logging/接受审计。

我们需要允许容器图像由CI / CD系统构build,并且理想地允许开发人员能够在本地构build容器。 容器通常在Kubernetes中运行,但也可以直接在VM上运行。 我希望能够让CI构build代理按需启动,因为有很多开发人员,所以我想在Kubernetes中运行构build过程。

在这种环境下build造docker集装箱的最佳做法是什么? 我们是否应该限制访问Dockerfile中的命令?

我目前对这种方法的思考:

CI / CD:

  1. 定义“公司认可的”图像作为Kubernetes内的构build代理。
  2. 构build映像定义构build过程作为(不是根)运行的用户。
  3. 构build代理映像包含PowerBroker,可以locking对敏感命令的访问。
  4. 扫描docker文件以使用用户命令并禁止此操作。
  5. 构build代理运行docker-in-docker,如下所示( https://applatix.com/case-docker-docker-kubernetes-part-2/ )。 这实现了多个构build实例之间的隔离,同时确保通过Kubernetes控制所有容器。
  6. 通过OpenSCAP或类似的方式扫描图像以确保安全。 通过扫描是构build过程的一部分。 通过扫描允许将图像标记为符合并推送到registry。

我对这个想法感到不舒服(4),因为这看起来有点规则上的限制(也就是说这是一种黑名单方法),我相信肯定有更好的办法。

开发人员的本地主机:

  1. 定义“公司认可的”基础图像(在受信任的registry中标记)。
  2. 图像定义了构build过程作为(不是根)运行的用户。
  3. 基本映像包含PowerBroker,可以locking对敏感命令的访问。
  4. 在包装docker build localhost上创build包装脚本。 没有直接访问docker build :用户必须使用脚本。 通过PowerBroker访问脚本。 脚本也可以扫描docker文件来使用用户命令,并禁止这个。
  5. 将图像推送到registry需要标记,这需要通过OpenSCAP或类似的方式扫描安全合规性。

我想使用OpenSCAP结果和CI系统来创build存在的图像的审计跟踪; 类似的部署过程。 监视CVE等的安全团队应该能够理解存在和已经部署的容器,并且能够触发图像的重build以利用更新的库,或者在需要重build/重新部署容器时标记开发人员。 我希望能够certificate所有容器都符合本身定义为代码的安全configuration策略。

这是一个明智的方法吗? 甚至有允许用户无限制地构build(但不运行)容器图像的风险吗? 如果没有,那么确保愚蠢/恶意的开发人员没有在“已批准的基础映像”内部取消最佳实践的最佳方法是什么?除了手动代码审查之外(不pipe怎么说,这都是要做的,但可能会错过某些东西)?

顺便说一下,您必须假定所有的代码/图像都在内部/本地托pipe,即没有任何东西被允许使用基于云的产品/服务。

docker build运行时,每个图层都在容器的上下文中执行。 所以执行该命令所带来的风险受到容器可用访问的限制。

locking构build环境可以通过限制将完成构build的Docker引擎实例来完成。

诸如确保使用用户命名空间这样的事情可以降低在对环境具有更广泛影响的容器内运行命令的风险。

当然,这并不能减轻开发者从不受信任的位置甩开的风险,但是,在Docker之外完成什么呢? (即在这种情况下使用Docker会带来什么额外的风险)

例如,如果您有一个限制外部托pipe代码的策略,那么只有一个select是限制Docker构build主机对Internet的访问。

如果您在构build过程中使用Kubernetes,并担心在容器中执行恶意软件,则可能需要查看CIS Kubernetes标准 ,并确保适当地locking了您的群集。

有一种观点认为,当图像构build过程以root身份发出命令(或者可以被用户通过使用USER命令覆盖)时,构build(不运行)容器在构build期间实际上给予用户作为根的无限制访问处理

这个观点不正确。 当你build立一个图像时,你正在做的是创build新的docker图层(文件),这些图层存储在/var/lib/docker/aufs/layers 。 build立docker图像时根本没有安全问题。

有工具可以分析你已经build立的图像的安全性。 一个是Dockerhub内置的图像分析器。