コンテンツにスキップ

CI/CDパイプラインに組み込む#

CI/CDパイプラインにコンテナイメージスキャンやアプリケーション依存ライブラリスキャンの処理を組み込むことで、脆弱性の早期発見が可能となり、リリース前に高リスクの脆弱性を排除できます。

コンテナイメージのスキャンをCI/CDに組み込む#

ここでは、GitHub ActionsとAWS CodePipelineのCI/CDパイプランの中でコンテナイメージをスキャンした結果をFutureVulsにアップロードする方法を紹介します。

サンプルで定義が必要な環境変数は下記の通りです。

変数 説明 必須
VULS_SAAS_GROUPID スキャン結果をアップロードするグループのID。暗号化されたストアで保持してください。
VULS_SAAS_TOKEN スキャン権限をもったFutureVulsのトークン。暗号化されたストアで保持してください。
DOCKERFILE_PATH 生成するイメージの元となるDockerファイルのパス
TARGET_IMAGE スキャンするイメージ
<イメージ名>:<タグ> の形式で指定
VULS_SAAS_UUID 対象イメージを一意に識別するFutureVuls内のサーバUUID
新規登録の場合は uuidgen コマンド等で生成した値を指定する
FutureVuls上で同じイメージとして管理する場合はに登録済みのサーバUUIDを指定した場合は更新処理となる
  • FutureVuls上で既に管理しているイメージの構成情報を更新する場合は、対象イメージのUUIDを VULS_SAAS_UUID として指定してください。

image-uuid

環境変数の設定

以下の環境変数はencrypted secretsにてセットすることを推奨しています。

  • VULS_SAAS_GROUPID
  • VULS_SAAS_TOKEN

万が一これらの値が外部に漏洩してしまった場合は、FutureVulsの指定したグループに対して任意のスキャン結果のアップロードが可能になってしまうのでご注意ください。

GitHub Actionsを用いてCI/CDパイプラインにコンテナイメージスキャンを組み込む#

CICDパイプラインの中でTrivy連携用のスクリプトを用いてスキャンするGitHub Actionsの例です。

name: FutureVuls Docker Image Scan
on:
  push
defaults:
  run:
      shell: bash
jobs:
  docker-test:
    name: FutureVuls Docker Image Scan
    env:
      VULS_SAAS_GROUPID: ${{ secrets.VULS_SAAS_GROUPID }}
      VULS_SAAS_TOKEN: ${{ secrets.VULS_SAAS_TOKEN }}
      DOCKERFILE_PATH: "docker/anything/Dockerfile"
      TARGET_IMAGE: "imageName:tag"
      VULS_SAAS_UUID: "xxxxxxxx"
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4
    - name: cached scan db
      uses: actions/cache@v3
      with:
        path: vulndb/
        key: trivy-vulndb
    - name: scan and upload
      env: 
      run: |
        docker build . -f ${env.DOCKERFILE_PATH} -t ${env.TARGET_IMAGE}
        curl -s https://installer.vuls.biz/vuls-trivy-light.sh | \
        VULS_SAAS_GROUPID="${env.VULS_SAAS_GROUPID}" \
        VULS_SAAS_TOKEN="${env.VULS_SAAS_TOKEN}" \
        TARGET_IMAGE="${env.TARGET_IMAGE}" \
        VULS_SAAS_UUID="${env.VULS_SAAS_UUID}" \
        bash -s inst

AWS CodePipelineを用いてCI/CDパイプラインに脆弱性スキャンを組み込む#

CICDパイプラインの中でTrivy連携用のスクリプトを用いてスキャンするbuildspec.ymlの例です。

version: 0.2

#env:
#  variables:
    #VULS_SAAS_GROUPID: "define in secret manager"
    #VULS_SAAS_TOKEN: "define in secret manager"
    #DOCKERFILE_PATH: "./Dockerfile"
    #TARGET_IMAGE: "target_image:tag"
    #VULS_SAAS_UUID: "xxxx-FutureVuls-Server-UUID-xxxxxxxx"
phases:
  install:
    runtime-versions:
      python: latest
  build:
    commands:
      - 'docker build -t $TARGET_IMAGE .'
  post_build:
    commands:
      - 'curl -s https://installer.vuls.biz/vuls-trivy-light.sh | VULS_SAAS_GROUPID="$VULS_SAAS_GROUPID" VULS_SAAS_TOKEN=$VULS_SAAS_TOKEN TARGET_IMAGE=$TARGET_IMAGE VULS_SAAS_UUID=$VULS_SAAS_UUID bash -s inst'
      - "echo scan results Sent to Fvuls on `date`"

