🌟 在「DevSecOps 软件安全开发实践」课程上,极狐(GitLab) 专业服务交付经理居文峰、极狐(GitLab) 前端工程师万里欣,分享了许可证扫描的原理、配置及应用,并演示了极狐 GitLab 许可证扫描功能,帮助大家安全使用开源软件。
以下内容整理自本次直播,Enjoy~
应用开源软件已经成为软件行业的重大趋势。开源软件为企业和开发者提供了巨大便利,促进了创新与协作。但如果忽视开源软件许可证及其权利义务与限制,很可能会面临法律纠纷、安全隐患以及高昂的依赖管理成本。
开源软件许可证(Open Source Software License)是一种法律许可,是开源软件供应商用于授权软件使用者使用、修改和发布其开源软件的协议。其目的是规范软件(受著作权保护的软件)使用或者分发行为。
世界上有上百种开源许可证,目前主流的有 6 种:
而许可证由其宽松程度,可分为:
从上述概念可以看出,Apache、MIT、BSD 属于宽松式许可证(Permissive License),如下图左侧;GPL 、LGPL、MPL 属于 Copyleft 许可证,如下图右侧。我们需要根据软件属性与商业模式选择恰当的许可证,在开源理念与商业需求间取得平衡。
开源软件许可证如此之多,不同许可证之间存在较大差异,许可证错误使用的事件时有发生,可能给企业带来法律、运营、安全与采购等领域的重大风险与损失。
根据 Synopsys 发布的《2023 年开源安全与风险分析报告》显示:54% 的代码库存在许可证冲突;31% 的代码库包含没有许可证或使用定制许可证的开源代码。
开源软件应用风险突出,开源许可证扫描成为企业推动开源管理与风险控制的重要手段之一。
许可证扫描(License Scanning)是指对软件、代码库或系统进行许可证冲突检查的过程。它通过自动扫描软件的依赖与组件,检测其许可证之间是否存在不兼容或冲突的问题。
开源许可证扫描作为帮助企业安全采用开源关键技术,其重要性与必要性是显而易见的。因此越来越多的软件企业关注并实施开源许可证扫描,常见方式有:
相比上述方式,极狐 GitLab 的开源许可证扫描具有明显优势:
图:极狐 GitLab 许可证扫描支持多种语言和包管理器
极狐 GitLab 许可证扫描的前提条件是:
在流水线中启用许可证扫描(将在下文中详解):
include:
- template: License-Scanning.gitlab-ci.yml
MR 审核者十分关心:在 MR 合并审批请求过程当中,当前新源头分支引入了哪些新的许可证?
这个问题通过「License-Check」来查看。
在极狐 GitLab 15.9 之前版本,通过「项目 → 设置 → 合并请求 → 合并请求批准,启用 License - Check」启用检查,如下图:
具体放行和拒绝哪些许可证,则在「安全与合规 → 许可证合规性」中设置策略,如下图。
极狐 GitLab 15.9 以及之后的版本,通过「项目 → 安全与合规 → 策略 → 新建策略 → 选择 扫描结果策略」设置:
极狐 GitLab 15.9 以及之后的版本,在创建策略后,会自动创建单独的项目存放策略文件(YAML),如下图子目录是 Security policy project,用户可以通过代码方式直接去编写 YAML 文件,实现快速扫描策略编写。
与查看其他安全扫描一样,通过「安全与合规 → 许可证合规」,查看最新的合规情况:当前项目用了哪些开源组件,以及它所遵循的协议;还可以看到每个组件当前是拒绝,还是遵循了策略等。
只要开启了许可证扫描,就可以看到 License - Check 信息。
如下图,在本次 MR 合并之前,在原分支扫描显示新引入许可证分类,如已拒绝、已通过等提示信息来帮助审核者来判断本次合并是否批准。
如下图,在流水线页面,也可以查看完整许可证详细信息。
上文提到,应用两行代码即可启用许可证扫描:
include:
- template: License-Scanning.gitlab-ci.yml
下图就是 YAML 文件的庐山真面目,包含了两个部分:
其中,极狐 GitLab 自动预定义了 3 个变量:
许可证扫描的常用变量如下表。也可以访问极狐GitLab 文档中心查看。
license_scanning job 用于执行开源许可证扫描,调用极狐 GitLab 内置的 license-scanning 工具对仓库代码进行扫描,检测项目开源依赖与许可证信息。
如下图,license_scanning job 支持的主要字段如下:
license-finder 是一个帮助扫描项目中所使用的开源软件许可证信息的工具。运行 license-finder 时,它会扫描项目中的依赖项,并尝试查找每个依赖项的许可证信息,详情查看极狐GitLab 许可证查找器。
以极狐 GitLab 前端用 NPM 管理的项目为例:
那么, license-finder 怎么查找许可证?
1. 包管理器的配置文件,如 package.json,可以用 license 字段声明当前库的许可证:
2. 依赖项的源代码中的许可证声明,如许可证文件或代码中的许可证注释:
在 license_scanning job 里,指定保留 gl-license-scanning-report.json 文件。
用户可以在 pipeline 页面的 “Artifacts” 选项卡中下载该报告文件。下载的 json 文件如下所示,dependencies 具体列出所有检出的开源依赖,包括名称、版本、许可证类型等信息。
开源软件是软件企业持续依赖与运用的重要资源。开源许可证扫描必不可少,其广泛应用也将成为企业开源管理的标配与常态。