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パイプラインに組み込む方法

TrivyをCI/CDパイプラインに組み込み、コンテナイメージをスキャンした結果をFutureVulsにアップロードします。このドキュメントではGitHub Actionsを例に紹介します。 GitHub ActionsのサンプルYAMLファイルは以下のとおりです。

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

image-uuid

スキャンスクリプトをダウンロードする

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

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@v1
    - name: cached scan db
      uses: actions/cache@v2
      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        

Docker imageを利用する

この例では、スキャン用のDocker imageを用いてスキャンします。

name: FutureVuls Docker Image Scan
on:
  push
defaults:
  run:
      shell: bash
jobs:
  container-scan:
    name: FutureVuls Docker Image Scan
    env:
      VULS_SAAS_GROUPID: xxx
      VULS_SAAS_TOKEN: xxxxxxxxx
      FVULS_AUTH_URL: "https://auth.vuls.biz/one-time-auth"
      DOCKERFILE_PATH: "path/to/dockerfile"
      TARGET_IMAGE: "image-name"
      VULS_SAAS_UUID: xxxxxxxxx
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v1
    - name: cached scan db
      uses: actions/cache@v2
      with:
        path: vulndb/
        key: trivy-vulndb
    - name: Build dockerfile
      run: docker build . -f ${{ env.DOCKERFILE_PATH }} -t ${{ env.TARGET_IMAGE }}
    - name: Scan the image and upload to FutureVuls
      uses: docker://vuls/fvuls
      with:
        entrypoint: '/bin/sh'
        args: |-
          -c "\
          set -eo pipefail
          trivy -q --cache-dir vulndb/ image -f json --list-all-pkgs ${{ env.TARGET_IMAGE }} | \
          trivy-to-vuls parse --stdin | \
          future-vuls upload --stdin --url ${{ env.FVULS_AUTH_URL }} --group-id ${{ env.VULS_SAAS_GROUPID }} --token ${{ env.VULS_SAAS_TOKEN }} --uuid ${{ env.VULS_SAAS_UUID }} \
          "          

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

FAQを参照ください。