GitLab Security Essentials - ハンズオンラボ: コンテナスキャン

このハンズオンガイドは、プロジェクトでコンテナスキャンを使用するプロセスを案内します。

推定所要時間: 15 〜 20 分

目標

多くのプロジェクトは、コンテナイメージに脆弱性が含まれている可能性のあるコンテナを使用しています。

このラボでは、コンテナの脆弱性をスキャンする方法を学びます。

タスク A. Docker イメージのビルド

このセクションでは、Docker イメージをビルドするジョブを定義します。CI/CD パイプラインジョブで Docker イメージをビルドするには、Docker executor を使用するように設定された GitLab Runner が必要です。

  1. Security Labs プロジェクトに移動します。

  2. コード > リポジトリ に移動し、.gitlab-ci.yml を編集します。

  3. .gitlab-ci.yml のステージリストの先頭(既存の test ステージの)に以下を追加して、build ステージを定義します。既存の test ステージと同じインデントになるようにしてください:

    stages:
      - build
      - test
    
  4. 新しいジョブに名前を付けて build ステージに割り当てるため、.gitlab-ci.yml の末尾に以下のコードを貼り付けます:

    build-and-push-docker-image:
      stage: build
    
  5. ジョブは Docker ツールを含む Docker イメージ上で実行する必要があります。このアプローチは「Docker in Docker」または「dind」と呼ばれることがあります。このタスクに適したテスト済みのバージョンのイメージを指定する必要があります。前のステップで追加した build-and-push-docker-image ジョブに以下を追加します:

    build-and-push-docker-image:
      stage: build
      image: docker:20.10.17
    
  6. ジョブには Docker in Docker ワークフローを有効にする 2 番目の Docker イメージも必要です。services キーワードを使用して 2 番目のイメージを指定します。ジョブ定義に以下を追加します:

    build-and-push-docker-image:
      stage: build
      image: docker:20.10.17
      services:
        - docker:20.10.17-dind
    
  7. 作成する Docker イメージの完全な名前とバージョンを保持する変数を定義すると便利です。GitLab が提供する定義済み変数(一般的に CI_ で始まる)から名前とバージョンを組み立てることができます。ジョブ定義に以下を追加します:

    build-and-push-docker-image:
      stage: build
      image: docker:20.10.17
      services:
        - docker:20.10.17-dind
      variables:
        IMAGE: $CI_REGISTRY_IMAGE/$CI_COMMIT_REF_SLUG:$CI_COMMIT_SHA
    
  8. Docker に TLS を使用しないよう指示する変数を設定すれば、セキュリティ証明書の設定を心配する必要がありません。DOCKER_TLS_CERTDIR 変数を追加します。

    build-and-push-docker-image:
      stage: build
      image: docker:20.10.17
      services:
        - docker:20.10.17-dind
      variables:
        IMAGE: $CI_REGISTRY_IMAGE/$CI_COMMIT_REF_SLUG:$CI_COMMIT_SHA
        DOCKER_TLS_CERTDIR: ""
    
  9. Dockerfile のレシピを使用して Docker イメージをビルドするよう Docker に指示します。script:docker-build の行を追加します。

    build-and-push-docker-image:
      stage: build
      image: docker:20.10.17
      services:
        - docker:20.10.17-dind
      variables:
        IMAGE: $CI_REGISTRY_IMAGE/$CI_COMMIT_REF_SLUG:$CI_COMMIT_SHA
        DOCKER_TLS_CERTDIR: ""
      script:
        - docker build --tag $IMAGE .
    

タスク B. Docker イメージをプロジェクトコンテナレジストリにプッシュ

