作者简介:项曙明,中兴通讯开源合规&安全治理总监、ECPOC,在开源许可证合规、EAR合规、开源安全管控和风险应对等领域具有丰富的实践经验。
经常参加国内各种开源社区的分享、标准和其它活动时听到,也在各种开源社区群、微信群中看到这样的一些声音和观点:“开源治理”治理的是什么?我用开源软件还没有用好、我有项目要贡献到开源社区、我只是进行开源贡献,为什么要说治理呢?近期接到网安加社区的这篇约稿,我就从我对开源软件理解的角度来浅谈一下我对开源治理的一些看法,希望能给产业界和开源界的同仁们带来一些思考与启发。
一、开源软件生态演变及存在风险
所谓软件,就是一系列按照特定顺序组织的计算机数据和指令的集合,其最终的存在价值在于实现计算机用户和计算机本身之间的沟通桥梁,做到帮助用户实现对于计算机的良好控制。随着信息时代的不断发展,信息化水平的不断深入,人们对于计算机和网络的依赖性也随之增加,这也同样推动着软件事业的向前发展。而在这种发展潮流之下,开源软件起到了推波助澜的决定性作用,也焕发出越来越强劲的生命力。
所谓开源软件(OSS,Open Source Software),通常的定义为一种其源码可以被公众使用的软件,并且此软件的使用、修改和分发也不受许可证的限制。开源软件最早出现于20世纪70年代,至今已经经历了数十年的发展历程,其在操作系统、编译工具链、数据库、服务器以及移动端等方面都有杰出的作品产生,已经成为了当前一股不容忽视的力量,并渗透到了当前社会生活和工作的各个领域,特别是完全改变了软件的生产模式,由传统的闭源开发模式逐步演变为混源的软件组装式开发模式,开源软件及其衍生组件在当代软件代码中的占比达到了90%左右,从不同的侧面和角度影响着人们的日常生活。
开源软件最早的思想起源于黑客文化,1984年,美国国家工程院院士Richard Stallman建立起操作系统GNU(GNU’s Not Unix),标志着基于“自由软件”思想的操作系统落成。GNU的诞生,揭开了开源运动的序幕,并且通过GPL协议来保障其能够永久地实现免费共享和自由的使用、修改与分发。1985年10月,Richard Stallman成立了自由软件基金会FSF(Free Software Foundation),主要目的是为开发GNU募集资金。1989年,Stallman带头起草了GNU通用公共协议证书,明确提出了“反版权”思想。1991年,芬兰大学生Linus Torvalds基于GNU GPL框架了GNU/Linux,标志着Linux的诞生。至此,开源软件的发展得到了更多人的支持,并且逐步走向正轨。
随后开源软件的发展起起落落,从高潮到低谷,但是从2005年开始新一轮的开源软件研发又开始继续发展,并且在这个阶段由于网络的发展呈现出又一个峰值,移动数据传输也在这个时间登上了历史舞台,各种新技术方面的开源软件不断涌现,许多开源项目也逐步由个人发起的黑客文化逐步向有组织先期开发,研发到一定程度再贡献到开源社区,并期待该开源项目能够成功、形成自己特有的商业生态的商业模式进行演变,开源组织(公司)、开源贡献个人都期待在开源的商业模式下获得成功。
开源软件的成功又刺激了各行各业的软件企业、创业公司更广泛的使用开源软件,这可以有效地降低开发成本、加快开发进度、促使产品快速上市,帮助企业获得了一个又一个的成功。在广泛被使用的过程中某些开源软件也逐渐演变成为各种各样的事实标准,并成为某些商业项目招标的门槛,从而促进其被更广泛地使用。随着数字化转型和云原生技术的蓬勃发展,开源软件也彻底改变了软件行业生态和开发模式,并逐渐演变为一种实实在在的商业模式,也彻底改变了整个软件生态和竞争模式。
开源软件在为人们带来各种实实在在好处的同时,其本身所固有的各种风险也暴露了出来,并严重影响企业正常的经营活动,影响到广大个人消费者的正当权益和使用软件产品的信心,危及到整个软件行业的良性发展。简单来说,开源软件存在的风险主要有以下几种:
1、许可证合规使用风险
我们知道,开源软件虽然实现了免费共享和自由使用、修改与分发,但是其代码版权从来没有放弃,它永远属于开源代码的贡献者。而且每一个开源软件在其分发的过程中均会遵循一种或多种许可证,这些许可证的法条在赋予使用者免费自由使用开源软件的同时也明确规定了其必须遵循的义务;所以在不同的使用场景下,如果违反了许可证义务将会导致许可证合规使用风险。
2、产品安全风险
开源软件数量众多,但是大家有没有发现,开源软件一般都规定了软件使用者“责任自负”,也就是许可证均不会强制自由软件发布者给予使用者担保,不承担适售性、满足特定使用目的、知识产权等任何担保。所以开源软件功能、性能和产品安全质量也是不担保的,而开源软件的代码质量、分发后出现的CVE漏洞,甚至开源软件依赖的其它开源软件的漏洞、使用了开源软件的第三方软件的安全这些均需要使用开源软件的项目自己来承担。
3、EAR和可信供应链风险
开源软件作为公开可获得软件中的一种,在满足一定条件下是受EAR管辖的,如何消除EAR的风险,使企业能够EAR合规地使用相关开源软件。另外,这些开源软件出现漏洞后能否及时获得消除漏洞后的可用版本、不能及时获得消除漏洞版本的时候能否顺利的获取源码进行自我修复漏洞、能否顺利获得最新的开源社区版本等供应链方面的风险也同样存在。这些漏洞若不能及时消除,可能会影响软件版本的正常运行,受到黑客攻击导致各种数据泄露,特别是个人数据泄露而引起违规而受到处罚。还有如出现的某些开源社区针对某些国家受限的问题、美国的开源漏洞不及时公开的问题等均属于该范畴。
说到这里,我们就来说说开源治理问题,为什么有开源治理、为什么要开源治理,我不治理又怎么了?
大家参与软件项目都带着一个目的,那就是希望项目能成功!不论是开源项目还是商业项目其成功的定义稍有差异,但是最终的结果是一样的,希望自己的项目能被广泛使用、最终借助该项目组织和个人能够获得相应的商业回报。那么问题来了,什么样的软件项目才能够获得成功呢?撇开项目本身,我认为一个项目要成功必须被广泛使用,大家愿意用,并借助你这个软件来增加自己项目成功的概率,这时候你项目的用户关注的是:
(1)该软件遵循什么许可证?是商业许可、OSI许可,还是其它不太常用的许可证?其许可证风险怎样?我是否可以有效地、低成本地合规使用?
(2)该软件产品质量如何,研发过程中有没有有效地合规和安全管控机制,产品分发后能否及时通报漏洞信息,快速分发补丁版本,有效降低或消除我们使用的安全风险?
(3)该软件的可获得性如何?版本有没有连续性,是否会出现后续版本无人守护或者难以获得的窘境?
(4)开源社区项目非常多,我该如何找到这样的项目?它的合规性、安全性有所保障或者能够非常容易的进行治理。
(5)我知道我想要寻找怎样的软件组件了,那么我们自己项目分发的软件能获得广大客户的认同吗?我该怎么做?
所以这时候就出现了软件治理的问题,它涉及开源选型、合规使用、安全治理、合规分发和运维时的安全应对,只有把这些风险有效的降低和消除,才能提升自己项目被选择的机会,最终取得成功。所以我认为开源治理是现代软件项目与生俱来的一门功课,无论怎样的项目、无论你如何参与项目、不同的只是治理的目标、内容和范围有所不同而已。当然,个人自己学习研究或企业内部自用而不求广泛分发的项目也就不存在上述项目成功的纠结,不在讨论范围之内。
二、软件开发及分发模式演变
软件开发及分发模式的演变丰富了开源治理的内涵,也逐步增加了开源治理的难度和广度,所以在谈论开源治理之前有必要简单陈述一下,以便于后面更好理解开源治理。
云原生时代软件供应链技术跃迁式演变,对软件研发模式和分发内容产生了巨大变更,主要变现体现在:
1、软件成分的变化,也即新制品
以前的软件开发是一个团队、一个项目组进行闭源开发,代码基本全是项目组自己写的,所以其制品只有一个版本号就能完整地标识出其版权归属,项目团队对该项目制品全权负责。
全球开源应用契合自动化开发模式,开源因为其便利性成为了当前软件开发中不可或缺的组成部分,混源的组装式开发已成为主流。代码中除了有项目组自研的代码以外,还会有本公司其它团队开发的代码——如平台或组件,以及其它商业软件、技术协作软件、外包软件、ODM/OEM软件、SDK驱动等第三方软件;当然还会有项目组主动引入的开源软件,这时候的软件成分就开始变得复杂了,也不是项目组能够全部掌握和守护的了,这时候SBOM就显得尤为重要,它关乎着新制品的组成、合规和安全,如下图所示:
再后来,我们发现上述混源开发中使用到的软件组件,其在开发过程中基本上全部都使用到了开源软件,也就是上述SBOM若从版本树的角度出发一直追踪到“叶子”节点,我们就会发现,绝大多数“叶子”均是开源,据可靠数据统计,目前软件项目平均使用到开源软件在整个项目代码中的占比达90%左右,所以说开源软件逐渐主导了当代软件。
2、开发过程的演变,导致版本发布方式出现新变化,也即新发布
软件研发过程也从需求、设计、开发、测试到分发的瀑布模型,逐步演变至互联网时代的敏捷开发,强调的是快速迭代的价值交付,再逐步演进到云原生时代的DevOps,要求进行快速的研发到运维,在这样快速演变的过程中,分发的对象也逐步从单一的可执行制品到运维环境的统一发布,在此过程中,如何确保分发物的合规和安全性。
3、数字化应用架构演变,导致软件新技术层出不穷
数字化应用架构的演变,新技术的引入,应用架构从单体应用逐步到SOA,并逐步演进到微服务,软件分发物就是一组微服务,如何确保这些微服务能够有效地进行合规和安全治理给我们提出了新的课题。
4、数字化基础设施的演进,为软件开发提供了新环境
云原生技术的发展,夯实了数字底座,简化了部署环境,基础设施逐步从IDC物理机向虚拟化、容器化方向演变,与此相对应的基础设施,项目组相应的分发物、分发方式也随之改变,如容器分发除了原来传统的软件版本以外,还需要一起分发的基础镜像和一组运行依赖,这些基础镜像和运行依赖的合规安全性问题也就成为新的开源治理对象之一了。
三、为何需要开源治理
前面说了,若软件项目没有商业分发、商业成功这方面的诉求,完全是可以不需要做任何的开源治理的。但偏偏绝大多数的软件项目都有商业成功方面的压力,既然需要成功,就要求我们的软件项目遵从外部法律法规、客户要求等约束,并能低成本、高效地完成项目的合规和安全治理,而项目使用到的开源软件的治理也就显得尤为重要。
(一)软件商业分发
既然一般软件使用到的开源软件占比达到整个项目代码量的90%左右,而企业进行商业分发的目的是要满足客户的商业要求,并使客户在使用该商业软件过程中不会出现由于合规和安全问题而导致客户商业利益受损。为客户创造价值,从而也为自己获得更多成功的机会。所以商业软件的开源治理,可以使客户放心使用你的产品,以防出现:
1、由于没有有效开源治理,导致商业诉讼,而使客户购买的商业软件停服或不能获得版本更新的风险。
2、由于没有有效开源治理,导致不能及时发现漏洞、及时修复漏洞发布修复版本,而使客户面临被攻击、系统瘫痪不能正常运行、漏洞导致个人信息数据泄露面临巨额罚款的风险。
(二)开源生态建设和开源贡献
商业软件的分发是传统软件商业模式,由于使用到了开源软件,其商业模式也需要做相应调整。除此以外,现在还有很多企业和个人热衷于项目开源和贡献,构建开源生态建设。前面说到,开源是一种商业模式,所以开源生态建设和开源贡献最终也需要其开源项目获得成功,其商业模式才能够得以变现。
那么如何使开源项目获得成功的概率增加呢?如果不进行开源治理会有哪些影响?
1、若不进行开源治理,开源项目可能会导致许可证冲突、许可证合规治理困难、导致在最终用户的开源选型中落选,不能被广泛使用也就难以获得成功。
2、若不进行开源治理,开源项目可能都不知道使用了哪些开源软件、这些开源软件是如何使用的,从而增加最终用户开源合规治理的难度。
3、若不进行开源治理,开源项目就不能及时了解和发现所使用到的开源软件的漏洞信息,不能及时更新安全版本,也会影响到开源选型的成功率而影响项目成功。
(三)提升研发效能
企业一般会有很多商业分发的项目,也会有一些项目开源,既然已经知道这些项目若想成功就必须进行开源治理。那么如何进行开源治理,才能提升开源治理研发效能?进而提升企业的投入产出,更好地实现商业目标?从这一点来讲,主动构建适合企业有效的开源合规和安全管控机制,提升组织开源治理能力,也是企业在开源生态环境下的最佳选择之一。
四、开源治理的类别
前面讲了开源软件生态的演变及存在的风险,也了解了在新制品、新发布、新技术和新环境下开源治理所要关注内容的变化、以及在当前开源生态已无法绕开的场景下,企业进行软件商业经营的过程中必须进行开源治理才有可能取得成功。那么一般来说,开源治理会涉及到哪些类别和内容呢?
通过分析,我们知道,企业与开源有关的活动主要有以下三条主线:
(一)软件的可信开发与运维
它是支撑企业进行软件商业化合规&安全治理生产的主流程。主要是构建企业的开源治理框架,主要内容包括:
1、选择可信开源:SCA工具、组件广场、开源选型、官网同源、供应商认证、第三方选型。
2、可信使用开源:同源构建、版本同源、合规和安全治理、安全左移。
3、可信产品分发:合规分发、安全分发。
4、可信产品运维:可信追溯、安全应对。
(二)可信开源开发
企业进行项目开源和贡献时,为了提升开源项目的成功率而进行的可信开源社区、可信开源项目开发。其开源治理主要包括:以可信开源项目、社区标准为要求贡献可信开源项目和开源社区。提供可信开源项目和组件,提升开源项目的成功率。
(三)可信内源开发
它是企业进行开源治理过程中的必要补充,指的是为了支撑“可信开发与运维”和“可信开源开发”的开源治理而进行的可信内源开源治理,它主要包括开源项目孵化、企业使用开源项目守护、以及内源项目开发。其开源治理主要包括:
1、开源文化建设,以内源方式构建内部组件开发和交易机制。
2、内部孵化开源项目,为可信开源项目做好准备。
3、核心开源组件识别及可信商业化要求内源开源守护。
企业只有结合自身特点和商业模式,选择合适的开源治理类别和目标,一步一个脚印,从SCA扫描开始做起,逐步构建起支撑企业经营的全方位的开源治理管控架构和能力,它和企业软件处于什么阶段、企业大小无关。