Skip to content
 编辑

OSPO 101 Training Modules - Module 5

1. 开源许可和合规基础

1.1 课程简介

在本节中,我们将解释开源许可证的作用,描述最常见的许可证类型,并就如何为特定情况选择正确的许可证提供指导。 我们还将介绍软件中知识产权和版权的基础知识,因为这些是理解一般许可的关键概念。

1.2 学习目标

在本节结束时,您应该能够:

3 知识产权和版权

3.1 什么是知识产权?

知识产权是一个核心要素,需要了解它才能围绕开源和其他软件许可类型做出明智的选择。 知识产权分为以下几类:

出于本课程的目的,我们将重点关注版权和专利,这两个领域与开源许可合规性最相关。

3.2 软件中的一般版权概念

版权是告知开源许可合规性的两个关键要素之一(另一个是专利)。 以下是版权的一些基本要素:

3.3 软件中最相关的版权

有一些与软件版权相关的重要权利。这些权利的授予方式与许可有关(我们将很快介绍)。具体而言,因司法管辖区而异的相关权利是:

重要的是要注意,对什么构成“衍生作品”或“发行版”的解释在开源社区和开源法律圈内存在争议,因此这是一个会随着时间不断发展的领域。

3.4 软件专利概念

专利也是一个重要的领域,可以对开源合规性产生重大影响(取决于许可证类型,我们稍后也会介绍)。

专利的一些关键要素包括:

需要注意的是,即使其他方独立创造了相同的发明或软件,也可能发生专利侵权。

3.5 许可证基础知识

虽然我们将很快介绍许可证的更详细方面,但重要的是对许可证的作用和提供的内容有一些基本的了解。

4. 开源许可证类型

4.1 总体许可证类别

有了前面几页的信息,您应该对许可证的用途有了基本的了解。 让我们来看看下面的整体许可证格局(包括闭源许可证):

Image description

此图提供了开源和闭源许可证的一般概述。 虽然我们很快将深入研究开源许可证类型的更多细节,但最好了解一下普遍可用的不同类型的许可证。

在开源方面,许可证通常分为两大类:

宽容的

这些许可证只对重新发布软件时必须做的事情施加了最低限度的要求。这些需求通常仅限于保留或交付属性通知之类的事情。

CopyLeft/互惠

Copyleft许可有时被称为保护许可或互惠许可。他们有关于如何重新分发软件的需求,以及可能影响如何分发派生工作的需求,例如要求发布您可能对软件进行的所有更改/增强。

