GitLab Security Essentials - ハンズオンラボ: コンテナスキャン
推定所要時間: 15 〜 20 分
目標
多くのプロジェクトは、コンテナイメージに脆弱性が含まれている可能性のあるコンテナを使用しています。
このラボでは、コンテナの脆弱性をスキャンする方法を学びます。
タスク A. Docker イメージのビルド
このセクションでは、Docker イメージをビルドするジョブを定義します。CI/CD パイプラインジョブで Docker イメージをビルドするには、Docker executor を使用するように設定された GitLab Runner が必要です。
Security Labs プロジェクトに移動します。
コード > リポジトリ に移動し、
.gitlab-ci.ymlを編集します。.gitlab-ci.ymlのステージリストの先頭(既存の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 .
タスク B. 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 build job)でmainブランチに変更をコミットします。ビルド > パイプライン に移動して新しいパイプラインの進行状況を確認します。パイプラインをクリックしてビルドジョブの CI 出力を確認します。
パイプラインの実行が完了したら、左ナビゲーションペインで デプロイ > コンテナレジストリ をクリックします。ジョブが新しい Docker イメージを作成し、プロジェクトのコンテナレジストリにプッシュしたことを確認します。
タスク C. コンテナスキャンの有効化
アプリケーションの Docker イメージには既知の脆弱性が含まれている可能性があります。これらの脆弱性が本番環境に到達するのを防ぐために、コンテナスキャンで検出できます。Docker イメージがビルドされてプッシュされているので、コンテナスキャンを有効化できます。
.gitlab-ci.ymlの既存のinclude:セクションにコンテナスキャンコンポーネントを追加します:- component: ilt.gitlabtraining.cloud/components/container-scanning/container-scanning@~latestこれはコンポーネントリストのどこにでも追加できます。
コンテナスキャナーがスキャンするコンテナを認識できるようにするため、
container_scanningジョブをオーバーライドする必要があります。以下のコードをコピーしてcontainer_scanningジョブのCS_IMAGE変数をオーバーライドします:container_scanning: variables: CS_IMAGE: $CI_REGISTRY_IMAGE/$CI_COMMIT_REF_SLUG:$CI_COMMIT_SHA適切なコミットメッセージで変更をコミットします。
ビルド > パイプライン に移動して新しいパイプラインの進行状況を確認します。
container_scanningジョブを開いて CI 出力を確認します。パイプラインの実行が完了するまで待ちます。
タスク D. 結果の確認
Secure > 脆弱性レポート に移動します。
レポートタイプ フィルターを選択し、オプションから コンテナスキャン を選択します。
表示されている脆弱性は、作成した Docker コンテナ内で検出された脆弱性です。個々の脆弱性をクリックして詳細を確認します。
ラボガイド完了
このラボ演習が完了しました。このコースの他のラボガイドを参照できます。
ご提案・改善点
ラボに変更を加えたい場合は、マージリクエストで変更内容を送信してください。
