🌟 近日,在「DevSecOps 软件平安开发实际」课程上,极狐(GitLab) 业余服务交付经理居文峰、极狐(GitLab) 前端工程师万里欣,分享了许可证扫描的原理、配置及利用,并演示了极狐 GitLab 许可证扫描性能,帮忙大家平安应用开源软件。
以下内容整顿自本次直播,Enjoy~
利用开源软件曾经成为软件行业的重大趋势。开源软件为企业和开发者提供了微小便当,促成了翻新与合作。但如果漠视开源软件许可证及其权利义务与限度,很可能会面临法律纠纷、安全隐患以及昂扬的依赖治理老本。
开源许可证及其常见类型
开源软件许可证(Open Source Software License)是一种法律许可,是开源软件供应商用于 受权软件使用者应用、批改和公布其开源软件的协定。其目标是标准软件(受著作权爱护的软件)应用或者散发行为。
世界上有上百种开源许可证,目前支流的有 6 种:
- Apache:公布于 Apache 软件基金会。此许可证容许商业应用,不强制要求源代码凋谢,是目前应用最广的开源软件许可证之一。
- MIT:极其宽松的许可证,容许商业应用和私有化批改后的代码。MIT 许可证要求保留版权信息,但不强制开源批改后的代码。案例我的项目有 GitLab CE、Ruby、JQuery、Rails、Vue、React 等。
- GPL:GNU 通用公共许可协定(GNU General Public License),是自由软件基金会公布的许可证。GPL 要求应用软件的批改版本必须采纳同样的 GPL 协定公布,即 如果我的项目蕴含了 GPL 许可证的代码,那么整个我的项目都必须应用 GPL 许可证。
- BSD:宽松的开源许可证,容许商业应用和批改私有化。与 MIT 许可证的次要区别是 不要求保留版权信息。案例我的项目有 Curl 等。
- LGPL:Lesser General Public License,是 GPL 的补充,区别在 LGPL 只要求批改的开源组件开源,而不要求整个衍生软件开源。
- MPL:Mozilla Public License,公布于 Mozilla 基金会。MPL 要求批改版本必须以 MPL 许可证开源公布,但能够用于商业利用。
而许可证由其宽松水平,可分为:
- Copyleft 许可证:使开源软件及其衍生版本的开源属性代代相传。它强制要求软件必须继续开源,以确保开发者与用户的权力失去最大范畴内的保障,实现开源精力的连续。
- 宽松式许可证:也称为非 Copyleft 许可证,对软件再公布和衍生产品的许可证抉择要求更加宽松,容许软件商业应用与闭源,提供更大灵活性与选择性。
从上述概念能够看出,Apache、MIT、BSD 属于宽松式许可证(Permissive License),如下图左侧;GPL、LGPL、MPL 属于 Copyleft 许可证,如下图右侧。咱们须要 依据软件属性与商业模式抉择失当的许可证,在开源理念与商业需要间获得均衡。
开源许可证扫描是软件研发过程中,不可或缺的工具
开源软件许可证如此之多,不同许可证之间存在较大差别,许可证谬误应用的事件时有发生,可能给企业带来法律、经营、平安与洽购等畛域的重大危险与损失。
依据 Synopsys 公布的《2023 年开源平安与危险剖析报告》显示:54% 的代码库存在许可证抵触;31% 的代码库蕴含没有许可证或应用定制许可证的开源代码。
开源软件应用危险突出,开源许可证扫描成为企业推动开源治理与危险管制的重要伎俩之一。
许可证扫描(License Scanning)是指对软件、代码库或零碎进行 许可证抵触查看 的过程。它通过主动扫描软件的依赖与组件,检测其许可证之间是否存在不兼容或抵触的问题。
开源许可证扫描作为帮忙企业平安采纳开源关键技术,其重要性与必要性是不言而喻的。因而越来越多的软件企业关注并施行开源许可证扫描,常见形式有:
- 集成第三方扫描工具。在代码 Push、Build 等时触发扫描。这须要购买第三方工具许可与保护老本,集成过程比较复杂。
- 定期人工扫描。开发团队定期剖析代码与依赖,手工辨认开源组件与许可证,更新许可证清单。这种形式效率低下,无奈笼罩全副依赖,难以继续进行。
- CI 流程集成。在继续集成流程中减少开源许可证扫描步骤,在每次构建时运行扫描工具,生成报告。这须要抉择与 CI/CD 工具兼容的扫描工具,也减少了配置与保护难度。
- 减少治理流程。制订开源许可证治理流程,在组件引入、版本升级等环节进行审核,要求提供相应的许可证清单与合规性证实。其毛病是大量减少了开发与治理老本,施行难度也较大。
极狐 GitLab 开源许可证扫描的劣势与利用
相比上述形式,极狐 GitLab 的开源许可证扫描具备显著劣势:
- 原生集成。极狐 GitLab 内置开源许可证扫描性能,深度集成在极狐 GitLab CI/CD 流程中,无需集成第三方工具,即可应用,配置简略,无额定保护老本。
- 高度自动化。极狐 GitLab 会主动实时监测开源依赖变动,并触发扫描,每一次代码提交若产生新的许可证都有记录,可逆追踪。
- 简略易用。极狐 GitLab 扫描后果以扼要形式展现,并提供修复倡议,升高开源治理的应用门槛;并反对多种语言和包管理器,不便开发者参加。
- 灵便自定义。极狐 GitLab 反对自定义许可证与扫描规定,能够齐全匹配企业的开源治理要求。同时也提供丰盛的预置规定,笼罩支流开源许可证。
- 继续优化。极狐 GitLab 会持续裁减许可证库,加强扫描准确性,并联合用户反馈继续欠缺与优化扫描性能,确保我的项目合乎法规要求和企业政策、审计政策等。
图:极狐 GitLab 许可证扫描反对多种语言和包管理器
Step 1:启用及设置许可证策略
极狐 GitLab 许可证扫描的前提条件是:
- 具备 Docker 或 Kubernetes 执行器的 Runner;
- Docker Engine 版本高于 18.09.03。
在流水线中启用许可证扫描(将在下文中详解):
include:
- template: License-Scanning.gitlab-ci.yml
MR 审核者十分关心:在 MR 合并审批申请过程当中,以后新源头分支引入了哪些新的许可证?
这个问题通过「License-Check」来查看。
在极狐 GitLab 15.9 之前版本,通过「我的项目 → 设置 → 合并申请 → 合并申请批准,启用 License – Check」启用查看,如下图:
具体放行和回绝哪些许可证,则在「平安与合规 → 许可证合规性」中设置策略,如下图。
极狐 GitLab 15.9 以及之后的版本,通过「我的项目 → 平安与合规 → 策略 → 新建策略 → 抉择 扫描后果策略」设置:
Step 2:主动创立策略文件寄存我的项目
极狐 GitLab 15.9 以及之后的版本,在创立策略后,会主动创立独自的我的项目寄存策略文件(YAML),如下图子目录是 Security policy project,用户能够通过代码形式间接去编写 YAML 文件,实现疾速扫描策略编写。
Step 3:查看许可证合规状况
与查看其余平安扫描一样,通过「平安与合规 → 许可证合规」,查看最新的合规状况:以后我的项目用了哪些开源组件,以及它所遵循的协定;还能够看到每个组件以后是回绝,还是遵循了策略等。
Step 4:查看 MR 审批后果
只有开启了许可证扫描,就能够看到 License – Check 信息。
如下图,在本次 MR 合并之前,在原分支扫描显示新引入许可证分类,如已回绝、已通过等提示信息来帮忙审核者来判断本次合并是否批准。
如下图,在流水线页面,也能够查看残缺许可证详细信息。
YAML、license-finder、报告文件解析
YAML
上文提到,利用两行代码即可启用许可证扫描:
include:
- template: License-Scanning.gitlab-ci.yml
下图就是 YAML 文件的庐山真面目,蕴含了两个局部:
- variables:定义变量,用于在 job 中援用;
- license_scanning:定义许可证扫描 job。
变量
其中,极狐 GitLab 主动预约义了 3 个变量:
- SECURE_ANALYZERS_PREFIX:定义平安剖析工具的前缀,用于从极狐 GitLab Container Registry 中拉取正确的镜像;
- LICENSE_MANAGEMENT_SETUP_CMD:定义许可证扫描工具的装置命令;
- LICENSE_MANAGEMENT_VERSION:定义许可证扫描工具的版本。目前最新版本为“4”。
许可证扫描的罕用变量如下表。也能够拜访极狐 GitLab 文档核心查看。
license_scanning
license_scanning job 用于执行开源许可证扫描,调用极狐 GitLab 内置的 license-scanning 工具对仓库代码进行扫描,检测我的项目开源依赖与许可证信息。
如下图,license_scanning job 反对的次要字段如下:
- image:定义扫描所应用的镜像;
- variables:定义扫描所需的变量,比方报告存储门路与可见性等;
- script:执行扫描命令;
- artifacts: 定义扫描后果存档配置;
- rules:定义扫描规定。
license-finder
license-finder 是一个帮忙扫描我的项目中所应用的开源软件许可证信息的工具。运行 license-finder 时,它会扫描我的项目中的依赖项,并尝试查找每个依赖项的许可证信息,详情查看极狐 GitLab 许可证查找器。
以极狐 GitLab 前端用 NPM 治理的我的项目为例:
- 初始化:NPM install 装置相干依赖;
-
扫描:
- 自动检测到我的项目中的 package.json 文件;
- 解析内容,找到 dependencies 以获取依赖项信息;
- 递归查看每个依赖项及其子依赖项,获取它们的许可证信息。
- 后果报告:收集扫描到的后果到报告里。
那么,license-finder 怎么查找许可证?
1. 包管理器的配置文件,如 package.json,能够用 license 字段申明以后库的许可证:
2. 依赖项的源代码中的许可证申明,如许可证文件或代码中的许可证正文:
报告文件
在 license_scanning job 里,指定保留 gl-license-scanning-report.json 文件。
用户能够在 pipeline 页面的“Artifacts”选项卡中下载该报告文件。下载的 json 文件如下所示,dependencies 具体列出所有检出的开源依赖,包含名称、版本、许可证类型等信息。
开源软件是软件企业继续依赖与使用的重要资源。开源许可证扫描必不可少,其广泛应用也将成为企业开源治理的标配与常态。