跳转到主要内容
Chinese, Simplified

容器——本质上是可执行的独立软件包,包含软件运行所需的所有文件(库、系统设置、依赖项等)——在现代应用程序开发中无处不在。最近的一个云计算计算基金会(CNCF)的调查显示,有84%的组织在几年前只有23%的生产中使用容器。

与当今的许多技术领域一样,容器生态系统在很大程度上是由开源组件推动的。这些措施包括:

  • Docker Hub这样的注册中心承载着成千上万的开源容器映像
  • 容器编排平台(如Kubernetes)
  • Docker文件(如DockerFile)
  • 容器运行时(如Containerd)

然而,就像所有的东西OSS一样,在容器环境中使用开源组件有一定的许可证合规义务。这就是开源的本质——创作者免费提供创新的新技术,但需要注意的是,用户必须遵守管理许可代码/文件的某些要求。

在本博客中,我们将探讨开源容器生态系统的哪些部分具有合规义务,如何处理根据GPL v2(或类似的强copyleft许可证)许可的组件,以及许可证合规的最佳实践,等等。

容器映像和法规遵从性注意事项

如前所述,容器生态系统是由开源驱动的。但是,出于许可证合规的目的,主要关注的是容器映像。这是因为许可证合规义务是由代码的分发触发的,而容器映像通常是容器生态系统中唯一符合此标准的部分。

不过,在我们深入研究容器镜像之前,先简单介绍一下容器配方文件(这些文本文件基本上提供了关于如何构建容器镜像的说明)。您可能很少会遇到实际分发配方文件的情况,这就是为什么我们不会在本博客中详细讨论它们的原因。但如果你这么做了:请记住,配方文件有时会被不同的许可证覆盖,而不是由它们生成的镜像。例如,Dockerfile可能在MIT下获得许可,但它可能描述在Apache2.0和ISC下获得许可的镜像。

现在,回到我们帖子的主要焦点,容器镜像。容器映像在容器环境中起着不可或缺的作用——它们是包含运行所需软件的分布式包。对于上下文,容器是容器映像的运行实例,在任何给定时间都可以有多个容器映像。

术语容器映像还用于描述构成完整构建的容器映像的各个软件文件。开发团队通常会使用Docker Hub等公共注册中心上提供的开源容器映像。一个完整构建的容器映像可能包含一个开源基础映像(一个像Ubuntu这样的操作系统)、另一个开源映像(像Postgres SQL)、另一个像Logstash,等等。

如果团队使用多个许可证下的镜像构建和分发容器,他们将需要遵守其中最强的copyleft。(也就是说,如果一个镜像层在MIT许可证下,另一个GPLv3下,你需要遵守GPLv3。)

关于容器映像和许可证合规性的另一个重要注意事项是,在完全构建和装运的容器映像中,某些层可能会被遮挡。然而,您仍然需要遵守每一层的许可要求——即使是那些在运行时不可见的许可要求。考虑到不同许可证和不同文件(从不同来源获取)的数量,这可能是相当具有挑战性的。(我们稍后将在博客中讨论解决这一问题的策略。)

容器分发

开源许可要求在软件发布时生效。换句话说,如果您使用GPL许可的组件来构建仅供内部使用的开发工具,则无需担心源代码泄露。在容器的上下文中,当您允许其他人下载您的容器镜像时,分发就变得相关了。例如,Docker Hub上的任何镜像都将被分发,因此必须符合各自的许可证要求。

完整构建的容器映像的分发与任何其他软件的分发非常相似。构建的容器映像以二进制形式分发,分发方必须遵守容器映像中所有包和软件的许可要求。这可能很困难,因为容器通常包含数百个包,所有这些包都需要符合要求。

容器和Copyleft许可证

开源许可证有两种类型:permissive和copyleft。许可许可通常允许许可代码的用户有很大的灵活性(只要他们提供适当的属性),而copyleft许可则有更严格的要求。一些copyleft许可证甚至要求在用户修改(然后分发)copyleft许可证代码时披露源代码。

然而,在容器环境中满足源代码公开要求说起来容易做起来难。这种情况有几个原因:

  • 镜像层可以在不同的时间合成,源代码可能已经更改
  • 需要收集所有层的源代码,这可能很有挑战性
  • 构建容器映像的确切规格取决于映像的配置方式。

好消息是,像FOSSA这样的容器扫描工具可以帮助团队准确理解源代码和所有镜像层的相关许可证。我们将在以下章节中更详细地讨论这一点。

注意:在容器环境中履行合规义务时,所需信息(通知文件、版权文件、变更日志等)可以嵌入容器镜像中,或者通过可能已经设置的正常属性页面向最终用户披露。

如何遵守容器许可证义务

开放源代码许可证合规性——在容器环境和其他环境中——从全面了解所涉及的许可证开始。但是,正如我们前面提到的,发现容器映像的每一层的许可证可能很困难,因为这些层在运行时会被遮挡。

这就是为什么自动化的容器扫描工具会产生如此大的影响。这些工具显示给定镜像所有层的所有许可证。

注意扫描的时间也很重要。如果您等到SDLC的后期进行许可扫描(并发现,比如,一个GPL许可的组件),您可能会被迫撤销并重建大部分容器工件。因此建议:

  • 尽快扫描镜像,尤其是基础镜像
  • 先扫描,然后再添加,然后再将其添加到容器中
  • 此外,在将完整构建的镜像推向生产之前,将其作为CI/CD的一部分进行扫描

容器许可证合规的其他策略

  • 首先,考虑将您应用到您的组织的其他领域的任何许可策略应用到容器环境中。这可能包括强版权许可的默认拒绝姿态,以及弱版权许可(如Mozilla Public License 2.0)的“黄色”标志。
  • 建立一个预先批准的、私有的基本映像注册中心可能是有意义的,这些基本映像都包含在您组织的策略中,这样您就知道不会带来任何法规遵从性问题。
  • 使用FOSSA这样的工具——提供容器镜像许可证扫描和管理——可以帮助企业遵守容器合规要求。

福萨(FOSSA )的作品是:

  • 提供开放源代码许可证类型的审计级清单,即使是在运行时隐藏的镜像层中
  • 提供详细的元数据信息,包括许可证文本、版权信息和合规义务
  • 跨公司、产品和团队应用内置的、可定制的OSS策略。这包括通过现有的工程工作流程以本机方式标记或阻止违反策略的行为

原文:https://fossa.com/blog/containers-open-source-license-compliance/

本文:https://jiagoushi.pro/node/1827

Article
知识星球
 
微信公众号
 
视频号