软件发布前 扫描OSS(OSS系列 002)
ScanCode 扫描项目的教程
一、ScanCode 工具简介
ScanCode 是一款强大的开源工具,主要用于扫描软件项目源代码,以识别其中的依赖、许可证信息以及版权声明等重要元数据。它通过静态分析方式检查项目中引入的所有库和组件,能解析超 40 种不同文件格式,包括常见编程语言、配置文件以及包管理系统(如 npm、Maven、Gradle 等)的元数据文件,进而深入挖掘代码库的依赖结构。同时,ScanCode 的许可证数据库持续更新,确保对最新许可协议的识别准确性。其支持多线程并发处理,在大规模项目上也能快速运行,并且提供多种输出格式,如 JSON、CSV、Markdown 等,,ScanCode 还支持生成 HTML 格式报告,方便用户直观查看扫描结果以及还具备 API 接口,方便嵌入其他自动化流程。
二、准备工作
(一)安装 ScanCode
- Linux 系统:以 Debian/Ubuntu 系统为例,在终端执行命令sudo apt-get install scancode-toolkit即可完成安装。
- Mac 系统:可直接到 GitHub 上下载,项目地址为https://github.com/nexB/scancode-toolkit 。下载完成后,打开终端,cd到 scancode 目录下,首次执行./scancode -h,此时工具会去初始化一些配置。
- Windows 系统:同样从 GitHub 下载对应安装包,按照安装向导提示完成安装。安装完成后,可在命令提示符中输入scancode -h验证是否安装成功。
(二)准备待扫描项目代码
在网上找一个简单的项目代码,我这边主要是 C/C++以及C#的。
三、使用 ScanCode 进行扫描
(一)基本扫描命令
在终端中,进入待扫描项目的根目录my_cpp_project。执行以下命令,以获取项目中开源组件的许可证和版权信息,并将结果以 HTML 格式输出到scan_results.html文件中:
scancode --license --copyright --html scan_results.html.
其中,--license表示扫描许可证信息,--copyright表示扫描版权信息,--html指定输出格式为 HTML,最后的.表示对当前目录及其子目录进行扫描。ScanCode 会扫描项目代码以及通过FetchContent引入的fmt库,识别其中的开源组件信息,并生成详细的 HTML 报告。
(二)更多扫描选项结合 HTML 输出
- 提高许可证匹配精度:如果希望提高许可证匹配的准确性,可以设置--license-score选项。例如,将其设置为50(取值范围 0 - 100,默认 0,值越高匹配越精确),同时生成 HTML 报告:
scancode --license --license-score 50 --copyright --html scan_results.html. - 使用多进程加速扫描:对于大型项目,可以使用-n选项指定并行进程数来加快扫描速度,并生成 HTML 报告。比如使用 4 个并行进程:
scancode --license --copyright -n 4 --html scan_results.html. - 设置扫描超时:使用--timeout选项可以跳过扫描时间过长的文件,配合 HTML 输出格式。例如,设置超时时间为 10 秒:
scancode --license --copyright --timeout 10 --html scan_results.html. - 忽略特定文件或目录:若要忽略某些文件或目录,可使用--ignore选项。比如忽略项目中的src目录下所有.cpp文件,同时生成 HTML 报告:
scancode --license --copyright --ignore "src/*.cpp" --html scan_results.html.
四、查看与记录 HTML 格式扫描结果
(一)查看 HTML 报告
扫描完成后,生成的scan_results.html文件可直接使用浏览器打开。在 HTML 报告中,会以表格、列表等形式直观展示项目中各个文件的详细信息,包括文件名、路径、识别出的开源组件、对应的许可证类型、版权声明等内容。例如,报告中会清晰显示fmt库及其对应的 MIT 许可证信息。
(二)记录扫描结果
我们需要对 HTML 报告中的信息进行整理和记录,以便后续查看和分析。可以创建一个专门的文档,记录以下内容:
- 扫描时间:记录本次扫描执行的具体时间,方便后续对比不同时间的扫描结果,查看开源组件是否有更新或变化。
- 扫描命令:详细记录使用的扫描命令及所有选项,这样在需要重复扫描或调整扫描策略时,能够准确复用之前的设置。
- 扫描结果概述:对 HTML 报告中的关键信息进行总结,例如识别出的开源组件数量、涉及的许可证类型及数量等。比如,本次扫描识别出 1 个开源组件fmt库(许可证为 MIT)。
五、总结与分析
- 合规性检查:根据 HTML 报告记录的扫描结果,对照项目的使用场景和分发计划,检查是否符合开源组件许可证的要求。如上述 C++ 项目,如果计划将软件闭源分发,由于fmt库使用的是 MIT 许可证,允许在闭源项目中使用,所以在许可证合规性上没有问题。但如果后续引入其他许可证的组件,就需要重新评估或更换组件。
- 安全性评估:结合国家信息安全漏洞共享平台(CNVD)、美国国家漏洞数据库(NVD)等权威漏洞数据库,根据 HTML 报告中识别出的开源组件名称和版本号,查询是否存在已知安全漏洞。若发现fmt库存在漏洞,及时参考开源项目官方提供的补丁或解决方案,评估是否需要升级组件版本或采取其他安全措施。
- 持续跟踪:建立定期使用 ScanCode 扫描项目并生成 HTML 报告的机制,如每月或每季度扫描一次。持续跟踪开源组件的更新情况,及时获取功能改进和安全修复,同时确保项目始终符合开源许可证的合规要求。每次扫描后,对比之前的记录,关注开源组件的变化,及时调整项目策略。

浙公网安备 33010602011771号