アプリケーションライブラリのスキャンをCI/CDに組み込む#

ここでは、GitHub ActionsとAWS CodePipelineのCI/CDパイプランの中でアプリケーションの依存ライブラリをスキャンした結果をFutureVulsにアップロードする方法を紹介します。

git push時にライブラリの脆弱性をスキャンする#

Git push時にアプリケーションライブラリをスキャンした結果を FutureVuls にアップロードします。このドキュメントではGitHub Actions を例に紹介します。 GitHub Actions のサンプル YAML ファイルは以下のとおりです。

サンプルで使用する環境変数#

変数 説明 必須
VULS_SAAS_GROUPID スキャン結果をアップロードするグループのID
VULS_SAAS_TOKEN スキャン権限をもったトークン
TARGET_LIBRARY スキャン対象ディレクトリのパス
リポジトリ内すべてを対象とする場合は ${{ github.workspace }} のままでよい
VULS_SAAS_UUID FutureVulsで管理する用のUUID
新規登録の場合は uuidgen コマンド等で生成した値を指定する
ACTIONS_RUNTIME_TOKEN 認証させる GitHub トークン
RATELIMIT によるエラーが発生する場合に必要

FutureVuls上で既に管理しているライブラリの構成情報を更新する場合は、対象ライブラリのUUIDを VULS_SAAS_UUID として指定してください。

lib-uuid

環境変数の設定

以下の環境変数はencrypted secretsにてセットすることを推奨しています。

  • VULS_SAAS_GROUPID
  • VULS_SAAS_TOKEN

この情報を使うとFutureVulsの指定したグループに対して、任意のサーバのスキャン結果のアップロードが可能となってしまいます。

スキャン用のスクリプトファイルを用いてスキャンします。

name: FutureVuls library Scan 
on: 
  push: 
defaults: 
  run: 
      shell: bash 
jobs: 
  docker-test: 
    name: FutureVuls library Scan 
    env: 
      VULS_SAAS_GROUPID: ${{ secrets.VULS_SAAS_GROUPID }}
      VULS_SAAS_TOKEN: ${{ secrets.VULS_SAAS_TOKEN }}
      TARGET_LIBRARY: "${{ github.workspace }}" 
      VULS_SAAS_UUID: "xxxx" 
      ACTIONS_RUNTIME_TOKEN: ${{ secrets.GITHUB_TOKEN }} 
    runs-on: ubuntu-latest 
    steps: 
    - uses: actions/checkout@v4 
    - name: cached scan db 
      uses: actions/cache@v3 
      with: 
        path: vulndb/ 
        key: trivy-vulndb 
    - name: scan and upload 
      run: 
        curl -s https://installer.vuls.biz/vuls-trivy-light.sh | bash -s inst

GitHub ActionsでPush時にLockFileを自動更新する方法#

futurevuls/fvuls-lockfile-uploaderを使い、git push 時にLockFileが更新されたかをチェックし、LockFileが更新された場合のみ、FutureVuls登録済みのLockFileをREST API経由で更新する方法を解説します。

下記のサンプルでは、release ブランチにプッシュされた場合かつ、./go.sum または ./web/yarn.lock が変更された場合のみ実行されます。

サンプル内の以下の環境変数は、Encrypted Secretsにてセットして下さい。

環境変数名 確認方法
FVULS_SERVER_UUID サーバ一覧から確認する
FVULS_TOKEN グループ設定 > FutureVuls APIから確認する
on:
  push:
    ## https://docs.github.com/en/actions/learn-github-actions/workflow-syntax-for-github-actions#onpushpull_requestpaths
    paths:
      - 'go.sum'
      - 'web/yarn.lock'
    branches:
      - release

name: Check lockfiles
jobs:
  build:
    env:
      FVULS_SERVER_UUID: ${{ secrets.FVULS_SERVER_UUID }}
      FVULS_TOKEN: ${{ secrets.FVULS_TOKEN }}
    name: Upload lockfile
    runs-on: ubuntu-20.04
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0
      - name: Upload go.sum
        uses: futurevuls/fvuls-lockfile-uploader@v1
        with:
          repoName: ${{ github.repository }}
          path: './go.sum'
      - name: Upload web/yarn.lock
        uses: futurevuls/fvuls-lockfile-uploader@v1
        with:
          repoName: ${{ github.repository }}
          path: './web/yarn.lock'