Trivyの脆弱性スキャン結果をFutureVulsに連携してみた(CI/CD編)

2020.08.30

Trivy は OSS のコンテナ脆弱性スキャンツールで、コンテナの OS パッケージやアプリケーションの依存ライブラリの脆弱性を検出します。
前回、コマンドラインから Trivy でスキャンした結果を脆弱性管理ツールの FutureVuls に連携してみました。

今回は実践的な CI/CD パイプラインに組み込んだパターンを GitHub Actions で作ります。

やってみた

以下の手順で進めます。

  1. ワークフローファイルを作成
  2. シークレットを設定
  3. コンテナ用意
  4. 実行

1. ワークフローファイルを作成

ワークフローでは以下を行います。

  • GitHub Secrets に登録した認証情報をセット
  • trivy(コンテナの脆弱性をスキャン)をインストール
  • trivy-to-vuls(trivy のスキャン結果を vuls のレポート形式に変換)をインストール
  • future-vuls(スキャン結果を FutureVuls にアップロード)をインストール
  • コンテナをビルド
  • trivy コンテナをスキャンし、結果を FutureVuls にアップロード

ワークフローのファイルはこちらです。

./.github/workflows/scan.yml

name: FutureVuls Docker Image Scan
on:
  push
defaults:
  run:
      shell: bash
jobs:
  docker-scan:
    name: FutureVuls Docker Image Scan
    env:
      FVULS_AUTH_URL: "https://auth.vuls.biz/one-time-auth"
      FVULS_GROUP_ID: ${{ secrets.FVULS_GROUP_ID }}
      FVULS_SERVER_UUID: ${{ secrets.FVULS_SERVER_UUID }}
      FVULS_TOKEN: ${{ secrets.FVULS_TOKEN }}
    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: 
        IMAGE_NAME: "nginx"
      run: |
        docker build -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}

2. シークレットを設定

GitHub リポジトリから Settings > Secrets を開き、以下のシークレットを登録します。

  • FVULS_GROUP_ID
  • FVULS_SERVER_UUID
  • FVULS_TOKEN

FVULS_GROUP_ID で FutureVuls のグループ ID を設定します。グループ ID は管理画面の URL から確認できます。

FVULS_SERVER_UUID で FutureVuls で使用するサーバー ID (サーバーを一意に特定するための UUID )を設定します。(例)8E8D2C6F-8D70-4E5A-892D-52F3AD143D91

FVULS_TOKEN で FutureVuls のスキャントークンを設定します。スキャントークンは、管理画面の グループ設定 > トークン から確認します。

3. コンテナ用意

スキャンさせるコンテナを用意します。

./Dockerfile

FROM nginx:1.18

COPY ./html /usr/share/nginx/html

./html/index.html

<html>
<body>
    <h1>Hello World!</h1>
</body>
</html>

最終的なディレクトリ構成は以下となります。

.
├── .github
│   └── workflows
│       └── scan.yml
├── Dockerfile
└── html
    └── index.html

4. 実行

リポジトリにプッシュします。

$ git add -A
$ git commit -m 'initial commit'
$ git push

GitHub Actions のワークフローを確認します。
異常なく完了してました。

FutureVuls にスキャン結果が登録されていることを確認します。 [サーバ] タブをクリックすると nginx のコンテナが登録されていることがわかります。

[脆弱性] タブから、脆弱性も登録されていることを確認できました!

さいごに

Trivy でスキャンしたコンテナの情報を FutureVuls に登録を CI/CD パイプラインに組み込んでみました。

今回はスキャンして登録するまででしたが、実環境で使う際は、

  • スキャン後にコンテナレジストリに登録
  • 高スコアの脆弱性を通知
  • 高スコアの脆弱性がある場合は、後続のデプロイ処理を中断

といったフローを作ることで、より安全なコンテナの運用をできそうです!

参考