Dockerスキャン(Trivy)

Trivyのコンテナイメージのスキャン結果をFutureVulsに取り込む

aquasecurity/trivyは、Dockerイメージの脆弱性を検知するOSSツールです。 FutureVulsではTrivyのスキャン結果を取り込み、FutureVuls上でコンテナイメージの脆弱性を管理できます。

サポート対象の言語やパッケージエコシステムの詳細は、「Trivy Supported OS」を参照してください。

Trivyによるコンテナイメージスキャンでは、以下の2パターンをご利用いただけます。

ローカル環境にTrivyをインストールしてスキャンする

Trivyをローカル環境にインストールし、コンテナイメージをスキャンした結果をFutureVulsにアップロードします。この方法では、通常版と軽量版の2つのインストールモードが選択できます。それぞれの違いは以下の通りです。

項目 説明 通常版 軽量版
root権限 インストール時にroot権限が必要かどうか 必要 不要
対応環境 セットアップ可能なローカル環境 参考 Linux全般
定期スキャン イメージを自動で定期的にスキャンするか 対応 未対応

新しくコンテナイメージをスキャンする

新しくコンテナイメージをスキャンし、FutureVulsに登録する場合は次の手順に従ってください。

  1. サーバタブの サーバ追加 ボタンからダイアログを開き、コンテナイメージスキャン を選択する コンテナイメージスキャン追加ダイアログ誘導
  2. スキャナトークンを選択し、スキャン対象コンテナイメージのイメージ名を入力する。
    • <イメージ名>:<タグ> の形式で指定してください。
    • 常に最新バージョンのイメージをスキャンする場合は、<イメージ名>:<latest> を指定してください。
  3. プロキシ環境下の場合は、経由するプロキシサーバを入力する
  4. 軽量版を使用する場合はスイッチバーにチェックをいれる
  5. 画面下部に表示されているコマンドをコピーし、対象イメージを管理しているローカル環境で貼り付け、実行する
    • 通常版の場合はroot権限で実行してください。 コンテナイメージスキャン追加ダイアログ
  6. FutureVulsにて対象グループのサーバタブに、スキャンしたイメージが追加されていることを確認
    • 通常版の場合、FutureVulsに反映されるまで5~10分程度かかります。
      • インストール後、すぐにスキャンを実行したい場合は次のコマンドを実行してください。
        • /opt/vuls-trivy-saas/vuls-trivy-saas.sh &> /opt/vuls-trivy-saas/vuls-trivy.log

以上で登録は完了です。 通常版をご利用の場合は、スキャナが1日1回自動で起動し、対象のコンテナイメージをスキャンしてFutureVulsに反映します。

通常版では、さらにいくつかのスキャンオプションがご利用いただけます。

また、スキャン結果が反映されない場合はコチラを参照ください。

登録済みのコンテナイメージ情報を更新する

登録済みの構成情報を基に脆弱性情報を最新化する

FutureVulsに既に登録済みのコンテナイメージの構成情報を基に、脆弱性情報の最新化を行いたい場合は、FutureVuls上から手動スキャンを実行してください。

コンテナイメージの構成情報の変更をFutureVulsに反映する

FutureVulsに登録済みのコンテナイメージに変更があった場合は、本手順に従ってFutureVulsに反映してください。

  • 通常版の場合
    • スキャナが1日1回自動で起動し、イメージをスキャンしているため操作は必要ありません
    • 今すぐスキャナを起動したい場合は、root ユーザもしくは vuls-trivy-saas ユーザで次のコマンドを実行してください。
      • /opt/vuls-trivy-saas/vuls-trivy-saas.sh &> /opt/vuls-trivy-saas/vuls-trivy.log
  • 軽量版の場合
    1. サーバタブで対象のコンテナイメージをクリックし、サーバ詳細ページを開く
    2. 構成情報を更新 ボタンをクリックしてダイアログを開く コンテナイメージ更新
    3. スキャナトークンを選択し、スキャン対象コンテナイメージのイメージ名を入力する
    4. プロキシ環境下の場合は、経由するプロキシサーバを入力する
    5. 画面下部に表示されているコマンドをコピーし、対象イメージを管理しているローカル環境で貼り付け実行する。

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

CI/CDパイプラインに脆弱性スキャン処理を組み込むことで、危険な脆弱性が検知されたらBuildを失敗させたり、開発者にライブラリ等のバージョンアップを促すことができます。

このドキュメントでは、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

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`"

正常にスキャンできない場合

FAQを参照ください。