我在 GitLab CI(GitLab 社区版)14.5.2 中启用了 SAST 扫描。SAST 运行 semgrep 和 ESLint 等工具运行源代码并扫描漏洞。这行得通......除了它没有从我告诉它的结果中排除路径和文件,所以我的报告充满了来自 3rd 方库的垃圾。
由于我不想在报告中包含测试代码或第 3 方的东西,我为此使用 GitLab 提供的变量,称为SAST_EXCLUDED_PATHS
我用来排除一些目录的变量。我的价值是这样的:
variables:
SAST_EXCLUDED_PATHS: spec, test, tests, tmp, server/libs, assets, vendor, *.min.js
所以基本上除了默认路径之外,我已经告诉它不要扫描server/libs
,或.assets
vendor
*.min.js
因此,添加步骤、添加排除项并设置SECURE_LOG_LEVEL
为.gitlab-ci.yml 的简化版"debug"
。后者,所以我可以看到阶段的调试输出,例如 sast-semgrep。
include:
- template: Security/SAST.gitlab-ci.yml
stages:
- test
# Run a SAST scan & report on the sources
sast:
stage: test
variables:
SAST_EXCLUDED_PATHS: spec, test, tests, tmp, server/libs, assets, vendor, *.min.js
SECURE_LOG_LEVEL: "debug"
我可以从调试中看到 sast-semgrep 正在接受我的排除并将它们转化为--exclude
参数。但无论如何它只是扫描路径。我什至尝试将 glob 规则附加到路径上,例如“server/libs/**”。我什至尝试过使用绝对路径,例如“$CI_PROJECT_DIR/server/libs”,但这也不起作用。
我启用了调试控制台输出,我什至可以看到像 semgrep 这样的工具正在正确地扩展排除项。但它不起作用!此示例包含一个$CI_PROJECT_DIR
没有任何区别的扩展。
[DEBU] [Semgrep] [2022-01-26T20:59:40Z] ▶ /usr/local/bin/semgrep -f /rules -o /builds/myprj/myprj/semgrep.sarif --sarif --no-rewrite-rule-ids --strict --disable-version-check --no-git-ignore --exclude spec --exclude test --exclude tests --exclude tmp --exclude "/builds/myprj/myprj/server/libs" --exclude assets --exclude vendor --exclude *.min.js --enable-metrics /builds/myprj/myprj
[DEBU] [Semgrep] [2022-01-26T21:01:34Z] ▶ METRICS: Using configs from the Registry (like --config=p/ci) reports pseudonymous rule metrics to semgrep.dev.
To disable Registry rule metrics, use "--metrics=off".
Using configs only from local files (like --config=xyz.yml) does not enable metrics.
More information: https://semgrep.dev/docs/metrics
excluding files:
- spec
- test
- tests
- tmp
- "/builds/myprj/myprj/server/libs"
- assets
- vendor
- *.min.js
据我所知,我正在使用 GitLab 调用的最新 GitLab 和 docker 映像。有谁知道为什么排除不起作用?我是否遗漏了一些明显的东西。仅供参考,我还在 GitLab Ultimate 评估副本中尝试了相同的 CI/CD 脚本,并且是相同的交易。因此,它与社区版中功能较弱的 SAST 功能无关,它仍应生成 JSON 报告。有任何想法吗?