Dev.to Security 🔐 Cybersecurity 👁 0

推送代码之后:怎么自动跑代码安全扫描

这篇讲怎么让分支上一有新提交,就自动做安全扫描。看完你可以让系统管理员先接入 AngusSecurity,再由仓库管理员打开 本仓自动安全扫描,并分清 git push、网页提交和合并拉取请求会不会触发扫描、结果在哪看。 配置分两层:系统管理员先为整个实例接入 AngusSecurity,仓库管理员再为单个仓库打开 本仓自动安全扫描。下文以仓库 xlliu/e2e-license-gate 为例对照,这个实例的系统集成已经开通,该仓库

推送代码之后:怎么自动跑代码安全扫描

这篇讲怎么让分支上一有新提交,就自动做安全扫描。看完你可以让系统管理员先接入 AngusSecurity,再由仓库管理员打开 本仓自动安全扫描,并分清 git push、网页提交和合并拉取请求会不会触发扫描、结果在哪看。

配置分两层:系统管理员先为整个实例接入 AngusSecurity,仓库管理员再为单个仓库打开 本仓自动安全扫描。下文以仓库 xlliu/e2e-license-gate 为例对照,这个实例的系统集成已经开通,该仓库的 本仓自动安全扫描 也已经打开。

集成已启用、仓库自动扫描已打开后,分支上有新提交就会发起扫描

1. 系统管理员:接入 AngusSecurity

这一步整个实例只需要做一次。入口是 管理 → 安全设置,地址是 https://git.anguskit.com/management?tab=security,页面标题是 AngusSecurity 集成。

安全设置:配置启用已启用,平台可达正常

以这个实例为例,页面上的状态是:

  • 配置启用:已启用。它对应部署配置里的 angus.git.external-security.enabled。
  • 平台可达:正常,表示 AngusGit 能连上 AngusSecurity。
  • 最近回调:1 小时前,也就是 AngusSecurity 最近一次回传扫描结果的时间。
  • 页面上还有 开通集成 和 轮换 Secret 两个按钮。开通集成会注册一个用来发送扫描任务的客户端,并保存密钥;轮换 Secret 会让旧密钥失效。集成已经启用时,不必再点它们。

如果部署配置还没打开,页面会提示先设置 angus.git.external-security.enabled=true,对应的环境变量名是 ANGUS_GIT_EXTERNAL_SECURITY_ENABLED。没有修改过服务地址时,页面说明里的默认地址是 http://127.0.0.1:1811。改完配置后要重启 AngusGit。

同一页下方是 租户安全策略默认值,新建的仓库会沿用这些设置。这个实例当前的默认值是:

  • 新仓库默认打开全部五项检测能力:代码安全、依赖/制品漏洞、密钥检查、许可证合规、代码质量。
  • 未通过时拒绝合并 是关闭的。
  • 漏洞门禁阈值 是 低危,许可证门禁 是 不兼容时拒绝。这里的门禁指达到条件就拦住合并的规则,具体配法见文末参考里的两篇门禁文章。
  • 定时扫描 是关闭的。关闭时页面不显示 Cron 输入框;打开之后,输入框旁会出现说明「使用 Quartz Cron,例如每天 02:00:0 0 2 * * ?」。Cron 是一种用几段字段描述执行时间的写法,Quartz Cron 共六段,第一段是秒。如果并不打算启用定时扫描,不要为了看输入框而打开开关并保存。

仓库自己的设置可以覆盖这些默认值。例如 e2e-license-gate 就把漏洞阈值改成了高危,并打开了拒绝合并。

2. 仓库管理员:打开本仓自动扫描

自动扫描需要每个仓库单独打开。进入 仓库设置 → 安全(地址带 ?tab=settings&section=security),这一节的标题是 安全,右侧的 仓安全详情 可以跳到仓库安全详情页。

仓库设置的安全节:本仓自动安全扫描开着

xlliu/e2e-license-gate 当前的开关如下:

