什么是代码扫描?
代码扫描使用 CodeQL 来分析 GitHub 存储库中的代码,以查找安全漏洞和编码错误。 代码扫描适用于所有公共存储库,以及启用了 GitHub 高级安全的组织所拥有的专用存储库。 如果代码扫描在代码中发现潜在漏洞或错误,GitHub 会在存储库的“安全”选项卡中显示警报。修复触发警报的代码后,GitHub 会关闭警报。
可使用代码扫描来查找、会审和优先处理代码中现有问题的修复。 代码扫描还可防止开发人员引入新问题。 可以计划特定日期和时间的扫描,也可以在存储库中发生特定事件(例如推送)时触发扫描。
本单元介绍了 CodeQL、设置代码扫描的三个选项,以及如何将 CodeQL 工作流添加到存储库。
关于使用 CodeQL 进行代码扫描
CodeQL 是 GitHub 开发的代码分析引擎,用于自动执行安全检查。 可以使用 CodeQL 分析代码,将结果显示为代码扫描警报。 为代码扫描设置 CodeQL 分析主要有三种方法:
- 使用默认设置快速配置 CodeQL 分析,以便对存储库进行代码扫描。 默认设置将可用于选择要分析的语言、要运行的查询套件以及触发扫描的事件,并可选择手动配置语言和查询套件。 此设置选项将以 GitHub 操作的形式运行代码扫描。
- 使用高级设置将 CodeQL 工作流直接添加到存储库。 将 CodeQL 工作流直接添加到存储库中将会生成可自定义的工作流文件,该文件使用 github/codeql-action 来以 GitHub 操作的形式运行 CodeQL CLI。
- 直接在外部 CI 系统中运行 CodeQL CLI,并将结果上传到 GitHub。
CodeQL 将代码视为数据,使你可以使用比传统静态分析器更自信地找到代码中的潜在漏洞。 生成一个 CodeQL 数据库来表示代码库,然后对该数据库运行 CodeQL 查询以识别代码库中的问题。 结合使用 CodeQL 与代码扫描时,查询结果在 GitHub 中显示为代码扫描警报。
CodeQL 支持编译语言和解释语言,它可以发现以以下支持语言编写的代码中的漏洞和错误:
- C 或 C++
- C#(编程语言)
- 走吧
- Java/Kotlin
- JavaScript/TypeScript
- Python语言
- 红宝石
- 迅速
下一部分介绍如何将 CodeQL 工作流添加到存储库。 “使用第三方工具启用代码扫描”单元中介绍了如何使用外部工具设置 CodeQL。
使用默认设置在存储库中启用 CodeQL
如果对存储库具有写入权限,可以设置或配置该存储库的代码扫描。
按照以下步骤使用 CodeQL GitHub Actions 工作流设置代码扫描:
在 GitHub.com 上,导航到存储库的主页。
在存储库名称下,选择“安全性”。
选择“设置代码扫描”。 如果此选项不可用,请让组织所有者或存储库管理员启用 GitHub Advanced Security。
在“设置”下拉列表中,选择“默认”。
查看默认选项。 如果需要,请选择新窗口左下角的“编辑”按钮以自定义 CodeQL 的运行方式。
on:pull_request
和on:push
触发器是代码扫描的默认触发器,二者具有不同的用途。 “配置代码扫描”单元中详细介绍了这些触发器。准备好启用代码扫描后,选择“启用 CodeQL”。
在默认的 CodeQL 分析工作流中,代码扫描将配置为在你每次将更改推送到任何受保护分支或针对默认分支提出拉取请求时分析代码。 推送后,代码扫描会自动运行。
在上一个部分,我们在前面使用默认设置启用了代码扫描,这将以 GitHub 操作的形式运行代码扫描,而无需维护工作流文件。 另一个选项是“高级设置”,这将生成可以为实现高级配置和更多步骤而进行编辑的默认工作流文件。 我们将在后面的单元中介绍如何使用高级设置来配置代码扫描。
使用 GitHub Actions 运行代码扫描将会影响每月计费分钟数。 如果想要在帐户中包含的存储空间或分钟数之外使用 GitHub Actions,则需要额外付费。
关于 Actions 计费
代码扫描将使用 GitHub Actions,而且每次运行代码扫描工作流都会消耗 GitHub Actions 的分钟数。 GitHub Actions 的使用对公共存储库和自承载运行程序免费。 对于专用存储库,每个 GitHub 帐户都会收到一定数量的免费分钟数和存储空间,具体取决于该帐户使用的产品。 支出限额控制超出所包含金额的任何使用量。 如果您是按月计费的客户,则您的账户的默认支出限额为零美元 (USD),这可以防止超出账户中包含的金额的私有存储库的分钟数或存储空间。 如果按发票支付帐户费用,则帐户将具有无限制的默认支出限制。 分钟数每月重置一次,而存储空间使用量不会重置。