ジョブがイメージをプッシュできるよう、プロジェクトのコンテナレジストリにログインする必要があります。定義済み変数に保存されているユーザー名、パスワード、レジストリ URL を使用してログインできます。

  1. script セクションの末尾に docker login の行を追加します。

    build-and-push-docker-image:
      stage: build
      image: docker:20.10.17
      services:
        - docker:20.10.17-dind
      variables:
        IMAGE: $CI_REGISTRY_IMAGE/$CI_COMMIT_REF_SLUG:$CI_COMMIT_SHA
        DOCKER_TLS_CERTDIR: ""
      script:
        - docker build --tag $IMAGE .
        - docker login --username $CI_REGISTRY_USER --password $CI_REGISTRY_PASSWORD $CI_REGISTRY
    
  2. 単一の Docker コマンドでイメージをプッシュできます。script セクションの末尾に docker push の行を追加します。

    build-and-push-docker-image:
      stage: build
      image: docker:20.10.17
      services:
        - docker:20.10.17-dind
      variables:
        IMAGE: $CI_REGISTRY_IMAGE/$CI_COMMIT_REF_SLUG:$CI_COMMIT_SHA
        DOCKER_TLS_CERTDIR: ""
      script:
        - docker build --tag $IMAGE .
        - docker login --username $CI_REGISTRY_USER --password $CI_REGISTRY_PASSWORD $CI_REGISTRY
        - docker push $IMAGE
    
  3. 完成したジョブ定義は以下のようになります。.gitlab-ci.yml のジョブ定義に必要な修正を加えてください。

    build-and-push-docker-image:
      stage: build
      image: docker:20.10.17
      services:
        - docker:20.10.17-dind
      variables:
        IMAGE: $CI_REGISTRY_IMAGE/$CI_COMMIT_REF_SLUG:$CI_COMMIT_SHA
        DOCKER_TLS_CERTDIR: ""
      script:
        - docker build --tag $IMAGE .
        - docker login --username $CI_REGISTRY_USER --password $CI_REGISTRY_PASSWORD $CI_REGISTRY
        - docker push $IMAGE
    
  4. 適切なコミットメッセージ(Adding a Docker build job)で main ブランチに変更をコミットします。

  5. ビルド > パイプライン に移動して新しいパイプラインの進行状況を確認します。パイプラインをクリックしてビルドジョブの CI 出力を確認します。

  6. パイプラインの実行が完了したら、左ナビゲーションペインで デプロイ > コンテナレジストリ をクリックします。ジョブが新しい Docker イメージを作成し、プロジェクトのコンテナレジストリにプッシュしたことを確認します。

タスク C. コンテナスキャンの有効化

アプリケーションの Docker イメージには既知の脆弱性が含まれている可能性があります。これらの脆弱性が本番環境に到達するのを防ぐために、コンテナスキャンで検出できます。Docker イメージがビルドされてプッシュされているので、コンテナスキャンを有効化できます。

  1. .gitlab-ci.yml の既存の include: セクションにコンテナスキャンコンポーネントを追加します:

    - component: ilt.gitlabtraining.cloud/components/container-scanning/container-scanning@~latest
    

    これはコンポーネントリストのどこにでも追加できます。

  2. コンテナスキャナーがスキャンするコンテナを認識できるようにするため、container_scanning ジョブをオーバーライドする必要があります。以下のコードをコピーして container_scanning ジョブの CS_IMAGE 変数をオーバーライドします:

    container_scanning:
      variables:
        CS_IMAGE: $CI_REGISTRY_IMAGE/$CI_COMMIT_REF_SLUG:$CI_COMMIT_SHA
    
  3. 適切なコミットメッセージで変更をコミットします。

  4. ビルド > パイプライン に移動して新しいパイプラインの進行状況を確認します。

  5. container_scanning ジョブを開いて CI 出力を確認します。パイプラインの実行が完了するまで待ちます。

タスク D. 結果の確認

  1. Secure > 脆弱性レポート に移動します。

  2. レポートタイプ フィルターを選択し、オプションから コンテナスキャン を選択します。

  3. 表示されている脆弱性は、作成した Docker コンテナ内で検出された脆弱性です。個々の脆弱性をクリックして詳細を確認します。

ラボガイド完了

このラボ演習が完了しました。このコースの他のラボガイドを参照できます。

ご提案・改善点

ラボに変更を加えたい場合は、マージリクエストで変更内容を送信してください。