开关 状态 作用
本仓自动安全扫描 开 总开关,见表后说明
代码安全 开 推送时检查源码里的安全问题,参与漏洞门禁
依赖/制品漏洞 关 推送时检查依赖里的已知漏洞,参与漏洞门禁
密钥检查 开 推送时检查代码里的密钥和凭证,参与漏洞门禁
许可证合规 开 识别依赖许可证,参与许可证门禁
代码质量 关 检查代码质量,不参与合并门禁
未通过时拒绝合并 开 检查没完成时等待,门禁没通过时拒绝合并

本仓自动安全扫描 是总开关,页面说明是「默认关闭。关闭后推送不再自动检查;手动检查和已启用的定时检查仍可用。」

自动扫描打开时,至少要保留一种检测能力,否则保存会被拦下,提示「已开启自动扫描时,请至少选择一种能力。」保存成功时提示「安全设置已保存」。修改这些设置需要 SecurityScans:EXECUTE 权限。如果页面上已经是想要的值,就不必再点 保存更改。

另外,仓库安全详情页顶部的能力标识只点亮了密钥检查和许可证合规,而设置页里代码安全的开关是打开的:两处读取的不是同一组字段,所以显示可能不一致。

3. 哪些操作会触发扫描

自动扫描监听的是「分支上有了新提交」这件事,命令行 git push 只是其中一种。在网页上修改文件并提交、在拉取请求页点击合并,同样会让分支上有新提交,从而把扫描任务发给 AngusSecurity。

操作 会不会扫描 说明
git push 推送分支 会 扫描这次推上来的最新提交
网页上编辑文件并提交 会 和命令行推送的处理方式相同
拉取请求页点合并 会 扫描目标分支上的新提交
只是新建一个拉取请求 不会为这个动作再扫一遍 已有扫描结论时直接挂上
默认 10 分钟内同一提交再次出现 不再发送 记一条跳过
仓库已归档 不会 归档仓库是只读的,推送不进去

表里有几行需要展开说明:

  • 在拉取请求页合并时,目标分支上的新提交会被发给 AngusSecurity。如果用的是变基合并,而源分支也有了新提交,还会再发一次。
  • 只新建拉取请求时,不会为这个动作重新扫描。如果源分支已经有一次已完成的扫描,拉取请求的状态检查(拉取请求页面上汇总各项自动检查结果的区域)会直接挂上已有的结论。
  • 同一提交、同样的检测能力、同样的门禁设置,在默认 10 分钟内再次出现时,不会重复发送扫描任务,只在历史里记一条跳过,这就是去重。修改过门禁阈值后,同一提交不会被这次去重拦下。

扫描在 AngusSecurity 上异步执行,推送本身不用等扫描结束。如果希望新建拉取请求时就带上扫描结论,要么让源分支先被扫描过,要么打开 未通过时拒绝合并;打开后,还没有结论的拉取请求会先显示「等待对提交 … 的安全检查」。

4. 手动扫描和定时扫描

手动扫描 不受 本仓自动安全扫描 开关影响。在仓库安全详情页点 立即扫描,会打开标题为 触发安全扫描 的对话框,说明是「选择能力与扫描级别后投递至 AngusSecurity。」

对话框会按仓库当前的安全画像预先勾选能力。以这个仓库为例,预勾的是 密钥检查 和 许可证合规,代码安全、依赖/制品漏洞、代码质量没有勾选。扫描级别 是 标准,另外还可以选快速或深度;分支 是 main;强制重扫(忽略去重) 默认不勾。只想查看选项时点 取消,确认要补扫时再点 开始扫描。

触发安全扫描:密钥检查和许可证合规已勾,级别标准,分支 main

如果这次扫描和近期的扫描相同,会提示「与近期扫描相同,已跳过(可勾选强制重扫)」。确实需要重扫时,再勾选 强制重扫(忽略去重)。

定时扫描 配置在租户策略里,同样不受仓库自动扫描开关影响。到了设定的时间,系统会扫描已有安全画像的仓库的默认分支,每次最多发起 20 个仓库的扫描。这个实例的 定时扫描 是关闭的,所以页面上没有出现 Cron 输入框。

5. 扫描结果在哪看

每次扫描的触发方式和状态,都能在仓库安全详情页的 扫描历史 里看到。以 e2e-license-gate 为例,最近几条记录是:

