CI/CD パイプライン

その他の CI プラットフォーム

VulnCheck の汎用 CI レシピと、Bitbucket Pipelines、CircleCI、Drone、Woodpecker、Buildkite の例。

VulnCheck の CI 統合は、どれも同じ 5 ステップです。バージョンを固定した CLI をインストールし、VC_TOKEN を渡し、スキャンし、ゲートし、公開します。したがって、コンテナ内でシェルスクリプトを実行できるプラットフォームであれば、どこでも実行できます。各ステップの説明は CI/CD での VulnCheck にあります。本ページでは、専用ガイドのないプラットフォームにそれを適用します。

汎用レシピ

# 1. Install a pinned CLI
VC_CLI_VERSION=1.1.0
ARCH="$(uname -m)"
case "$ARCH" in x86_64) ARCH=amd64 ;; aarch64) ARCH=arm64 ;; esac
curl -sSL "https://github.com/vulncheck-oss/cli/releases/download/v${VC_CLI_VERSION}/vulncheck_${VC_CLI_VERSION}_linux_${ARCH}.tar.gz" | tar -xz -C /tmp
install -m 0755 "/tmp/vulncheck_${VC_CLI_VERSION}_linux_${ARCH}/bin/vulncheck" /usr/local/bin/vulncheck

# 2. VC_TOKEN comes from the platform's secret store — never from the repository

# 3. Scan
vulncheck scan . --json > scan.json
jq -r '"\((.vulnerabilities // []) | length) vulnerabilities found"' scan.json

