aquasecurity/trivyは、Dockerイメージの脆弱性を検知するOSSツールです。 FutureVulsではTrivyのスキャン結果を取り込み、FutureVuls上でコンテナイメージの脆弱性を管理できます。
サポート対象の言語やパッケージエコシステムの詳細は、Trivy Supported OSを参照してください。
その他のコンテナイメージスキャン方法として、Amazon ECRやGoogle Container Registryと連携し、コンテナレジストリ上にあるDockerイメージの脆弱性をスキャンする方法があります。
ただし、2022年7月時点ではTrivyのほうが脆弱性の検知精度が高く、イメージ中のライブラリのスキャンも可能なため、Trivyを用いた本方法の方がオススメです。
Trivyによるコンテナイメージスキャンでは、以下の2パターンをご利用いただけます。
Trivyをローカル環境にインストールし、コンテナイメージをスキャンした結果をFutureVulsにアップロードします。この方法では、通常版と軽量版の2つのインストールモードが選択できます。それぞれの違いは以下の通りです。
項目 | 説明 | 通常版 | 軽量版 |
---|---|---|---|
root権限 | インストール時にroot権限が必要かどうか | 必要 | 不要 |
対応環境 | セットアップ可能なローカル環境 | 参考 | Linux全般 |
定期スキャン | イメージを自動で定期的にスキャンするか | 対応 | 未対応 |
軽量版ではroot権限が不要な代わりに、コンテナイメージのスキャンを定期的に手動で行う必要があります。コンテナイメージの構成変更を常にFutureVulsに同期し脆弱性情報を最新化しておくためにも、どちらのモードも選択可能な場合は、基本的に通常版でのスキャンをご利用ください。
新しくコンテナイメージをスキャンし、FutureVulsに登録する場合は次の手順に従ってください。
サーバ追加
ボタンからダイアログを開き、コンテナイメージスキャン
を選択する
<イメージ名>:<タグ>
の形式で指定してください。<イメージ名>:<latest>
を指定してください。/opt/vuls-trivy-saas/vuls-trivy-saas.sh &> /opt/vuls-trivy-saas/vuls-trivy.log
以上で登録は完了です。 通常版をご利用の場合は、スキャナが1日1回自動で起動し、対象のコンテナイメージをスキャンしてFutureVulsに反映します。
通常版では、さらにいくつかのスキャンオプションがご利用いただけます。
また、スキャン結果が反映されない場合はコチラを参照ください。
FutureVulsに既に登録済みのコンテナイメージの構成情報を基に、脆弱性情報の最新化を行いたい場合は、FutureVuls上から手動スキャンを実行してください。
FutureVulsに登録済みのコンテナイメージに変更があった場合は、本手順に従ってFutureVulsに反映してください。
root
ユーザもしくはvuls-trivy-saas
ユーザで次のコマンドを実行してください。
/opt/vuls-trivy-saas/vuls-trivy-saas.sh &> /opt/vuls-trivy-saas/vuls-trivy.log
構成情報を更新
ボタンをクリックしてダイアログを開く
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を指定した場合は更新処理となる |
✅ |
VULS_SAAS_UUID
として指定してください。以下の環境変数はencrypted secretsにてセットすることを推奨しています。
この情報を使うとFutureVulsの指定したグループに対して、任意のサーバのスキャン結果のアップロードが可能となってしまいます。
この例では、スキャン用のスクリプトファイルを用いてスキャンします。
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を用いてスキャンします。
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を参照ください。