正式なドキュメントは英語版であり、この日本語訳はAI支援翻訳により作成された参考用のものです。日本語訳の一部の内容は人間によるレビューがまだ行われていないため、翻訳のタイミングにより英語版との間に差異が生じることがあります。最新かつ正確な情報については、英語版をご参照ください。

マルチコンテナスキャン

  • プラン: Free、Premium、Ultimate
  • 提供形態: GitLab.com、GitLab Self-Managed、GitLab Dedicated
  • ステータス: ベータ版

マルチコンテナイメージスキャンを使用して、単一パイプラインで複数のコンテナイメージをスキャンします。この機能を使用すると、次のことが可能になります:

  • 複数のイメージを並行してスキャンします。
  • 単一の設定ファイルでスキャンターゲットを設定します。
  • 既存のコンテナスキャンのワークフローと統合します。

マルチコンテナスキャンは、動的な子パイプラインを使用してスキャンを並行処理で実行し、パイプライン全体の実行時間を短縮します。

サポートされているイメージ

マルチコンテナスキャンは以下をサポートしています:

  • パブリックレジストリからのイメージ(Docker Hub、GitLab Container Registryなど)
  • プライベートレジストリからのイメージ(認証が設定されている場合)
  • マルチアーキテクチャイメージ

マルチコンテナスキャンを有効にする

前提条件:

  • Docker executorを備えたGitLab Runner。
  • リポジトリのルートにある.gitlab-multi-image.yml設定ファイル。
  • スキャンするコンテナイメージが少なくとも1つ。

マルチコンテナスキャンを有効にするには:

  1. リポジトリのルートに.gitlab-multi-image.ymlファイルを作成します:

       scanTargets:
         - name: alpine
           tag: latest
         - name: python
           tag: 3.9-slim
  2. .gitlab-ci.ymlにテンプレートを含めます:

       include:
         - template: Jobs/Multi-Container-Scanning.latest.gitlab-ci.yml
  3. 変更をコミットしてプッシュします。パイプラインはスキャンを自動的に実行します。

設定

.gitlab-multi-image.ymlファイルを編集して、マルチコンテナスキャンを設定します。

基本的な設定例

scanTargets:
  - name: alpine
    tag: "3.19"
  - name: ubuntu
    tag: "22.04"

すべてのオプションを使用した設定例

# Include license information in reports
includeLicenses: true

# Configure registry authentication
auths:
  registry.example.com:
    username: ${REGISTRY_USER}
    password: ${REGISTRY_PASSWORD}

# Allow insecure connections (not recommended for production)
allowInsecure: false

# Additional CA certificates for custom registries
additionalCaCertificateBundle: |
  -----BEGIN CERTIFICATE-----
  ...
  -----END CERTIFICATE-----

# Images to scan
scanTargets:
  - name: registry.example.com/myapp
    tag: "v1.2.3"
  - name: postgres
    tag: "15-alpine"

設定オプション

オプション必須説明
scanTargets配列はいスキャンするコンテナイメージのリスト
scanTargets[].name文字列はいイメージ名(オプションのレジストリ付き)
scanTargets[].tag文字列いいえイメージタグ(デフォルト: latest
scanTargets[].registry文字列いいえレジストリのオーバーライド
includeLicensesブール値いいえレポートにライセンス情報を含める
authsオブジェクトいいえレジストリの認証認証情報
allowInsecureブール値いいえ安全でないHTTPS接続を許可する
additionalCaCertificateBundle文字列いいえPEM形式の追加のCA証明書

一般的なシナリオ

次のセクションでは、ニーズに合わせて適用できるシナリオの例をいくつか説明します。

異なるレジストリからイメージをスキャンする

scanTargets:
  - name: docker.io/library/nginx
    tag: "1.25"
  - name: registry.gitlab.com/mygroup/myapp
    tag: "main"
  - name: gcr.io/myproject/service
    tag: "prod"

プライベートレジストリの認証を使用する

auths:
  registry.gitlab.com:
    username: ${CI_REGISTRY_USER}
    password: ${CI_REGISTRY_PASSWORD}
  docker.io:
    username: ${DOCKERHUB_USER}
    password: ${DOCKERHUB_TOKEN}

scanTargets:
  - name: registry.gitlab.com/private/image
    tag: latest

コンプライアンスのために特定のバージョンをスキャンする

scanTargets:
  - name: postgres
    tag: "14.10"
  - name: redis
    tag: "7.2.3"
  - name: nginx
    tag: "1.25.3"

CI/CD変数

CI/CD変数を使用して、マルチコンテナスキャンの動作をカスタマイズできます。

変数デフォルト説明
CONTAINER_SCANNING_DISABLED-スキャンを無効にするには、trueまたは1に設定します
AST_ENABLE_MR_PIPELINEStrueマージリクエストパイプラインでのスキャンを有効にする
CS_SCANNER_IMAGEregistry.gitlab.com/.../multiple-container-scanner:0使用するスキャナーイメージ

マルチコンテナスキャンを無効にする

スキャンを一時的に無効にするには:

variables:
  CONTAINER_SCANNING_DISABLED: "true"

MRパイプラインスキャンを無効にする

variables:
  AST_ENABLE_MR_PIPELINES: "false"

スキャン結果を表示する

パイプラインが完了した後:

  1. 上部のバーで、検索または移動先を選択して、プロジェクトを見つけます。
  2. マージリクエストまたはパイプラインの詳細ページに移動します。
  3. セキュリティタブを選択します。
  4. スキャンされたすべてのイメージから検出された脆弱性を表示します。

スキャンされた各イメージは以下を生成します:

  • コンテナスキャンレポート。
  • CycloneDX SBOM(ソフトウェア部品表)。
  • ライセンス情報(includeLicenses: trueの場合)。

パイプラインの構造

マルチコンテナスキャンは、2つのジョブを作成します:

  • multi-cs::generate-scan: スキャン設定を生成します
  • multi-cs::trigger-scan: 並行処理スキャンジョブで子パイプラインをトリガーします

子パイプラインには、scanTargetsのイメージごとに1つのジョブが含まれています。

トラブルシューティング

マルチコンテナスキャンを使用する場合、次の問題が発生する可能性があります。

パイプラインが「設定ファイルが見つかりません」というエラーで失敗する

原因: .gitlab-multi-image.ymlファイルが見つからないか、場所が間違っています。

解決策: .gitlab-multi-image.ymlがリポジトリのルートに存在することを確認します。

プライベートレジストリの認証が失敗する

原因: 無効な認証情報または認証設定が見つかりません。

解決策:

  1. 認証情報が正しく、正しく設定されていることを確認します。

       auths:
         registry.example.com:
           username: ${REGISTRY_USER}
           password: ${REGISTRY_PASSWORD}
  2. 設定 > **CI/CD > 変数に変数を定義します。

スキャンに時間がかかりすぎる

原因: 複数の大きなイメージが順番にスキャンされています。

解決策: マルチコンテナスキャンは、すでにスキャンを並行処理で実行しています。

以下を検討してください:

  • より小さなベースイメージを使用する
  • 特定イメージのバージョンのみをスキャンする
  • GitLab Runnerの並行処理設定を調整する

子パイプラインにレポートが表示されない

原因: トリガー設定でstrategy: mirrorが見つかりません。

解決策: これは、テンプレートでデフォルトで設定されています。テンプレートをカスタマイズした場合は、トリガージョブにstrategy: mirrorが含まれていることを確認してください。