开源计划(https://opensource.org/)是一个重要的书签资源,该组织负责跟踪和审查已批准的开源许可。在他们的网站上有更多关于开源许可的定义和类型的细节。

4.2 宽松的开源许可证

如前所述,如果您进行更改和重新分发软件,宽松许可证通常对您必须执行的操作的限制最少。 出于这个原因,它们通常(但不总是)在公司内部预先批准的列表中,指定组织中的工程师可以使用哪些开源软件许可证类型。

让我们以 BSD-3-Clause 许可证为例。 本许可是一个许可许可的例子,它允许出于任何目的以源代码或目标代码形式无限制地重新分发更改,只要维护其版权声明和许可的免责声明即可。

但是,该许可证包含一个条款,限制在未经特别许可的情况下使用贡献者的姓名为衍生作品背书。

其他许可许可的例子包括:MIT、Apache-2.0。

4.3 Copyleft/互惠许可

某些许可证要求如果分发衍生作品(或同一文件、同一程序或其他边界中的软件),则该分发与原始作品的条款相同。

这被称为“左版”或“互惠”效应,如果您的衍生作品是用于为您的公司提供独特优势的高度专有软件,则可能会产生重要后果。在某些情况下,这可能需要您将与开源软件结合的专有作品的源代码发布给您向其分发作品的编译版本或二进制版本的任何人。

以下是 GPL 2.0 版的许可互惠示例:

您必须根据本许可的条款使您分发或发布的任何作品(全部或部分包含或源自程序或其任何部分)获得许可 […]。

其他包含互惠或 Copyleft 条款的许可包括 GPL、LGPL、AGPL、MPL 和 CDDL 的所有版本。您可以在 https://opensource.org/licenses 上查看更多详细信息。

4.4 许可证兼容性

许可兼容性是确保许可条款不发生冲突的过程,这可能会变得特别具有挑战性,因为许多软件(包括内部开发的软件)可能会相互构建并由具有不同许可的软件构建而成类型。

以下是一些示例:

在这种情况下,分发者无法同时满足这两个条件,因此模块可能不会分发,从而造成许可证不兼容的示例。

请记住,“衍生作​​品”的定义受开源社区的不同观点的影响,其在法律上的解释可能因司法管辖区而异,因此重要的是您要检查适当的资源以针对您的特定情况做出决定案例。

4.5 通知

通知(例如文件标题中注释中的文本)通常提供作者身份和许可信息。 开源许可证还可能要求在源代码或文档中或旁边放置通知,以表明作者(归属)或明确软件包含修改。

例如:

4.6 多重许可

在某些情况下,版权所有者可能会选择在多个许可下提供代码,这种做法被称为“多重许可”。

例如,软件可以是“双重许可”,版权所有者可以让每个接收者选择两个许可。

重要的是要注意,对于许可方强加多个许可的情况,不应混淆这一点,并且您必须遵守所有许可。

5. 选择正确的许可证

5.1 概述

有了到目前为止提供的所有信息,弄清楚如何为您希望在组织中使用的开源代码选择正确的许可证,最终贡献功能或更改,或者创建一个全新的开放源代码似乎令人生畏。 自己的源项目。

值得庆幸的是,有一些常见的问题需要询问和遵循的流程,以帮助您做出明智的选择。 以下是一般概述:

Image description

在对现有项目做出贡献时,除非该项目使用具有不同入站许可证的贡献机制,否则通常的做法是根据整个项目所受的许可证条款做出贡献。

在参与或创建新项目时,明确要求使用代码的人(必须)做什么、允许做什么(可以)以及禁止做什么(不能)是非常重要的 . 选择的许可证是您指定此信息的方式。 通过选择标准和常用的开源许可证,您可以帮助其他人更轻松地了解他们的权利和义务是什么。

要考虑的属性

在选择许可证时,重要的是要明确发布代码的目标。您希望谁(什么类型的人/组织)采用该准则?您想看到人们在重新分发代码时对您的代码所做的任何更改吗?您是否希望其他人能够出售您的代码以获取利润?

您还应该考虑以下常见属性:

页面上的列表包含一些常见问题,您应该在公开代码之前了解答案,并选择反映您答案的许可证。这有时是一项可怕的任务,但在过去的几年里,已经创建了一些网站来帮助解决这个问题,这些网站列在下一个屏幕上。

5.2 许可证帮助资源

下面是一些流行的网站,它们讨论了在为您的代码或其他创意作品选择许可证时要考虑的许可证类型和属性。 它们的目的是帮助您选择许可证,并解释一些选项背后的更多背景。

5.2.1 源代码

来自开源计划的按类别划分的开源许可证列出了已批准的开源许可证。

选择开源许可证由 GitHub 赞助。它会引导您了解您必须考虑的属性,帮助您确定哪种许可证有意义。

许可证文本有时会被视为“太长,未阅读” - 表示为 TL;DR。 tl;dr Legal 正试图将法律文本澄清为标准属性。网站创建者与志愿律师合作​​,对与特定许可证相关的属性进行分类和颜色编码,以帮助您更轻松地浏览并更好地了解现有许可证。

这是理解一些常见许可条款的非常有用的工具。例如,对于 Mozilla Public License version 1.0,您不能追究贡献者的责任,但如果您使用它,则必须包括版权、许可、声明任何更改并披露来源。

来自自由软件基金会的许可和合规实验室的各种许可证和关于它们的评论提供了许多许可证的描述和关于它们的评论。

5.2.2 其他创意作品

知识共享许可可帮助您了解图像和文档的许可选项。这方面的一个例子是 CC-BY-SA 4.0 许可证。我们鼓励您单击知识共享站点的链接,并阅读法律代码文件。它指定了与此许可相关的归属、类似共享和其他属性。

5.2.3 其他资源

此外,您可以查看此在线资源:来自 Jilayne Lovejoy 和 FINOS(金融科技开源基金会)的开源许可证合规手册。该手册提供了“自助服务”信息,以帮助开源软件的用户和再分发者了解遵守各种许可的具体要求。

SPDX 许可证列表是另一个用于识别许可证的有用资源。它提供了公共分发软件中使用的常见许可证的精选目录。并非所有许可证都必须是开源的;许可证列表表明哪些已被开源计划批准,哪些已被自由软件基金会列为免费/自由。

许可证列表不包括许可证的解释。相反,它在搜索与特定许可证名称或标识符对应的许可证文本时会很有用。许可证列表贡献者还维护许可证文本的版本,其中标记了许可证文本的某些部分,这些部分被认为是可替换的,同时仍然是基本相同的许可证,这在自动检测源代码中的许可证通知时非常有用。

如果您正在寻找有关如何将许可证信息结构化到您的项目中的指南,我们建议您参考欧洲自由软件基金会的 REUSE 软件指南。它们提供了有关如何将标识符和许可证全文添加到项目中的详细示例,以及用于检查是否符合准则的脚本。

如果您尝试使用不在 SPDX 许可证列表中的许可证,他们也有关于如何记录它以便工具可以找到信息的很好的建议。

6. 建立有效的合规计划

6.1 简介

在本节中,我们将提供有关有效合规计划背景的信息,以及如何建立此类活动并为其配备人员,包括工程领导和法律合作伙伴关系的重要性。

6.2 学习目标

在本节结束时,您应该能够:

6.3 开源合规性简介

6.3.1 合规目标

虽然“合规”这个词在某些情况下可能看起来霸道或可怕,但在这种情况下,它可以分解为两个非常具体的目标:

您应该有一个过程来识别和跟踪软件中存在的开源组件。

您的流程应该能够处理因您组织的业务实践而产生的开源许可义务。

虽然这两个目标当然包含了许多细节(稍后会详细介绍),但重要的是要记住,组织围绕合规性的所有流程决策都可以追溯到这两个总体目标。

6.3.2 义务

由于合规领域中的义务很重要,因此了解必须满足哪些义务非常关键。

根据所涉及的开源许可证,您的合规义务可能包括:

您可能需要在源代码和/或产品文档或用户界面中提供或保留版权和许可文本,以便下游用户了解软件的来源以及他们在许可下的权利。您可能还需要提供有关修改的通知或许可证的完整副本。

您可能需要提供开源软件的源代码、您所做的修改、组合或链接的软件以及控制构建过程的脚本。

您可能需要在管理开源组件的同一许可下维护修改后的版本或衍生作品。

开源许可可能会限制版权所有者名称或商标的使用,可能需要修改版本以使用不同的名称以避免混淆,或者可能会因任何违规行为而终止。

6.3.3 合规问题:分发

在许多开源许可案例中,“分发”是触发许可义务的东西。 但分布究竟意味着什么? 一般而言,“分发”是指向外部实体分发材料。 有时这可能是一个具有挑战性的领域,即使在法律界也是如此,但这里有几个例子:

一些许可证将触发事件定义为包括允许访问在服务器上运行的软件(例如,如果软件被修改,则所有版本的 Affero GPL)或在“用户通过计算机网络远程与其交互”的情况下。

6.3.4 合规问题:修改

修改源代码时可能会发生许可义务的另一个主要因素,例如修复您发现的错误或添加新功能。 此外,将开源代码与您自己的代码或什至其他开源组件相结合可能会产生潜在影响。

在某些开源许可证下,修改可能会导致分发时承担额外的义务,例如:

在本模块的后面,我们将介绍如何构建适当的流程来跟踪和管理分发和修改事件的结果。

6.3.5 合规优势

重要的是要注意,虽然偶尔会出现与开源合规性相关的挑战,尤其是在修改或分发方面,但正确构建和运行的合规性计划很简单,可为您的组织带来许多好处,例如:

6.4 合规管理流程概述

6.4.1 合规计划的总体结构

在开源合规性方面取得成功的组织已经制定了他们的政策、流程、培训和工具,以:

需要注意的是,这些政策、流程、培训和工具需要提供监督,但不能变得霸道,这一点非常重要。理论上,您可以构建世界上最好的开源合规性计划,但如果它对于工程团队来说过于复杂和繁重而无法使用,那么它很可能不会被利用,或者会因团队在该过程中寻找方法而受到严重阻碍。

此外,开源合规性计划应根据您自己组织的性质和要求进行定制。每个组织都以不同的方式开发和构建软件,您的组织可能能够遵守其许可义务,而无需遵循此处描述的确切流程集。

6.4.2 合规实践概述

虽然我们很快会详细介绍,但您在构建合规实践时应考虑的主要领域是:

6.4.3 开源审查的关键组件

开源审查期间的一个重要考虑因素是考虑您计划如何使用相关开源软件组件。

常见场景包括:

我们将在接下来的几页中更详细地介绍这些内容。

6.4.4 合并

开发人员可以将开源组件的某些部分复制到软件产品中。

有关条款包括:

Image description

6.4.5 链接

开发人员可以将开源组件与您的软件产品链接或加入。

相关条款包括:

6.4.6 修改

开发人员可以对开源组件进行更改,包括:

Image description

6.4.7 转换

开发人员可以将代码从一种状态转换为另一种状态。

例子包括:

Image description

6.4.8 开发工具的作用

除了人类工程师执行其中一些任务之外,重要的是要注意出于合规性目的,一些开发工具也可以在幕后执行这些功能。

例如,一个工具可以将它自己的代码的一部分注入到工具的输出中。

Image description

6.4.9 分发的合规性注意事项

如前所述,重要的是要考虑如何分发特定的开源组件,特别是:

6.5 开源审查流程

6.5.1 开源审查基础

在程序/产品管理和工程师审查了提议的开源组件的实用性和质量后,应启动对与使用所选组件相关的权利和义务的审查。

开源合规计划的一个关键要素是开源审查流程。 在此过程中,公司可以分析其使用的开源软件并了解其权利和义务。

该过程包括以下步骤:

6.5.2 启动开源审查

Image description

在公司中与开源工作的任何人都应该能够发起开源审查,包括程序或产品经理、工程师和法律团队成员

注意:当工程或外部供应商选择新的基于开源的软件时,该过程通常会开始。

6.5.3 收集组件信息

在分析您的开源使用情况时,您需要收集有关相关组件的身份、来源以及组件的使用方式的信息。 这些信息可能包括:

6.5.4 开源审查小组

组建一个团队来有效地运行开源审查需要多个利益相关者的参与。

Image description

开源审查团队包括支持、指导、协调和审查开源使用的公司代表。 这些代表可能包括:

Image description

在为问题提供指导之前,开源审查团队应评估其收集的信息。 这可能包括扫描代码以确认信息的准确性。

考虑因素包括:

6.5.5 源代码扫描工具

我们将在后面的部分中更详细地介绍不同类型的扫描工具以及选择工具时应考虑的标准,但这里是一个总体概述。

有许多不同的自动源代码扫描工具,所有解决方案都满足特定需求——因此——没有一个能解决所有可能的挑战。 因此,大多数公司都会选择最适合其特定市场领域和产品的解决方案。 一般来说,大多数公司尝试同时使用自动化工具和人工审查来抽查扫描结果。

免费提供的源代码扫描工具的一个流行且很好的例子是 FOSSology,这是一个由 Linux 基金会主办的项目。

6.5.6 通过开源审查工作

Image description

需要注意的是,开源审查过程跨学科,包括工程、业务和法律团队。 为了获得最大效率,它应该是互动的,以确保所有这些组正确理解问题,并可以创建清晰、共享的指导。

6.5.7 开源审查监督

Image description

开源审查过程应该有执行监督来解决分歧并批准最重要的决定。

将审查过程视为组织中的跨学科活动至关重要,因为简单地将其描述为“工程问题”或“法律问题”不仅会降低重要性,还会对工程生产力产生不利影响 和法律风险。

将流程视为协作伙伴关系确实需要更多的前期工作来让所有利益相关者参与进来,但随着您的组织越来越熟悉端到端合规管理流程,这会带来好处。

6.6 端到端合规管理示例

6.6.1 简介

合规性管理是一组用于管理产品中使用的开源组件的操作。 公司可能对专有组件制定了类似的流程。

此类行动通常包括:

Image description

6.6.2 示例公司清单

这是一个示例清单,可用作您自己组织的合规性管理流程的基础。

正在进行的合规任务:

支持要求:

6.6.3 示例企业流程

下面是一个典型的开源企业合规流程的图形概述:

Image description

我们将在接下来的几页中介绍此过程的重要部分。

6.6.3.1 识别和跟踪开源使用

Image description

该过程的第一步是识别代码中的开源组件。

以下是此阶段预期的步骤和结果:

步骤

结果

6.6.3.2 审计源代码

Image description

识别后,进行代码审计,具有以下步骤和结果:

步骤

结果

6.6.3.3 解决问题

审计完成后,需要分配时间来解决在审计过程中发现的任何问题。 步骤和结果包括:

步骤

结果

6.6.3.4 执行审查

Image description

此时,您需要查看已解决的问题以验证解决方案是否符合您的公司开源政策。

步骤

结果

6.6.3.5 批准

Image description

根据之前步骤中软件审计和审查的结果,软件可能会或可能不会被批准使用。 批准应指定批准的开源组件的版本、组件的批准使用模型以及开放源代码许可下的任何其他适用义务。

此外,应在适当的权限级别(必要时可达并包括执行审查委员会)进行批准。

6.6.3.6 注册和批准跟踪

Image description

一旦一个开源组件被批准在产品中使用,它应该被添加到该产品的软件清单中,并且批准和它的条件应该在跟踪系统中注册。

跟踪系统应明确说明,开源组件的新版本需要新的批准,或者是否提出了新的使用模型。

6.6.3.7 通知

Image description

注册后,您需要为产品发布中使用的任何开源准备适当的通知:

6.6.3.8 预分发验证

Image description

在使用任何软件之前,您需要运行高强度的步骤,包括:

步骤

结果

6.6.3.9 随附的源代码分发

Image description

在流程的这个阶段,您已准备好提供随附的源代码,以满足所用开源代码的许可规定的任何许可义务。 您需要确保:

6.6.3.10 最终验证

Image description

在这最后的验证步骤中,您需要通过以下方式验证您是否遵守了所有适当的许可义务:

7. 选择正确的许可证合规工具

7.1 简介

在本节中,我们将更详细地研究许可证合规性工具,包括提供有关工具将解决哪些类型的问题以及在为您的组织确定最佳合规性工具和扫描软件时应考虑哪些类型的标准的上下文。

7.2 学习目标

在本节结束时,您应该能够:

7.3 工具用例

7.3.1 简介

毫无疑问,您已经从本模块的内容中确定了这一点,从概念上讲,合规性相当简单。 挑战来自可用于开源世界的软件数量,以及它可以与您自己组织的软件结合的各种方式。

因此,跟踪和建立有效的合规流程需要各种形式的工具,以帮助减少可能的人为错误并加快实现合规的过程。 但是,在考虑可能的工具时,有一些重要的事情需要考虑:

7.3.2 关于工具

Image description

如您所见,工具可用于许多不同的合规领域。 然而,抵制将所有这些工具构建为整体堆栈的冲动。 确定您最大的潜在痛点是什么让您有机会以开源/敏捷风格(例如,随着合规性需求的增长以迭代方式)构建工具。

7.3.3 软件情况

Image description

当您考虑工具时,重要的是要考虑您将要解决的不同类别的软件和情况。 如上所述,您基本上需要考虑三类:入站、您自己的和出站软件。

7.3.4 来自 10k 英尺的合规工具箱

Image description

在高层次上,您需要考虑上面提到的情况以及在考虑工具需求时需要什么。

对于入站软件,记录实际情况(许可类型、义务等)至关重要。 对于您自己的软件,您需要在了解链接或调用开源包的方式和原因方面进行质量控制。 对于组合的 Outbound 软件,您需要了解您的可交付成果在您的软件和开源组件的组合包中的样子,并确保您遵守与分发相关的所有许可义务。

在分析入站软件时,有几个方面需要考虑,其中最重要的是,即使入站商业软件本身也可以包含开源(其分发的一部分)。 考虑以下事项也很重要:

7.3.5 入站软件

7.3.5.1 识别入站许可证

确定入站软件的许可证可能相对容易,或者可能非常具有挑战性。 这是工具可以提供很大帮助的原因之一。 以下是有关简单案例和更具挑战性的案例的一些详细信息。

7.3.5.2 简单案例

7.3.5.3 具有挑战性的案例

7.3.5.4 识别版权

一些许可证要求提供版权声明或作者列表,导致有义务提供这些,但正如您在下面看到的,有时解析和解开版权声明可能会出现问题,因此这通常是软件(以及像 SPDX 这样的项目,我们 稍后会详细介绍)进来。

Image description

7.3.5.5 使用二进制文件识别许可证

二进制文件是已编译的应用程序、库、软件,无需访问源代码即可使用。 二进制文件可以是开源组件分发的一部分,并且本身可以包含开源。

这里的主要问题围绕如何理解二进制文件中包含的内容:

7.3.6 您自己的软件

Image description

虽然希望您的组织能够养成良好的编码和工程习惯,但总是有“复制和粘贴”解决方案进入您的代码库的诱惑。 造成这种情况的原因有很多,包括:

可以将 Internet 上的源代码复制并粘贴到您的代码中,因为重用通常比每次都重新发明轮子要好。 但是,通过遵守任何许可或版权义务来尊重作者的利益很重要.

7.3.7 出站软件

Image description

当您开始打包产品以进行销售或分发时,您需要关注组合的出站软件堆栈在开源合规性以及其他辅助任务的背景下是什么样子。 我们将在接下来的页面中介绍这些项目。

7.3.7.1 开源代码的分发

如果您的项目或产品将分发开源作为您交付的一部分,您需要:

为了能够提供所有这些,您将需要收集以下信息的工具:

7.3.7.2 保障发行权

由于您的合规性目标是确保您对所使用的开源代码履行所有适当的义务,因此您需要考虑对出站软件中的许可证进行工具和人工审查。

例如,某些许可证不兼容,例如 GNU 公共许可证 (GPL) 和 Eclipse 公共许可证 (EPL),基于包含 GPL 和 EPL 许可证的代码的作品可能会出现问题。

此外,即使使用工具,一些许可声明也是模棱两可的,例如“在 BSD 下许可”。在这种情况下,让您的法律团队和利益相关者参与决定如何进行是很重要的。

7.3.7.3 物料清单 (BOM)

代码扫描或合规性工具可以提供的最关键的事情之一是一种确定您要交付的软件或产品中的内容的编程方式。这是材料清单 (BOM) 的形式。

BOM 提供了软件包交付内容的详细说明,包括确定该软件包中有多少由开源组件组成,以及这些组件使用了哪些许可证。

软件包数据交换 (SPDX) 项目指定了如何表达物料清单的一种实现。

7.3.7.4 工具支持摘要

我们将在下一节中介绍不同类型的工具,但重要的是要了解哪些工具可以提供合规性,以及在选择解决方案之前需要考虑哪些方面。

从本节中可以看出,建立有效的合规性需要一些东西,工具绝不是可以消除所有合规性负担的“灵丹妙药”。工具非常擅长分析、报告和帮助推动管理决策,但它们不能孤立运行——它们需要一个有效的流程,结合一套明确的期望和政策来使用开源,以及分发你自己构建的软件基于开源包。

请记住,也不一定有满足所有需求的单一工具,因此您可能会处理不同系统/工具的集成,并且您应该清楚地了解工具提供的 API 和接口,以减少手动操作整合努力。

8. 工具类型

8.1 概览

开源合规领域有许多类型的工具,包括(但不限于):

我们将在接下来的页面中介绍这些领域中的每一个。

8.2 源代码扫描

Image description

由于组织可以访问自己的源代码以及用于构建其产品的开源包,因此源代码扫描工具是合规领域使用最广泛的工具之一。

有许多商业工具(和一些开源工具)可以执行此功能。通常,这些工具依赖于现有开源代码库(或者,如果添加到扫描数据库的潜在内部组件)的“散列”指纹来确定哪些软件组件是分发的一部分。他们最大的优势之一是构建我们之前提到的物料清单 (BOM)。

一些扫描工具还可以识别“代码片段”,这在确定是否使用了来自特定开源包的“复制和粘贴”代码时通常很有帮助。然而,片段扫描是有代价的——对源代码运行完整的片段扫描分析通常需要更长的时间,而不仅仅是依赖散列指纹。

许多这些工具的最大区别在于它们的数据源——它们的数据库多久更新一次,以及它们的数据中有多少开源代码。构建环境的成本、复杂性、集成能力和报告功能也是您在选择工具之前需要评估的关键功能。

还有可能出现“误报”或需要引入专家知识(法律、工程)来确定源代码扫描结果的相关性的情况。

8.3 许可证扫描

Image description

虽然我们将许可证扫描工具作为一个单独的项目进行介绍,但实际上,大多数商业源代码扫描工具也包括许可证扫描功能。

许可证扫描依赖于搜索相关关键字和/或机器可读标记(例如 SPDX 块)的源代码来确定附加到每个文件或包的相关许可证。这些扫描还可以识别版权、作者声明和有时的致谢。

虽然开源许可证数据库不如在 BOM 中构建组件标识部分所需的开源组件数据库大,但它仍然需要访问现有开源许可证的知识库。一般来说,许可证扫描很难识别非 OSS 许可证,因为这些类型的许可证种类繁多。

如前所述,许可证扫描的主要用途是检查入站开源软件以验证正在使用的许可证。这通常是在验证用于您的组织的开源组件之前执行的第一步(在评估技术目的的适用性之后)。

即使采用最佳模式匹配或机器可读标记的使用,也可能存在需要利用法律或工程利益相关者来澄清可能不明确的许可证标识的情况。

8.4 二进制扫描

二进制扫描的目的类似于源代码扫描(识别开源组件及其版本),可以帮助创建 BOM,以及识别进入组织的特定软件包的潜在漏洞。

当然,这里的挑战是,如果没有可读的源代码,二进制扫描是一种启发式方法,它依赖于二进制文件的一些特征元素,例如字符串变量、文件名,有时还有来自具有运行时代码的语言的方法和字段名称(例如 爪哇)。 由于硬件架构和编译器会随着时间的推移而变化,因此必须经常调整二进制扫描器以尝试并考虑这些变化。

在某些情况下,特定二进制文件无法完全获得可靠的扫描。 但是,如果可以尝试在没有源代码的包中识别开源,扫描二进制文件仍然是一个好主意。

8.5 DevOps集成

Image description

使用定制软件和定制流程的 DevOps 集成可用于增强前面提到的其他扫描机制,并从用于构建软件的流程中获取更多信息。

由于 DevOps 构建系统能够在构建期间确定依赖关系,因此它可以将该信息与其他工具的输出相结合,以帮助创建更强大的 BOM。 对于可能具有复杂依赖关系或软件中可能无法被商业或开源扫描技术正确识别的遗留包的开发组织来说尤其如此。

一个缺点是这些自定义配置/系统确实需要努力构建和维护,但如果您的组织已经有一个与 DevOps 基础设施相关联的构建系统,则可能将外部扫描工具集成到此环境中,并可能有助于减轻相当多的负担 人工审查/合规工作。

8.6 组件管理

Image description

组件管理系统是一个方便的合规工具,可帮助您整合各种相关的物料清单 (BOM) 并提供文档和报告。 有各种商业供应商和一些开源项目(搜索 github.com)提供这种功能。

一些组织甚至选择为自己编写这种数据库程序,但重要的是它可以在很多方面提供帮助,包括漏洞管理、开源组件的审批、许可证的跟踪以及识别哪些开源组件 用于组织中的所有软件。

将此作为 Web 门户实施可以帮助多个利益相关者,尤其是法律、安全甚至工程团队,当他们必须解决许可证合规性、安全漏洞或跟踪组织中使用的开源组件版本等问题时。

8.7 法规遵循工具的行业计划

8.7.1 概览

围绕合规性工具出现了许多行业计划,包括用于扫描的 FOSSology、Microsoft 的 ClearlyDefined 和 tl;dr Legal 用于许可澄清和审查,以及许多其他计划。

在接下来的两页中,我们将重点介绍两个对自动化和供应链工作很重要的举措,以帮助使开源在组织中更具可持续性和更容易使用——SPDX 和 OpenChain。

8.7.2 SPDX

软件包数据交换 (SPDX) 是一个项目、一个标准和一组许可数据,有助于将机器(和人类)可读的许可信息嵌入到源代码中,而且还可以在不同的合规工具和系统之间进行交换。

SPDX 还是一个精英社区工作组,开发了一套抵押品,可用于以标准/可重复使用的方式更清晰地传达完整的许可证信息并促进合规性。这样做的优点是:

到目前为止,在我们的工具讨论上下文中,最后一点可能是最重要的——对于商业、开源或定制的合规性工具,拥有标准格式来交换许可证数据的能力绝对是至关重要的——没有这一点,将有大量的手动工作和审查来保持有效的开源合规性。

8.7.3 OpenChain

OpenChain 项目是质量开源合规计划关键要求的行业标准。 该项目提供了一个规范和认证计划,涉及源代码、构建脚本、许可证副本、归属通知、修改通知、SPDX 数据和其他管理软件可交付成果的开源许可证可能需要的材料的供应链交换。

此外,该项目提供了一套课程,以及一个免费的评估工具,可以帮助您的组织确定可以改进哪些领域以帮助您自己的开源合规性。

也许最重要的是,OpenChain 是一个不断壮大的社区,他们是刚刚开始开源合规之旅的组织的重要资源。

9. 开源审计在并购活动中的作用

9.1 课程简介

在本节中,我们将解释开源审计在兼并与收购 (M&A) 活动为您的现有产品带来新代码时所起的作用。 有效的审计可以帮助遵守法律,同时也是识别软件重用领域的战略手段。

9.2 学习目标

在本节结束时,您应该能够:

9.3 概览

9.3.1 介绍

我们已经确定该软件,特别是开源软件,不仅在技术公司中发挥着重要作用,而且在许多以前不涉足软件或技术业务的公司中也发挥着重要作用。到目前为止,在本模块中,我们已经详细介绍了为入站软件、您自己的软件和出站软件构建有效的合规流程意味着什么。

当一个组织即将获得另一家公司的知识产权(软件方面)时,会出现 Inbound Software 的一个特殊情况。这种软件尽职调查过程,在该过程中,收购方对目标的软件及其合规实践进行全面审查,正成为任何合并或收购的标准部分。在此过程中,经常会遇到开源软件,这会带来一系列不同于专有软件的验证挑战。

在本节的其余部分,我们将概述并购 (M&A) 交易中的开源审计流程。

9.3.2 为什么要进行审计?

虽然每笔并购交易都不同,但验证获得开源义务的影响的需求是不变的。进行开源审计是为了了解使用深度和对开源软件的依赖。此外,他们还提供了有关任何合规性问题甚至目标工程实践的深刻见解。

开源软件可以影响所收购资产的方式示例包括:

一个常见的问题是是否需要进行开源审计。答案因公司、收购目的和源代码库规模而异。例如,对于小型收购,一些公司更愿意只查看收购目标提供的开源物料清单 (BOM)(假设它可用),并与他们的工程负责人讨论他们的开源实践。即使收购的目的是获得人才,审计也可以帮助发现是否存在由于已经发货的产品的历史许可义务而导致的未披露负债。

9.3.3 输入和输出

Image description

审计过程有一个主要输入和一个主要输出(见上图)。 该流程的输入是正在进行的并购交易的完整软件堆栈主题。 这包括专有、开源和 3rd 方软件。

在流程的最后,主要输出是一份详细的开源软件材料清单,其中列出了:

9.3.3 评估审计范围

审计的规模、范围和成本因事务而异,并且通常随着源代码的大小和复杂性而增加。为了确定开源审计的成本和时间,审计人员需要对代码库的大小和特征,以及项目的紧迫性有一些基本的了解。

第一个问题将与代码度量相关,例如源代码库的大小、源代码的行数以及需要审核的文件数。审计员还会询问代码库是否仅由源代码组成,或者它是否包含二进制文件、配置文件、文档和其他可能的文件格式。有时,审计人员了解受审计的文件扩展名也很有帮助。正如我们在本模块中已经学到的,了解这些内容将有助于团队选择正确的工具来支持审计。

由于审计价格讨论在流程的早期根据规模和范围进行,因此收购方可能无法访问上述所有信息。审计员至少需要在继续之前了解要扫描的文件数量,尽管附加信息将有助于改进估计。当审计师有足够的信息来了解工作范围时,他们还需要了解紧迫性,因为这对审计成本有重大影响。

9.4 审计方法

9.4.1 概览

根据审计员在初始采购讨论阶段发现的情况,他们可能不得不依赖多种类型的工具(扫描、许可证识别、组件管理)来执行审计。

有两种审计方法:

9.4.2 传统审计

Image description

这种方法被称为传统方法,因为它是用于开源合规性目的的源代码扫描的原始方法。传统审计是第三方审计公司的合规审计员通过云系统远程访问源代码或在访问现场时物理访问源代码并执行源代码扫描的审计。

请注意,不同服务提供商的流程可能略有不同。典型的传统审计流程遵循以下步骤:

这种方法在大多数审计服务提供商中都很常见,它允许有机会为同一审计工作收集多个投标,并能够根据您的要求选择最佳投标。

为了使这种模式有效,目标公司必须愿意将代码传输给审计员或允许他们访问他们的办公室以完成现场工作。

9.4.2 自己动手 (DIY) 审计

Image description

Do-It-Yourself (DIY) 审计为收购方或目标公司提供了对合规云工具的限时访问,使他们能够自己运行扫描。然后,他们可以通过完全访问知识库和所有报告工具在内部执行审计。

对于拥有足够经验来解释扫描结果和建议补救程序的内部员工的公司来说,这是一种特别有趣的方法。对于每年经历多次并购过程的公司来说,它可以很快变得更具成本效益。审计工具服务提供商可以进行独立认证以验证结果,进一步确保审计的完整性。

这种方法有几个优点,例如能够在需要时立即开始审核,因为它使用内部资源并且不依赖于第三方审核员的可用性。这种方法可能会缩短时间并减少外部成本来源。

任何合规性问题都可以立即解决,因为它是由可以直接访问代码并可以直接应用修复程序的人员进行的。最后,审计可以由审计工具的提供者进行验证,以确保正确性和完整性。

9.4.3 最终审计报告说明

许多审计工具也可以调整以突出潜在问题。 仔细查看结果后,您可能会发现许多结果都不是问题,但您应该预料到初始报告中可能会出现大量“噪音”。

噪音可能来自代码树中但未使用的剩余代码之类的东西。 因此,初始报告可能很长,您应该准备好花时间过滤报告以找出真正的问题。

请注意,通常按需提供软件包数据交换 (SPDX) 一致性报告。 因此,如果您希望您的审计服务提供商提供这样的报告,您将需要请求它,如果您已经投资了与 SPDX 兼容的工具,这将使导入和跟踪您的审计结果变得更加容易。

9.4.4 获取前和获取后的补救措施

到此为止,收购公司应该清楚目标公司如何使用和管理开源软件,以及他们在满足开源许可义务方面取得了多大的成功。收购者和目标应该使用此信息协商任何开源遵从性问题的补救措施。

如果在审计中发现任何问题,有几个选项可以解决这些问题,作为挂起事务的一部分。第一种选择是简单地删除任何违规代码。如果开源软件只是增加专有代码,那么完全消除它是可能的。另一种选择是围绕违规组件进行设计,或者使用洁净技术重写任何代码。

如果代码部分确实是必要的,或者它之前已经发布过,那么剩下的唯一选择就是使代码符合要求。每个期权的成本可以用来确定目标的估值。无论选择何种方案,关键是要确定参与合并开放源代码的个人,并让他们参与补救工作。他们可能拥有有助于解决问题的额外文档或知识。

9.5 作为收购方准备审计

9.5.1 考虑您的需求

作为收购方,您必须在委托审计之前采取行动并做出决定,并且在收到结果后您还有额外的义务。 因此,重要的是考虑您的需求,以及前面提到的哪种审计方法最适合您的组织和特定情况。

就审计结果而言,确定组织最关心什么也同样重要。 源代码审计报告可能会提供大量信息,具体取决于扫描代码的复杂性。 因此,在获得结果之前确定哪些许可证和用例被认为是关键的很重要。

在审核前后明确您的需求不仅会使审核过程更顺畅,而且从长远来看也更具成本效益。

9.5.2 提出正确的问题

开源审计报告提供了大量有关目标源代码和所涉及许可证的信息。但是,许多其他数据点需要进一步调查,以澄清或确认与合规性相关的问题。在本节中,我们提供了一系列问题,以此作为起点来确定对您而言重要的内容,以及您应该向目标公司解决哪些问题。

9.5.3 确定要解决的项目

在某些情况下,开源审计可能会发现收购方不可接受的许可或合规实践实例。 然后,收单方可以请求减轻这些情况,作为结束交易的条件。

例如,目标公司可能使用使用许可证 A 的代码组件,但收购公司有严格的政策禁止使用许可证 A 下许可的任何源代码。

在这种情况下,双方需要讨论并找出可能的解决方案。

9.5.4 制定收购后合规改进计划

当收购方是一家大公司,收购一家将继续作为子公司运营的小型初创公司时,制定合规改进计划尤为重要。 在这种情况下,收购方通常会帮助目标公司建立正式的合规政策和流程,提供有关其自身实践的培训,并提供持续的指导和支持。

也可能有机会通过改进工具/流程和/或人员配备来协助收购。

9.6 准备作为收购目标的审计

9.6.1 做好准备

如果您准备好了,通过开源合规性审核并不难。但是,如果您仅在收购方表现出兴趣后才开始准备,这种情况就不太可能发生。这些活动旨在与您的日常业务和发展活动齐头并进。目标是确保公司跟踪所有开源组件并遵守因使用开源组件而产生的开源许可义务。如果您的公司成为公司交易的目标,这些相同的措施可能会大有帮助,因为它们最大限度地降低了意外风险。

正如您将在接下来的几页中看到的,这些实践与我们在本模块中学到的内容一致。

9.6.2 了解您的代码中的内容

了解代码中的内容是合规性的黄金法则。您需要维护所有软件组件的完整软件清单,包括它们的来源和许可证信息。这包括由您的组织创建的软件组件、开源组件和源自第三方的组件。最重要的一点是有一个识别和跟踪开源组件的过程。您并不总是需要复杂的合规计划,但是,您应该具备五个基本要素:政策、流程、员工、培训和工具。

9.6.3 政策和流程

Image description

这个数字重申了我们已经涵盖的一些内容,但在这里重新审视它很重要。

开源合规政策是一套管理开源软件(使用和贡献)的规则。流程是关于公司如何每天实施这些规则的详细规范。合规政策和流程管理开源软件的使用、贡献、审计和分发的各个方面。

此图说明了一个示例合规性流程,其中包含每个软件组件在构建产品或软件堆栈时作为尽职调查的一部分将经历的各个步骤。

该过程的输出是您可以发布的开源 BoM,以及一份书面报价和各种版权、许可和归属通知,以履行您的 BoM 中组件的法律义务。

有关开源合规性流程的详细讨论,请下载由 Linux 基金会出版的免费电子书《企业中的开源合规性》。

9.6.4 工作人员

在大型企业中,开源合规团队是一个由不同个人组成的跨学科团队,其任务是确保开源合规性。核心团队通常称为开源审查委员会 (OSRB),由来自工程和产品团队的代表、一名或多名法律顾问以及一名合规官组成。

扩展团队由多个部门的不同人员组成,他们持续为合规工作做出贡献:文档、供应链、企业发展、IT 和本地化。但是,在较小的公司或初创公司中,这可能就像由法律顾问支持的工程经理一样简单。

9.6.5 培训

教育是合规计划的重要组成部分,可帮助确保员工充分了解管理开源软件使用的政策。提供开源和合规培训的目标是提高对开源政策和策略的认识,并建立对开源许可问题和事实的共同理解。它还应涵盖将开源软件纳入产品和/或软件组合的商业和法律风险。

正式和非正式的培训方法都可用。正式的方法包括讲师指导的培训课程,员工必须通过知识考试才能通过课程。作为新员工入职培训的一部分,非正式方法包括网络研讨会、棕色包研讨会和向新员工介绍。

9.6.6 工装

到目前为止,您已经在本模块中了解到,有许多不同类型的工具可以在合规流程中使用。要记住的重要一点是,工具不能替代良好的流程,知识渊博的员工根据政策和工具提供的数据做出决策。

考虑对您的工具采用“开源”方法也很重要 - 对现有工具进行持续评估,以及在必要时进行调整的能力对于维持健康的合规计划至关重要。

9.6.7 合规

如果您发布了包含开源软件的产品(无论是有意还是无意),您都需要遵守管理这些软件组件的各种许可证。 因此,了解代码中的内容非常重要,因为完整的材料清单使合规性变得更加容易。

合规性不是一项简单的任务,它因产品而异,具体取决于许可证和代码结构。 在较高的层面上,合规意味着您:

9.6.8 了解最新版本的安全性

全面合规计划的好处之一是可以更轻松地找到具有不安全版本的开源组件的产品并替换它们。大多数源代码扫描工具现在提供标记旧软件组件中披露的安全漏洞的功能。

升级开源组件时的一个重要考虑因素是始终确保该组件保留与先前版本相同的许可证。开源项目偶尔会更改主要版本的许可证。鼓励公司与开源项目社区合作,以帮助避免他们使用具有安全漏洞的版本的情况。

积极参与您使用的所有开源项目是不合理或不可行的,因此需要一定程度的优先级来确定最关键的组件。不同级别的参与范围从加入邮件列表和参与技术讨论,到贡献错误修复和小功能,再到做出重大贡献。至少,对于从事特定开源项目的公司开发人员来说,订阅和监控与安全漏洞和可用修复相关的报告的邮件列表是有益的。

9.6.9 衡量您的合规工作

对于各种规模的组织来说,最简单、最有效的第一步是参与 OpenChain 项目(前面提到过)并获得“OpenChain Conformant”状态。这是通过在线或手动填写一系列问题来完成的。

用于 OpenChain 一致性的问题有助于确认组织已经创建了开源软件合规性流程或政策。 OpenChain 是一个行业标准,类似于 ISO 9001。它专注于“大局”,为每个组织提供精确的流程和政策实施。

OpenChain Conformance 表明存在开源合规流程或政策,并且可以在供应商或客户要求时共享更多详细信息。 OpenChain 旨在在全球供应链中的组织之间建立信任。

9.6.10 结论

开源尽职调查通常是并购交易中需要成功完成的一长串任务中的一项。 然而,鉴于软件和潜在知识产权风险的核心作用,它仍然是一般尽职调查工作的一个重要方面。

尽管开源尽职调查似乎是一个漫长的过程,但它通常可以很快完成,特别是如果双方都做好了准备,并与快速的合规服务提供商合作。

9.6.11 你如何做好准备?

如果你是目标,你可以通过确保你的开发和业务流程包括:

如果你是收购方,你应该知道要寻找什么,并具备快速解决问题的技能:

开源遵从性是一个持续的过程。维护良好的开源遵从实践使公司能够准备好任何软件转手的场景,从可能的收购、销售或产品或服务发布。出于这个原因,我们强烈鼓励公司投资构建和改进他们的开源遵从性程序。