Dockerスキャン(Trivy)

trivyのスキャン結果をFutureVulsに取り込む

aquasecurity/trivyとは、Dockerイメージの脆弱性を検知するOSSツールです。 FutureVulsではtrivyのスキャン結果を取り込み、FutureVuls上で脆弱性を管理することが可能です。

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

  • 方法1.コマンドラインでスキャンする方法
  • 方法2.CI/CDパイプラインに組み込む方法(GitHub Actions編)

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

前提条件

  • Linux環境であること

前準備

  • FutureVulsの管理画面のURLから、GROUP IDを確認する(下記ピンクの部分)(あとで利用)
    • image
  • 任意のUUIDを作成して、FutureVulsのサーバUUIDを決める(あとで使用)
    • uuidgen などのコマンドを使ってUUIDを作成
    • サーバUUIDはFutureVuls上ではサーバの識別に利用されるので、同じイメージには同じUUIDを使い続ける
    • 異なるUUIDを指定した場合はFutureVuls上では異なるイメージとして認識される
  • TOKENはFutureVulsのスキャナトークンを確認する(あとで使用)
    • image

スキャン作業

  • Trivyのインストール
export TRIVY_VERSION=0.10.0
wget https://github.com/aquasecurity/trivy/releases/download/v${TRIVY_VERSION}/trivy_${TRIVY_VERSION}_Linux-64bit.tar.gz
tar zxvf trivy_${TRIVY_VERSION}_Linux-64bit.tar.gz
export VULS_VERSION=0.10.0
wget https://github.com/future-architect/vuls/releases/download/v${VULS_VERSION}/trivy-to-vuls_${VULS_VERSION}_linux_amd64.tar.gz
tar zxvf trivy-to-vuls_${VULS_VERSION}_linux_amd64.tar.gz
export VULS_VERSION=0.10.0
wget https://github.com/future-architect/vuls/releases/download/v${VULS_VERSION}/future-vuls_${VULS_VERSION}_linux_amd64.tar.gz
tar zxvf future-vuls_${VULS_VERSION}_linux_amd64.tar.gz
  • スキャン対象のDocker imageをbuild
# xxxx/xxxxはイメージ名
docker build . -t xxxx/xxxx
  • trivyでスキャンして、前作業で調べた情報を元に、その結果をFutureVulsにアップロード
export FVULS_AUTH_URL=https://auth.vuls.biz/one-time-auth
export FVULS_GROUP_ID=xxx
export FVULS_TOKEN=xxx
export FVULS_SERVER_UUID=xxxx

./trivy -q image -f=json xxxx/xxxx | \
./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}

画面反映

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

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

GitHub アクションズのサンプルYAMLファイルは以下のとおりです。

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-18.04
    steps:
    - uses: actions/checkout@v1
    - name: cached scan db
      uses: actions/cache@v2
      with:
        path: vulndb/
        key: trivy-vulndb
    - name: install trivy
      env: 
        TRIVY_VERSION: 0.8.0
      run: |
        wget https://github.com/aquasecurity/trivy/releases/download/v${TRIVY_VERSION}/trivy_${TRIVY_VERSION}_Linux-64bit.tar.gz
        tar zxvf trivy_${TRIVY_VERSION}_Linux-64bit.tar.gz
    - name: install trivy-to-vuls
      env: 
        VULS_VERSION: 0.10.0
      run: |
        wget https://github.com/future-architect/vuls/releases/download/v${VULS_VERSION}/trivy-to-vuls_${VULS_VERSION}_linux_amd64.tar.gz
        tar zxvf trivy-to-vuls_${VULS_VERSION}_linux_amd64.tar.gz
    - name: install future-vuls
      env: 
        VULS_VERSION: 0.10.0
      run: |
        wget https://github.com/future-architect/vuls/releases/download/v${VULS_VERSION}/future-vuls_${VULS_VERSION}_linux_amd64.tar.gz
        tar zxvf future-vuls_${VULS_VERSION}_linux_amd64.tar.gz
    - 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 ${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}