Google Cloudとコンテナの継続的なセキュリティ
本文の内容は、2020年2月20日にSysdigの Fede Barcelonaが投稿したブログ(https://sysdig.com/blog/image-scanning-circleci/)を元に日本語に翻訳・再構成した内容となっております。
このブログ投稿では、Sysdig Secureを使用してCircleCIにおけるコンテナイメージスキャンを実行する方法について説明します。イメージスキャンにより、DevOpsチームは、既知の脆弱性や不適切な構成などの問題をCI/CDパイプラインで直接検出および解決できます。
Sysdig Secureを使用すると、脆弱性が実稼働環境に到達する前に脆弱性をブロックし、デベロッパーがコンテキストを保持している間にそれらを迅速に修正するイメージポリシーをエンフォースできます。
イメージスキャンは次のような問題を検出できます。
Sysdig Secureインラインスキャンのユニークな利点の1つは、結果のみがSysdig Secureバックエンドに送信されることです。そこで、結果を確認し、脆弱性と構成チェックを完全に追跡できます。Sysdigのバックエンドは、SaaSとして、または独自の環境でair-gapped(インターネット接続がない環境)で利用できます。このアプローチでは、イメージをバックエンドに送信したり、ステージングリポジトリに公開する必要がないため、イメージをコントロールを失う事はありません。
Sysdig Secureを使用すると、Kubernetesライフサイクルの構築、実行、応答の各段階にセキュリティとコンプライアンスを組み込むことができます。つまり、単一のワークフローを使用して、CI/CDパイプラインの脆弱性と設定ミスをスキャンし、PSPなどのネイティブKubernetesコントロールを使用して実行時に脅威をブロックします。さらに、Sysdigは、より迅速なインシデント対応とコンテナーフォレンジックを可能にします。
CircleCIは、構築、テスト、およびデリバリープロセスを自動化することにより、チームが質の高いプロジェクトを迅速に構築できる継続的統合および継続的デリバリープラットフォームです。Sysdigのインラインスキャンを使用してコンテナーレジストリに送信する前にイメージをスキャンするなど、このパイプラインに他のステップを統合できます。
Sysdig Secureを使用したイメージスキャンにおけるCircleCIのセットアップ
この例では、DockerでOCIイメージを作成します。CircleCIはイメージをコンテナレジストリに送信する前にスキャンをトリガーし、準拠していないイメージが実稼働環境に到達するのを防ぎます。
CircleCIでのセキュリティスキャンの前提条件
以下の例を再現するには、次のものが必要です。
CircleCIプロジェクトの構成
CircleCiプロジェクトは、コードリポジトリ、CI/CDパイプライン、および追加の構成をリンクします。CircleCIでは、まずリポジトリ情報を設定し、次に特定のリポジトリのプロジェクトを設定します。
GitHubアカウントを使用してCircleCIにログインした場合、githubリポジトリはリポジトリリストに既に表示されます。その後、「Set Up Project」ボタンをクリックして、パイプラインでの作業を開始できます
次の画面では、いくつかのパイプラインテンプレートが表示されます。それらのほとんどは、簡単なプロジェクトを作成するためにそのまま使用できます。 このケースでは、新しいパイプラインをゼロから構築します。
実行するパイプラインを定義する準備が整いました。CircleCIで編集するか、コードリポジトリの .circleci/config.ymlフォルダーにファイルを作成できます。
version: 2 jobs: build: machine: true environment: IMAGE_NAME: "sysdiglabs/dummy-vuln-app:latest" SCAN_IMAGE_NAME: "sysdiglabs/secure_inline_scan:latest" steps: # checkout the source code - checkout # login - run: | docker login --username "$DOCKER_USER" --password "$DOCKER_PASS" # build the application image - run: docker build -t "$IMAGE_NAME" . # scan the image - run: docker run --rm -v /var/run/docker.sock:/var/run/docker.sock $SCAN_IMAGE_NAME /bin/inline_scan analyz e -s https://secure.sysdig.com -k "$SYSDIG_SECURE_TOKEN" "$IMAGE_NAME" # deploy the image
- run: docker push "$IMAGE_NAME"
イメージはDockerを使用して構築され、Dockerfileはリポジトリのルートにあり、以前の環境変数は「IMAGE_NAME」として定義されています。
docker build -t "$IMAGE_NAME" .
脆弱性スキャンは、イメージがビルドされた後、ビルドが成功した場合にのみ行われます。スキャナーはコンテナ内でも実行されており、どこでも簡単にスキャンできます。
docker run --rm \ -v /var/run/docker.sock:/var/run/docker.sock \ $SCAN_IMAGE_NAME \ /bin/inline_scan analyze \ -s https://secure.sysdig.com \ -k "$SYSDIG_SECURE_TOKEN" \
"$IMAGE_NAME"
パイプラインを開始する前に、パイプラインで参照されるいくつかの環境変数(コンテナレジストリ資格情報とSysdig Secure APIトークン)を定義します。これらはクレデンシャルであるため、パイプライン自体のコードに保存を避ける必要があります。また、パイプライン実行のログにも保存しないようにします。
セキュリティスキャンは、イメージが作成された同じランナーで完全に実行されてから、レジストリにプッシュされ、結果がSysdig Secureバックエンドに送信されます。 ここで、イメージスキャンの結果を確認できます。
この場合、スキャンは失敗し、スクリプトは0とは異なるエラーコードを返します。これは、最終イメージが構成済みポリシーに対する検証に失敗するために発生します。そのため、パイプラインは自動的に停止します。そして次のステップであるイメージレジストリへのイメージプッシュは行われません。
脆弱性スキャンの結果に関する詳細情報が必要な場合は、Sysdig Secureで確認できます。
402個の脆弱性があり、そのうち15個は重大度が高いと見なされています。 また、Dockerfileがブラックリストに登録されているポートをエクスポートしていることがわかります。ポリシーは、次の条件でプロセスを停止するように構成されました。
CircleCIでのスキャンが成功すると、パイプラインは実行を継続し、イメージはイメージリポジトリに公開されます。
docker push "$IMAGE_NAME"
Sysdig Secureイメージスキャンを使用すると、既知の脆弱性を見つけて、セキュリティのベストプラクティスに対して構成を検証できます。これには、Dockerfileの指示、ホワイトリストまたはブラックリスト固有のパッケージ、Java JAR/WARファイルやJavascriptのnpm、Pythonのpip、Rubyのgemなどの言語固有のパッケージマネージャーなど、ベースイメージの上にインストールされたサードパーティライブラリが含まれます。
インフラストラクチャからパブリックまたはステージングレジストリに送信せずに、CircleCI CI/CDパイプライン内でコンテナイメージをスキャンし、構成を検証し、脆弱性がKubernetes環境に到達するのを防ぎます。
より詳しく知りたい方は、https://sysdig.jp/を是非参照ください。試されたい方は、https://sysdig.jp/ 内の無料お試しをクリックすると14日間のトライアルライセンスが発行されます。