状态 触发 门禁结果 分支
已完成 推送 未通过 e2e-git07@591d671
已完成 手动 通过 main@d3ebc5a
已完成 推送 未通过 e2e-x03@d3ebc5a
不完整 推送 已跳过 e2e-x03@cb1dc56
已完成 推送 通过 e2e-git08@1f78310

扫描历史:推送和手动,门禁结果是未通过、通过或已跳过

状态列显示 已完成 或 不完整,门禁结果列显示 未通过、通过 或 已跳过。较早的记录旁边会注明「同一分支已有更新的检查,更早的结果可能已被清理」。每一行都有 打开扫描任务,点进去可以看这次任务的明细。

拉取请求上的 AngusSecurity 行,采用的是该提交最新一次参与判定的扫描。对照上表:e2e-git08@1f78310 的推送扫描门禁结果是通过,对应 #1 的成功说明;e2e-x03@d3ebc5a 的推送扫描是未通过,但之后同一提交又做了一次手动扫描,结果是通过,所以 #4 的检查行写的是漏洞门禁已通过。

侧栏 安全 里的 扫描历史 是跨仓库的同类列表,触发方式除了推送和手动,还有 定时。这个仓库的历史里目前没有定时扫描的记录。

6. 配了却没有扫描时怎么排查

你看到的 原因 怎么处理
「尚未接入 AngusSecurity」 集成没开通 系统管理员按第 1 节开通
配置启用 为 未启用 部署配置没打开 设 angus.git.external-security.enabled=true 后重启
平台可达 为 不可达 AngusGit 连不上 AngusSecurity 检查 AngusSecurity 是否在运行、地址和网络是否通
有了新提交,历史里却没有新记录 本仓自动安全扫描 关着,或一种能力都没开 打开总开关,并至少保留一种能力
历史里是跳过 默认 10 分钟内,同一提交和同样设置已经扫过 用手动扫描并勾选强制重扫
历史里状态是 失败 AngusSecurity 拉取代码或执行扫描出错 点 打开扫描任务,到 AngusSecurity 查看原因
历史里是 不完整 这次扫描结果没收全 再扫描一次

扫描结果不完整时,对应拉取请求上的说明会是「检查结果不完整,请重新检查」。

常见问题

每次推送都扫描,会不会很慢?

推送不会变慢,因为扫描是异步进行的,不会挡住推送。而且同一提交在默认 10 分钟内、检测能力和门禁都没变时,不会重复发起扫描。

能不能只扫描 main,不扫功能分支?

目前做不到。自动扫描跟着有新提交的那条分支走,没有按分支排除的开关。而且功能分支的扫描结果,正是拉取请求上 AngusSecurity 那一行的来源。

打开了自动扫描,合并会被拦住吗?

不会自动拦住。自动扫描只负责发起扫描和记录结果;要拦住合并,还需要打开 未通过时拒绝合并。示例仓库这两个开关都已打开。注意租户默认值里拒绝合并是关闭的,所以新建的仓库一开始也是关闭的。

小结

让推送后自动扫描,需要实例和仓库两层配置都到位。在这个实例里,管理 → 安全设置 已经显示配置启用、平台可达;xlliu/e2e-license-gate 的 本仓自动安全扫描 也已打开,其中代码安全、密钥检查、许可证合规开启,依赖/制品漏洞和代码质量关闭。之后无论是 git push、网页提交还是拉取请求合并,只要分支上有了新提交,就会把扫描任务发给 AngusSecurity;只新建拉取请求不会额外扫描,定时扫描目前也是关闭的。需要补扫时,打开手动扫描对话框,确认能力和分支后点 开始扫描。

安全扫描在团队版、企业版和云服务中提供,社区版没有 安全 菜单。

结论: 实例接入 AngusSecurity、仓库打开本仓自动安全扫描之后,分支上每有一次新提交,最新提交就会交给 AngusSecurity 扫描;合并会不会被拦住,取决于是否打开「未通过时拒绝合并」。

参考文章

📰 Read the original article on Dev.to Security

Originally published by Dev.to Security. Aggregated on AIWithGhost for educational purposes — full credit and traffic to the original publisher.