CI/CDパイプラインに組み込む#
CI/CDパイプラインにコンテナイメージスキャンやアプリケーション依存ライブラリスキャンの処理を組み込むことで、脆弱性の早期発見が可能となり、リリース前に高リスクの脆弱性を排除できます。
コンテナイメージのスキャンをCI/CDに組み込む#
ここでは、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を指定した場合は更新処理となる |
✅ |
- FutureVuls上で既に管理しているイメージの構成情報を更新する場合は、対象イメージのUUIDを
VULS_SAAS_UUID
として指定してください。
環境変数の設定
以下の環境変数はencrypted secretsにてセットすることを推奨しています。
- VULS_SAAS_GROUPID
- VULS_SAAS_TOKEN
万が一これらの値が外部に漏洩してしまった場合は、FutureVulsの指定したグループに対して任意のスキャン結果のアップロードが可能になってしまうのでご注意ください。
GitHub Actionsを用いてCI/CDパイプラインにコンテナイメージスキャンを組み込む#
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
AWS CodePipelineを用いてCI/CDパイプラインに脆弱性スキャンを組み込む#
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`"
アプリケーションライブラリのスキャンをCI/CDに組み込む#
ここでは、GitHub ActionsとAWS CodePipelineのCI/CDパイプランの中でアプリケーションの依存ライブラリをスキャンした結果をFutureVulsにアップロードする方法を紹介します。
git push時にライブラリの脆弱性をスキャンする#
Git push時にアプリケーションライブラリをスキャンした結果を FutureVuls にアップロードします。このドキュメントではGitHub Actions を例に紹介します。 GitHub Actions のサンプル YAML ファイルは以下のとおりです。
サンプルで使用する環境変数#
変数 | 説明 | 必須 |
---|---|---|
VULS_SAAS_GROUPID | スキャン結果をアップロードするグループのID | ✅ |
VULS_SAAS_TOKEN | スキャン権限をもったトークン | ✅ |
TARGET_LIBRARY | スキャン対象ディレクトリのパス リポジトリ内すべてを対象とする場合は ${{ github.workspace }} のままでよい |
✅ |
VULS_SAAS_UUID | FutureVulsで管理する用のUUID 新規登録の場合は uuidgen コマンド等で生成した値を指定する |
✅ |
ACTIONS_RUNTIME_TOKEN | 認証させる GitHub トークン RATELIMIT によるエラーが発生する場合に必要 |
FutureVuls上で既に管理しているライブラリの構成情報を更新する場合は、対象ライブラリのUUIDを VULS_SAAS_UUID
として指定してください。
環境変数の設定
以下の環境変数はencrypted secretsにてセットすることを推奨しています。
- VULS_SAAS_GROUPID
- VULS_SAAS_TOKEN
この情報を使うとFutureVulsの指定したグループに対して、任意のサーバのスキャン結果のアップロードが可能となってしまいます。
スキャン用のスクリプトファイルを用いてスキャンします。
name: FutureVuls library Scan
on:
push:
defaults:
run:
shell: bash
jobs:
docker-test:
name: FutureVuls library Scan
env:
VULS_SAAS_GROUPID: ${{ secrets.VULS_SAAS_GROUPID }}
VULS_SAAS_TOKEN: ${{ secrets.VULS_SAAS_TOKEN }}
TARGET_LIBRARY: "${{ github.workspace }}"
VULS_SAAS_UUID: "xxxx"
ACTIONS_RUNTIME_TOKEN: ${{ secrets.GITHUB_TOKEN }}
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
run:
curl -s https://installer.vuls.biz/vuls-trivy-light.sh | bash -s inst
GitHub ActionsでPush時にLockFileを自動更新する方法#
futurevuls/fvuls-lockfile-uploaderを使い、git push
時にLockFileが更新されたかをチェックし、LockFileが更新された場合のみ、FutureVuls登録済みのLockFileをREST API経由で更新する方法を解説します。
下記のサンプルでは、release
ブランチにプッシュされた場合かつ、./go.sum
または ./web/yarn.lock
が変更された場合のみ実行されます。
サンプル内の以下の環境変数は、Encrypted Secretsにてセットして下さい。
環境変数名 | 確認方法 |
---|---|
FVULS_SERVER_UUID | サーバ一覧から確認する |
FVULS_TOKEN | グループ設定 > FutureVuls APIから確認する |
on:
push:
## https://docs.github.com/en/actions/learn-github-actions/workflow-syntax-for-github-actions#onpushpull_requestpaths
paths:
- 'go.sum'
- 'web/yarn.lock'
branches:
- release
name: Check lockfiles
jobs:
build:
env:
FVULS_SERVER_UUID: ${{ secrets.FVULS_SERVER_UUID }}
FVULS_TOKEN: ${{ secrets.FVULS_TOKEN }}
name: Upload lockfile
runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Upload go.sum
uses: futurevuls/fvuls-lockfile-uploader@v1
with:
repoName: ${{ github.repository }}
path: './go.sum'
- name: Upload web/yarn.lock
uses: futurevuls/fvuls-lockfile-uploader@v1
with:
repoName: ${{ github.repository }}
path: './web/yarn.lock'