# 4. Gate
jq -e --argjson max 7.0 '
  [ (.vulnerabilities // [])[]
    | select((.cvss_base_score // 0 | tonumber? // 0) >= $max or .in_kev) ] | length == 0
' scan.json > /dev/null || {
  echo "VulnCheck policy breach:"
  jq -r --argjson max 7.0 '
    (.vulnerabilities // [])[]
    | select((.cvss_base_score // 0 | tonumber? // 0) >= $max or .in_kev)
    | "  \(.cve)  \(.name)@\(.version)  CVSS \(.cvss_base_score)  KEV \(.in_kev)  fixed in \(.fixed_versions // "n/a")"
  ' scan.json
  exit 1
}

# 5. Publish scan.json as a build artifact

どのプラットフォームでも、つまずきやすい点が 3 つあります。

  • vulncheck scan重大な脆弱性を検出した場合でも終了コード 0 を返します。したがって、ビルドを失敗させるのはステップ 4 です。これがなければ、ログに検出結果が残ったままジョブは成功します。
  • 検出結果がないスキャンには vulnerabilities キー自体が含まれないため、(.vulnerabilities // [])[] が必要です。ガードなしで反復処理すると、何も問題のないリポジトリで jq が終了コード 5 を返します。もう一方を守るのが .cvss_base_score // 0 | tonumber? // 0 です。CVSS スコアのない検出結果があると、.in_kev が評価される前に tonumber が同じ終了コード 5 でプログラム全体を中断させてしまいます。
  • install.sh は glibc 専用で、root のコンテナ内でも sudo が使えるものとして扱うため、何もインストールしないまま終了します。上記の tarball であれば、Alpine を含めどこでも動作します。

Bitbucket Pipelines

Repository settings > Repository variablesVC_TOKEN を追加し、Secured をオンにします。

image: debian:bookworm-slim

definitions:
  steps:
    - step: &vulncheck-scan
        name: Scan with VulnCheck
        script:
          - apt-get update -qq && apt-get install -y -qq --no-install-recommends ca-certificates curl jq
          - export VC_CLI_VERSION=1.1.0
          - curl -sSL "https://github.com/vulncheck-oss/cli/releases/download/v${VC_CLI_VERSION}/vulncheck_${VC_CLI_VERSION}_linux_amd64.tar.gz" | tar -xz -C /tmp
          - install -m 0755 "/tmp/vulncheck_${VC_CLI_VERSION}_linux_amd64/bin/vulncheck" /usr/local/bin/vulncheck
          - vulncheck scan . --json > scan.json
          - jq -r '"\((.vulnerabilities // []) | length) vulnerabilities found"' scan.json
          - |
            jq -e --argjson max 7.0 '
              [ (.vulnerabilities // [])[]
                | select((.cvss_base_score // 0 | tonumber? // 0) >= $max or .in_kev) ] | length == 0
            ' scan.json > /dev/null || { echo "VulnCheck policy breach"; exit 1; }
        artifacts:
          - scan.json

pipelines:
  pull-requests:
    '**':
      - step: *vulncheck-scan
  branches:
    main:
      - step: *vulncheck-scan

CircleCI

VC_TOKEN をプロジェクトの環境変数として追加するか、複数プロジェクトで共有するコンテキストに追加します。

version: 2.1

jobs:
  vulncheck-scan:
    docker:
      - image: cimg/base:current
    environment:
      VC_CLI_VERSION: 1.1.0
      VC_CVSS_THRESHOLD: '7.0'
    steps:
      - checkout
      - run:
          name: Install the VulnCheck CLI
          command: |
            curl -sSL "https://github.com/vulncheck-oss/cli/releases/download/v${VC_CLI_VERSION}/vulncheck_${VC_CLI_VERSION}_linux_amd64.tar.gz" | tar -xz -C /tmp
            sudo install -m 0755 "/tmp/vulncheck_${VC_CLI_VERSION}_linux_amd64/bin/vulncheck" /usr/local/bin/vulncheck
            vulncheck version
      - run:
          name: Scan
          command: |
            vulncheck scan . --json > scan.json
            jq -r '"\((.vulnerabilities // []) | length) vulnerabilities found"' scan.json
      - run:
          name: Gate on findings
          command: |
            jq -e --argjson max "$VC_CVSS_THRESHOLD" '
              [ (.vulnerabilities // [])[]
                | select((.cvss_base_score // 0 | tonumber? // 0) >= $max or .in_kev) ] | length == 0
            ' scan.json > /dev/null || { echo "VulnCheck policy breach"; exit 1; }
      - store_artifacts:
          path: scan.json

workflows:
  security:
    jobs:
      - vulncheck-scan

Drone と Woodpecker

vc_token をリポジトリのシークレットとして追加します。以下の例は Drone です。Woodpecker では、トップレベルの kindtypename を削除すれば同じステップが使えます。

kind: pipeline
type: docker
name: security

steps:
  - name: vulncheck-scan
    image: debian:bookworm-slim
    environment:
      VC_TOKEN:
        from_secret: vc_token
      VC_CLI_VERSION: 1.1.0
    commands:
      - apt-get update -qq && apt-get install -y -qq --no-install-recommends ca-certificates curl jq
      - curl -sSL "https://github.com/vulncheck-oss/cli/releases/download/v${VC_CLI_VERSION}/vulncheck_${VC_CLI_VERSION}_linux_amd64.tar.gz" | tar -xz -C /tmp
      - install -m 0755 "/tmp/vulncheck_${VC_CLI_VERSION}_linux_amd64/bin/vulncheck" /usr/local/bin/vulncheck
      - vulncheck scan . --json > scan.json
      - jq -r '"\((.vulnerabilities // []) | length) vulnerabilities found"' scan.json
      - |
        jq -e --argjson max 7.0 '
          [ (.vulnerabilities // [])[]
            | select((.cvss_base_score // 0 | tonumber? // 0) >= $max or .in_kev) ] | length == 0
        ' scan.json > /dev/null || { echo "VulnCheck policy breach"; exit 1; }

Buildkite

エージェントの environment フックまたはシークレットヘルパー経由で VC_TOKEN を渡し、コンテナ内でスキャンを実行します。

steps:
  - label: 'Scan with VulnCheck'
    plugins:
      - docker#v5.11.0:
          image: debian:bookworm-slim
          propagate-environment: true
          environment:
            - VC_TOKEN
    commands:
      - apt-get update -qq && apt-get install -y -qq --no-install-recommends ca-certificates curl jq
      - export VC_CLI_VERSION=1.1.0
      - curl -sSL "https://github.com/vulncheck-oss/cli/releases/download/v${VC_CLI_VERSION}/vulncheck_${VC_CLI_VERSION}_linux_amd64.tar.gz" | tar -xz -C /tmp
      - install -m 0755 "/tmp/vulncheck_${VC_CLI_VERSION}_linux_amd64/bin/vulncheck" /usr/local/bin/vulncheck
      - vulncheck scan . --json > scan.json
      - |
        jq -e --argjson max 7.0 '
          [ (.vulnerabilities // [])[]
            | select((.cvss_base_score // 0 | tonumber? // 0) >= $max or .in_kev) ] | length == 0
        ' scan.json > /dev/null || { echo "VulnCheck policy breach"; exit 1; }
    artifact_paths:
      - scan.json

その他の環境

Tekton、Argo Workflows、GitLab の Kubernetes Executor といった Kubernetes ネイティブのランナーでも、特別な対応は不要です。ステップのコンテナ内で汎用レシピを実行し、VC_TOKENSecret からマウントし、scan.json を共有ワークスペースに書き出して後続のステップで公開してください。