GitLab Security Essentials - ハンズオンラボ: コンテナスキャンの有効化と設定
推定所要時間: 15 分
目標
多くのプロジェクトは、コンテナイメージに脆弱性を含む可能性のあるコンテナの使用に依存しています。
このラボでは、コンテナ内の脆弱性をスキャンする方法を学びます。
前提条件
ラボ 1 で作成した Security Labs プロジェクトをブラウザで開きます。
タブを閉じたかリンクを失った場合は、ブラウザのタブを開いて URL に https://gitlab.com/gitlab-learn-labs と入力すると、プロジェクトが履歴に表示されるはずです。
このラボおよびその後のすべてのラボを開始する前に、前のラボで有効化したスキャナーを無効化してパイプラインの実行時間を短縮してください。これはラボ 2 で完了しているはずです。
タスク A. Dockerfile を追加する
Dockerfileは、Docker がアプリケーションを Docker イメージにアセンブルする方法を伝える「レシピ」です。単一ファイルの Python アプリケーションを Python 3.4 Docker イメージにインストールし、そのスタック全体を新しい Docker イメージにパッケージ化するDockerfileを作成します。
Code > Repository に移動します。
リポジトリファイルリストの上部で (+) > This directory > New file をクリックします。
File name フィールドに
Dockerfileと入力します。業界標準に合わせて最初の文字を大文字にすることが重要です。Dockerfileはアプリケーションをインストールする Linux イメージを指定する必要があります。このラボでは、コンテナスキャナーが見つけるためのセキュリティ脆弱性を持つ古いバージョンの Python を使用します。Dockerfileに以下をペーストします。FROM python:3.4-alpineDockerfile はアプリケーションを上記で指定した Linux イメージに追加する必要があります。
Dockerfileの末尾に以下をペーストします。ADD main.py .完成した
Dockerfileは次のようになります。必要に応じて修正してください。FROM python:3.4-alpine ADD main.py .コミットメッセージを追加し、ターゲットブランチを
mainに設定して Commit changes をクリックします。
タスク B. Docker イメージのビルド
このセクションでは、Docker イメージをビルドするジョブを定義します。CI/CD パイプラインジョブで Docker イメージをビルドするには、Docker エグゼキューターを使用するよう設定された GitLab Runner を使用する必要があります。
Code > Repository に移動して
.gitlab-ci.ymlを編集します。.gitlab-ci.ymlの stages リストの先頭(-testステージの前)に以下をペーストしてbuildステージを定義します。既存の- testエントリと同じインデントにしてください。stages: - build - test新しいジョブに名前を付けて build ステージに割り当てるために、
.gitlab-ci.ymlの末尾に以下をペーストします。build-and-push-docker-image: stage: buildジョブは Docker ツールを含む Docker イメージ上で実行する必要があります。このアプローチは「Docker in Docker」または「dind」と呼ばれることがあります。このタスクでテスト済みの動作が確認されているバージョンのイメージを指定する必要があります。前のステップで追加した
build-and-push-docker-imageジョブの下に以下をペーストします。build-and-push-docker-image: stage: build image: docker:20.10.17ジョブには、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作成する 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_SHADocker に 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: ""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 .
タスク C. Docker イメージをプロジェクトコンテナレジストリにプッシュする
ジョブはプロジェクトのコンテナレジストリにログインして、イメージをプッシュする必要があります。定義済み変数に保存されたユーザー名、パスワード、レジストリ URL を使用してログインできます。
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単一の 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完成したジョブ定義は次のようになります。
.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適切なコミットメッセージ(
Adding a docker file definition)で変更をmainブランチにコミットします。Build > Pipelines に移動して新しいパイプラインの進行状況を確認します。パイプラインをクリックしてビルドジョブの CI 出力を確認します。
パイプラインの実行が完了したら、左ナビゲーションペインに移動して Deploy > Container Registry をクリックします。ジョブが新しい Docker イメージを作成してプロジェクトのコンテナレジストリにプッシュしたことを確認します。
タスク D. コンテナスキャンの有効化
アプリケーションの Docker イメージには既知の脆弱性が含まれている場合があります。これらの脆弱性が本番環境に到達するのを防ぐために、コンテナスキャンで検出できます。Docker イメージのビルドとプッシュが行われるようになったので、コンテナスキャンを有効化できます。
.gitlab-ci.ymlの既存のinclude:セクションにコンテナスキャンのテンプレートを追加します。include: - template: Security/SAST.gitlab-ci.yml - template: Security/Secret-Detection.gitlab-ci.yml - template: Security/Dependency-Scanning.gitlab-ci.yml - template: Security/Container-Scanning.gitlab-ci.ymlこれはテンプレートのリストのどこにでも追加できます。
また、コンテナスキャンツールにスキャンするイメージを伝える必要があります。
secret_detectionジョブの下に次のコードを追加します。
container_scanning:
variables:
CS_IMAGE: $CI_REGISTRY_IMAGE/$CI_COMMIT_REF_SLUG:$CI_COMMIT_SHA
適切なコミットメッセージで変更をコミットします。
Build > Pipelines に移動して新しいパイプラインの進行状況を確認します。
container_scanningジョブを開いて CI 出力を確認します。パイプラインの実行が完了するまで待ちます。
タスク E. 結果の表示
Secure > Vulnerability Report に移動します。
Tool ドロップダウンで Container Scanning をクリックします。
表示された脆弱性は、作成した Docker コンテナ内で検出された脆弱性です。個々の脆弱性をクリックして詳細を確認します。
タスク F. ラボのパイプラインのクリーンアップ
Code > Repository に移動します。
.gitlab-ci.ymlファイルを編集します。以下をコピー&ペーストして
.gitlab-ci.ymlの内容をすべて上書きします。これにより、パイプラインを遅くする不要なスキャナーが実行されないようにします。.gitlab-ci.ymlファイルの書式を維持するために SAST ジョブは残します。stages: - test include: - template: Security/SAST.gitlab-ci.ymlコミットメッセージを
Lab 3 pipeline resetに設定して、変更をmainブランチにコミットします。
ラボガイド完了
このラボ演習を完了しました。このコースの他のラボガイドを参照できます。
ご提案
GitLab Security Essentials ハンズオンガイドへの変更を提案される場合は、マージリクエストで提出してください。
