如何根据发现的snyk漏洞的严重性来控制管道故障?

时间:2019-06-27 15:35:30

标签: continuous-integration gitlab

我正在使用Gitlab开发CI / CD管道,目前正在使用snyk进行依赖项安全性分析。它的运行效果很好,但是我现在想实现一些逻辑,如果发现的漏洞在给定的阈值以下,则允许管道继续执行此步骤而不会失败。例如,如果发现一些中等严重性漏洞而没有其他任何漏洞,则允许这样做并且不要使管道失败。但是,如果找到了一些中等严重性漏洞,并且还发现了一些高严重性漏洞,则由于这些高严重性漏洞而使管道失败。

我正在使用共享的Gitlab运行程序,因此我正在观看通过在线UI运行的所有内容。我已经研究了我正在使用的命令的退出代码(snyk测试),但是我所看到的是,如果发现任何漏洞,该进程将以“非零”退出代码退出。当我运行snyk测试时,它发现6个漏洞,三个严重级别为3个,严重级别为3个,退出代码返回echo $?是1(如下所示)。

这是snyk测试命令和退出代码的演示:

$ snyk test

...some vulnerabilities...

Tested 126 dependencies for known vulnerabilities, found 6 vulnerabilities, 32 vulnerable paths.

$ echo $?
1

这是在我的.gitlab-ci.yml中定义的snyk作业,以防有用:

# TODO Make stage success/failure based on vulnerability severity
snyk-dependency-analysis:
  image: awesomeaiden/custom_snyk
  stage: static_analysis
  only:
    changes:
      - boot-kotlin-svc/**/*
  before_script:
    - cd boot-kotlin-svc
    - export GRADLE_USER_HOME=`pwd`/.gradle
    - export SNYK_TOKEN=$secret_snyk_token
  after_script:
    - cd ..
  variables:
    SNYK_TOKEN: $secret_snyk_token
  script:
    - snyk test
  cache:
    key: "$CI_COMMIT_REF_NAME"
    policy: pull
    paths:
      - build
      - .gradle
  allow_failure: true

我希望能够获得最高的检测到的严重性级别,并使用它来使管道失败或不失败,但是我没有在线看到任何此类示例,也不知道它是否可能实现。

2 个答案:

答案 0 :(得分:0)

答案已解决,snyk支持人员说您可以在运行snyk命令时使用严重性阈值选项来忽略低于特定阈值的漏洞。

Snyk支持答案:

我们确实有退出代码,对于发现漏洞,我们使用退出代码1,对于其他任何失败,我们使用退出代码2。例如,如果您只想在严重性高的漏洞上失败,也可以将它与--severity-threshold结合使用。

答案 1 :(得分:0)

您可以添加标志--severity-threshold=low|medium|high

使用此标志,仅提供或更高级别的漏洞将 被报道

snyk test --all-sub-projects --severity-threshold=high

默认情况下,Snyk还会扫描所有可能的配置,包括仅用于测试的配置。要排除这些依赖项,可以使用--configuration-matching标志。这是Gradle项目的示例:

snyk test --all-sub-projects --configuration-matching=^(?!test).*

这将排除以下配置:testCompiletestCompileClasspathtestRuntimeClasspathtestImplementation