Docker Hardened Images をスキャンする
Docker Hardened Images(DHI)はデフォルトでセキュアに設計されていますが、他のコンテナイメージと同様に、脆弱性管理の一環として定期的にスキャンすることが重要です。
DHI は、Docker Scout、Grype、Trivy など、標準的なイメージに使用しているツールと同じものを使ってスキャンできます。
DHI は一般的なフォーマットと標準に従っているため、既存のセキュリティツールチェーンとの互換性が保たれています。
なお、スキャンを実行するには、イメージが事前に Docker Hub 上の Organization にミラーリングされている必要があります。
Docker Scout は、Docker Hub 上でミラーリングされたすべての DHI リポジトリに対して追加費用なしで自動的に有効化されます。 スキャン結果は、Docker Hub の UI 上で Organization のリポジトリにアクセスすれば直接確認できます。
Docker Scout
Docker Scout は Docker Desktop および Docker CLI に統合されており、脆弱性情報、CVE サマリ、修正ガイダンスへのリンクなどを提供します。
Docker Scout を使って DHI をスキャンする
Docker Hardened Image を Docker Scout でスキャンするには、以下のコマンドを実行します:
$ docker scout cves <your-namespace>/dhi-<image>:<tag> --platform <platform>
出力例:
v SBOM obtained from attestation, 101 packages found
v Provenance obtained from attestation
v VEX statements obtained from attestation
v No vulnerable package detected
...
より詳細なフィルタリングや JSON 形式での出力方法については、Docker Scout CLI リファレンス を参照してください。
CI/CD で Docker Scout を使って DHI スキャンを自動化する
Docker Scout を CI/CD パイプラインに統合することで、Docker Hardened Images(DHI)を元にビルドされたイメージが、ビルド時点で既知の脆弱性を含まないことを自動的に検証できます。
このプロアクティブなアプローチにより、開発ライフサイクル全体を通じてイメージのセキュリティ整合性を維持できます。
GitHub Actions ワークフローの例
以下は、Docker イメージをビルドして Docker Scout でスキャンする GitHub Actions のサンプルワークフローです:
name: DHI Vulnerability Scan
on:
push:
branches: [ main ]
pull_request:
branches: [ "**" ]
env:
REGISTRY: docker.io
IMAGE_NAME: ${{ github.repository }}
SHA: ${{ github.event.pull_request.head.sha || github.event.after }}
jobs:
scan:
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
pull-requests: write
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Log in to Docker Hub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Build Docker image
run: |
docker build -t ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ env.SHA }} .
- name: Run Docker Scout CVE scan
uses: docker/scout-action@v1
with:
command: cves
image: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ env.SHA }}
only-severities: critical,high
exit-code: true
exit-code: true
を指定すると、重大(critical)または高(high)深刻度の脆弱性が検出された場合にワークフローが失敗するため、脆弱なイメージが本番にデプロイされるのを防げます。
CI での Docker Scout の使い方についてさらに詳しく知りたい方は、他のシステムとの統合方法をご覧ください。
Grype
Grype は、NVD やディストリビューションのアドバイザリなどの脆弱性データベースをもとに、コンテナイメージをスキャンするオープンソースのツールです。
Grype を使って DHI をスキャンする
Grype をインストールした後、Docker Hardened Image を pull して、以下のようにスキャンを実行できます:
$ docker pull <your-namespace>/dhi-<image>:<tag>
$ grype <your-namespace>/dhi-<image>:<tag>
NAME INSTALLED FIXED-IN TYPE VULNERABILITY SEVERITY EPSS% RISK
libperl5.36 5.36.0-7+deb12u2 (won't fix) deb CVE-2023-31484 High 79.45 1.1
perl 5.36.0-7+deb12u2 (won't fix) deb CVE-2023-31484 High 79.45 1.1
perl-base 5.36.0-7+deb12u2 (won't fix) deb CVE-2023-31484 High 79.45 1.1
...
スキャン時に --vex
フラグを指定することで、既知だが悪用不可能と判断された CVE(VEX ステートメント)を除外することができます。
詳しくは、VEX ステートメントを使って既知の悪用不可 CVE を除外する セクションをご覧ください。
Trivy
Trivy は、コンテナやその他のアーティファクト向けのオープンソース脆弱性スキャナです。
OS パッケージやアプリケーション依存関係に含まれる脆弱性を検出できます。
Trivy を使って DHI をスキャンする
Trivy をインストール後、Docker Hardened Image を pull し、以下のコマンドでスキャンを実行します:
$ docker pull <your-namespace>/dhi-<image>:<tag>
$ trivy image <your-namespace>/dhi-<image>:<tag>
出力例:
Report Summary
┌──────────────────────────────────────────────────────────────────────────────┬────────────┬─────────────────┬─────────┐
│ Target │ Type │ Vulnerabilities │ Secrets │
├──────────────────────────────────────────────────────────────────────────────┼────────────┼─────────────────┼─────────┤
│ <namespace>/dhi-<image>:<tag> (debian 12.11) │ debian │ 66 │ - │
├──────────────────────────────────────────────────────────────────────────────┼────────────┼─────────────────┼─────────┤
│ opt/python-3.13.4/lib/python3.13/site-packages/pip-25.1.1.dist-info/METADATA │ python-pkg │ 0 │ - │
└──────────────────────────────────────────────────────────────────────────────┴────────────┴─────────────────┴─────────┘
スキャン時に --vex
フラグを指定することで、既知だが悪用不可能と判断された CVE(VEX ステートメント)を除外することができます。
詳しくは、VEX ステートメントを使って既知の悪用不可 CVE を除外する セクションをご覧ください。
VEX を使って既知の悪用不可能な CVE を除外する
Docker Hardened Images には、署名付きの VEX(Vulnerability Exploitability eXchange)アテステーションが含まれており、イメージの実行時動作に影響しない脆弱性を識別します。
Docker Scout を使用する場合、VEX ステートメントは自動的に適用され、追加設定は不要です。
VEX に対応したツールで使用するために、VEX アテステーションを JSON ファイルとして手動で取得したい場合は、以下のコマンドを実行します:
$ docker scout attest get \
--predicate-type https://openvex.dev/ns/v0.2.0 \
--predicate \
<your-namespace>/dhi-<image>:<tag> --platform <platform> > vex.json
たとえば:
$ docker scout attest get \
--predicate-type https://openvex.dev/ns/v0.2.0 \
--predicate \
docs/dhi-python:3.13 --platform linux/amd64 > vex.json
このコマンドにより、指定したイメージに対する VEX ステートメントを含む vex.json
ファイルが作成されます。
このファイルは、VEX に対応したスキャナに読み込ませることで、悪用不可能と判断された既知の脆弱性を除外することができます。
たとえば、Grype や Trivy では、--vex
フラグを使用して以下のようにスキャンできます:
$ grype <your-namespace>/dhi-<image>:<tag> --vex vex.json