aquasecurity/trivyは、Dockerイメージの脆弱性を検知するOSSツールです。 FutureVulsではTrivyのスキャン結果を取り込み、FutureVuls上でコンテナイメージの脆弱性を管理できます。
サポート対象の言語やパッケージエコシステムの詳細は、「Trivy Supported OS」を参照してください。
その他のコンテナイメージスキャン方法として、Amazon ECRやGoogle Artifact 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に反映します。
通常版では、スキャン対象コンテナイメージ/ライブラリ等のスキャンオプションを config.toml
に手動で追加可能です。
詳しくは trivy スキャンの設定ページをご覧ください。
また、スキャン結果が反映されない場合はコチラを参照ください。
FutureVulsに既に登録済みのコンテナイメージの構成情報を基に、脆弱性情報の最新化を行いたい場合は、FutureVuls上から手動スキャンを実行してください。
FutureVulsに登録済みのコンテナイメージに変更があった場合は、本手順に従ってFutureVulsに反映してください。
root
ユーザもしくは vuls-trivy-saas
ユーザで次のコマンドを実行してください。
/opt/vuls-trivy-saas/vuls-trivy-saas.sh &> /opt/vuls-trivy-saas/vuls-trivy.log
構成情報を更新
ボタンをクリックしてダイアログを開く
CI/CDパイプラインに脆弱性スキャン処理を組み込むことで、危険な脆弱性が検知されたらBuildを失敗させたり、開発者にライブラリ等のバージョンアップを促すことができます。
このドキュメントでは、GitHub ActionsとAWS CodePipelineのCI/CDパイプランの中でコンテナイメージをスキャンした結果をFutureVulsにアップロードする方法を紹介します。
サンプルで定義が必要な環境変数は下記の通りです。
変数 | 説明 | 必須 |
---|---|---|
VULS_SAAS_GROUPID | スキャン結果をアップロードするグループのID。暗号化されたストアで保持してください。 | ✅ |
VULS_SAAS_TOKEN | スキャン権限をもったFutureVulsのトークン。暗号化されたストアで保持してください。 | ✅ |
DOCKERFILE_PATH | 生成するイメージの元となるDockerファイルのパス | ✅ |
TARGET_IMAGE | スキャンするイメージ<イメージ名>:<タグ> の形式で指定 | ✅ |
VULS_SAAS_UUID | 対象イメージを一意に識別するFutureVuls内のサーバUUID新規登録の場合は uuidgen コマンド等で生成した値を指定するFutureVuls上で同じイメージとして管理する場合はに登録済みのサーバUUIDを指定した場合は更新処理となる |
✅ |
VULS_SAAS_UUID
として指定してください。以下の環境変数はencrypted secretsにてセットすることを推奨しています。
万が一これらの値が外部に漏洩してしまった場合は、FutureVulsの指定したグループに対して任意のスキャン結果のアップロードが可能になってしまうのでご注意ください。
CICDパイプラインの中でTrivy連携用のスクリプトを用いてスキャンするGitHub Actionsの例です。
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@v4
- name: cached scan db
uses: actions/cache@v3
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
CICDパイプラインの中でTrivy連携用のスクリプトを用いてスキャンするbuildspec.ymlの例です。
version: 0.2
#env:
# variables:
#VULS_SAAS_GROUPID: "define in secret manager"
#VULS_SAAS_TOKEN: "define in secret manager"
#DOCKERFILE_PATH: "./Dockerfile"
#TARGET_IMAGE: "target_image:tag"
#VULS_SAAS_UUID: "xxxx-FutureVuls-Server-UUID-xxxxxxxx"
phases:
install:
runtime-versions:
python: latest
build:
commands:
- 'docker build -t $TARGET_IMAGE .'
post_build:
commands:
- 'curl -s https://installer.vuls.biz/vuls-trivy-light.sh | VULS_SAAS_GROUPID="$VULS_SAAS_GROUPID" VULS_SAAS_TOKEN=$VULS_SAAS_TOKEN TARGET_IMAGE=$TARGET_IMAGE VULS_SAAS_UUID=$VULS_SAAS_UUID bash -s inst'
- "echo scan results Sent to Fvuls on `date`"
FAQを参照ください。