Dockerスキャン(Trivy)

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

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

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

本ドキュメントでは、以下の2パターンを解説します。

a. コマンドラインでスキャンする方法

trivyをローカル環境にインストールし、コンテナイメージをスキャンした結果をFutureVulsにアップロードします。

前提条件

  • Linux環境であること

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

  1. サーバタブの サーバ追加 ボタンからダイアログを開き、コンテナイメージスキャン を選択する コンテナイメージスキャン追加
  2. スキャナトークンを選択し、スキャン対象コンテナイメージのイメージ名を入力する。
  • (タグの指定がある場合は、<イメージ名>:<タグ>の形式で指定してください。タグを指定しない場合はlatestタグを対象にスキャンします。)
  1. プロキシ環境下の場合は、経由するプロキシサーバを入力する
  2. 画面下部に表示されているコマンドをコピーし、対象イメージを管理しているローカル環境で貼り付け、実行する

画面反映

  • スキャンが完了したデータは、OSパッケージ同様に「ソフトウェア」、「タスク詳細」などに反映されます。

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

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

  1. サーバタブで対象のコンテナイメージをクリックし、サーバ詳細ページを開く
  2. 構成情報を更新 ボタンをクリックしてダイアログを開く コンテナイメージ更新
  3. スキャナトークンを選択し、スキャン対象コンテナイメージのイメージ名を入力する
  4. プロキシ環境下の場合は、経由するプロキシサーバを入力する
  5. 画面下部に表示されているコマンドをコピーし、対象イメージを管理しているローカル環境で貼り付け実行する。

b. CI/CDパイプラインに組み込む方法(GitHub Actions編)

GitHub ActionsのサンプルYAMLファイルは以下のとおりです。

Docker imageを利用する

name: FutureVuls Docker Image Scan
on:
  push
defaults:
  run:
      shell: bash
jobs:
  container-scan:
    name: FutureVuls Docker Image Scan
    env:
      FVULS_GROUP_ID: xxx
      FVULS_TOKEN: xxxxxxxxx
      FVULS_AUTH_URL: "https://auth.vuls.biz/one-time-auth"
      DOCKERFILE_PATH: "path/to/dockerfile"
      IMAGE_NAME: "image-name"
      FVULS_SERVER_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.IMAGE_NAME }}
    - 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.IMAGE_NAME }} | \
          trivy-to-vuls parse --stdin | \
          future-vuls upload --stdin --url ${{ env.FVULS_AUTH_URL }} --group-id ${{ env.FVULS_GROUP_ID }} --token ${{ env.FVULS_TOKEN }} --uuid ${{ env.FVULS_SERVER_UUID }} \
          "          

バイナリをダウンロードする

name: FutureVuls Docker Image Scan
on:
  push
defaults:
  run:
      shell: bash
jobs:
  docker-test:
    name: FutureVuls Docker Image Scan
    env:
      FVULS_GROUP_ID: xxx
      FVULS_TOKEN: "xxxxxxxx"
      FVULS_AUTH_URL: "https://auth.vuls.biz/one-time-auth"
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v1
    - name: cached scan db
      uses: actions/cache@v2
      with:
        path: vulndb/
        key: trivy-vulndb
    - name: install trivy
      run: |
        curl -s https://api.github.com/repos/aquasecurity/trivy/releases/latest | \
        grep "browser_download_url.*_Linux-64bit.tar.gz" | \
        cut -d : -f 2-3 | \
        xargs wget
        tar zxvf trivy_*        
    - name: install trivy-to-vuls
      run: |
        curl -s https://api.github.com/repos/future-architect/vuls/releases/latest | \
        grep "browser_download_url.*trivy-to-vuls.*_linux_amd64.tar.gz" | \
        cut -d : -f 2-3 | \
        xargs wget
        tar zxvf trivy-to-vuls*        
    - name: install future-vuls
      run: |
        curl -s https://api.github.com/repos/future-architect/vuls/releases/latest | \
        grep "browser_download_url.*future-vuls.*_linux_amd64.tar.gz" | \
        cut -d : -f 2-3 | \
        xargs wget
        tar zxvf future-vuls*        
    - name: scan core-rpc-server by trivy
      env: 
        DOCKERFILE_PATH: "docker/anything/Dockerfile"
        IMAGE_NAME: "fvuls/trivy-scan"
        FVULS_SERVER_UUID: "xxxxxxxx"
      run: |
        docker build . -f ${DOCKERFILE_PATH} -t ${IMAGE_NAME}
        set -eo pipefail
        ./trivy -q --cache-dir vulndb/ image -f json --list-all-pkgs ${IMAGE_NAME} | \
        ./trivy-to-vuls parse --stdin | \
        ./future-vuls upload --stdin --url ${FVULS_AUTH_URL} --group-id ${FVULS_GROUP_ID}  --token ${FVULS_TOKEN}  --uuid ${FVULS_SERVER_UUID}        

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

正常にスキャンできない場合は以下をお試しください。

  • trivy単体で実行してエラーが出ていないかチェック(-dはdebugオプション)

    ./trivy -d -q image image-name

  • タイムアウト系のエラーが出ている場合はtimeoutオプションを設定する

    ./trivy -d -q image --timeout=60m image-name

  • trivyコマンドが正常の場合は、trivy-to-vuls(JSONの変換処理)でエラーが発生しているか確認する

    ./trivy -d -q image image-name | ./trivy-to-vuls parse --stdin

  • 解決できない場合はお問い合わせください。