ブログ

Google Cloud Buildにおけるイメージスキャン

Google Cloud Buildにおけるイメージスキャン

本文の内容は、2020年10月6日にVicente Herrera Garcíaが投稿したブログ(https://sysdig.com/blog/image-scanning-google-cloud-build/)を元に日本語に翻訳・再構成した内容となっております。

この記事では、Sysdig Secure DevOps プラットフォームを使用して Google Cloud Build パイプラインにインラインイメージスキャンを追加する方法を学びます。コンテナイメージをビルドし、イメージをスキャンし、レジストリにプッシュする基本的なワークフローを作成する方法を紹介します。また、リスクの高い脆弱性が検出された場合にビルドを停止するためのスキャンポリシーのカスタマイズも行います。

0.png

Google Cloud Buildとは?

Cloud Buildは、Google Cloud Platformのインフラ上でビルドを実行するCI/CDサービスです。Google Cloud BuildでのCI/CDはビルドにワークフローを使用し、ステップはYAML仕様でコードとして定義され、コンテナイメージから実行されます。

その意味では、GitHubのアクションTektonのパイプラインAzure Devopsのパイプラインに似ています。

イメージをスキャンするCloud Buildのワークフローを作成する

基本的な「イメージスキャン for Google Cloud Build」のサンプルプロジェクトを4つのステップで追っていきます。

  1. コンテナイメージを構築する。
  2. Sysdig Secure Platformとの通信に必要なシークレットトークンを取得します。
  3. Sysdig Secureでコンテナイメージをスキャンします。
  4. コンテナイメージをレジストリにプッシュします。

各ステップは、前のステップが成功した場合のみ実行されます。

1.png

つまり、Sysdig上でイメージスキャンポリシーを「Stop」アクションで設定し、スキャンが失敗した場合、イメージはレジストリにプッシュされないということです。

イメージスキャンのCloud Buildワークフローの前提条件

Google Cloud Build でイメージスキャンを使用するためには、いくつかの前提条件を設定する必要があります。これは最低限の例なので、特定のツールやニーズに合わせて設定する必要があるかもしれません。

ここでは、以下のものを使用します:

  • Google Cloud ソースリポジトリ:コードを保存するための git リポジトリ、Node.js で書かれたコンテナ化された "hello word"。
  • Google Container Registry: ビルドするイメージをプッシュするためのレジストリ。
  • Google Secret Manager:Sysdig Secure APIトークンを保存するためのもの。Cloud Buildエージェントがシークレットにアクセスできるように、権限を付与する必要があります。

それでは、それぞれのGoogle Cloudリソースを有効化して設定する方法を見ていきましょう。

Google Cloudソースリポジトリの設定

まずは Google Cloud Source Repository のページにアクセスして、新しいリポジトリを作成します。

2.png

新規プロジェクトを作成するか、使用するプロジェクトがある場合は既存のプロジェクトを選択します。

作成ボタンを押します。

リポジトリが作成されると、コンピュータ上でリポジトリをクローンする方法が表示されます。

ここでは、Node.jsの公式サイトに掲載されているNode.jsのhello worldコンテナ化のサンプルを手始めに使用します。

Dockerfile、package.json、server.js のソースを Node.js のウェブサイトからコピーするか、このGitHubリポジトリから zip でダウンロードします。

クローンした git リポジトリに追加し、コミットします。

Googleコンテナレジストリの設定

ここで、Google Container Registryのダッシュボードにアクセスします。

特定のプロジェクトの選択を求められたら、使用するプロジェクトを選択します。

Container Registry API を使用したことがない場合は、有効にするように求められるかもしれません。

すべてを設定して有効にすると、イメージの空のリストが表示されます。

3.png

これは後々のためにメモしておきましょう。このイメージレジストリを使用するには、以下のようにイメージをタグ付けしなければなりません。

gcr.io/<your_project_id>/<image_name>:<tag>

Google Cloud Buildの設定

Google Cloud Build ダッシュボードにアクセスし、まだ使用したことがない場合は「Enable」ボタンをクリックします。「ビルド」またはワークフロー実行の空リストが表示されます。

4.png

Google シークレットマネージャー

これでほぼ完了です。あとはGoogleシークレットマネージャーのダッシュボードに移動して、そのAPIを有効にするかどうかを聞かれたら、もう一度クリックしてください。

次に、右上の「Create credentials」をクリックします。

最後に、Cloud IAMページのダッシュボードを開きます。

まだ選択されていない場合は、プロジェクトを開きます。

パーミッションテーブルの中で、「@cloudbuild.gserviceaccount.com」が含まれているものを探し、右の鉛筆アイコンをクリックします。

5.png

ロールの追加をクリックします。

6.png

"Secret Manager Accessorロール "を選択します。

そして、"保存 "をクリックします。

ベースとなるCloud Buildのワークフローを設定する

イメージスキャンのクラウドビルドのワークフローを作成するための準備が整いました。最初のイテレーションでは、イメージをビルドしてプッシュするだけです。そのためには、プロジェクトのルートディレクトリに cloudbuild.yaml ファイルを作成し、以下のコードを貼り付けます。

steps:
- name: 'gcr.io/cloud-builders/docker'
  args: ['build', '-t', '${_IMAGE_URL}:${_IMAGE_TAG}', '.']
- name: 'gcr.io/cloud-builders/docker'
  args: ['push', 'gcr.io/${_IMAGE_URL}:${_IMAGE_TAG}']
substitutions:
  _IMAGE_URL: 'gcr.io/<your_project_id>/<image_name>'
  _IMAGE_TAG: 'latest'
timeout: 900s 

Cloud Buildワークフローの各ステップでは、コンテナイメージを使用して、通常は引数(args:)を介してカスタマイズしたアクションを実行します。

この場合、Dockerコマンドラインツールでイメージを使用して、最初にビルドしてからプロジェクトのコンテナイメージをプッシュします。両方のアクションを行うために単一のステップを使うこともできますが、後からステップを挿入したいと思います。

また、イメージのタグと名前 (_IMAGE_URL, _IMAGE_TAG) には変数置換を使用しています。これにより、他のプロジェクトでワークフローを再利用したり、別の種類のレジストリを使用したりすることが容易になります。

<your_project_id>と<image_name>を自分の値に変更することを忘れないでください。

最後に、すべてのステップを完了するのに十分な時間をパイプラインに与えるために、タイムアウトを900秒に増やしました。

コミットして、変更をリポジトリにプッシュします。

クラウドビルドのワークフローをトリガーする

ワークフローが定義されました。ここでは、マスターブランチへのプッシュごとに実行されるようにトリガーを設定します。これには、以下のようにします。

Cloud Buildコンソールにアクセスし、"Triggers "をクリックします。

「リポジトリー」で、この例で使用しているものを探します。

右側にある「3つの点」を押してメニューを表示します。

7.png

そして、"トリガーの追加 "を選択します。

8.png

トリガー設定のデフォルト値は、この例では機能します。マスターブランチにプッシュすると、ワークフローが実行されます。

トリガーの名前と説明を指定して "Create "を押すだけです。

ビルドの手動実行をトリガーにして、ワークフローをテストしてみましょう。

先ほど作成したトリガーの横にある「Run trigger」ボタンを探します。それを押します。

9.png

これでワークフローが実行されます。左メニューの "History "をクリックして、ワークフローの実行ログを確認してください。数分後に正常に終了し、新しいイメージがレジストリにあるはずです。新しいイメージがない場合は、ログを確認し、エラーメッセージが出ていないかどうかを確認してください。

10.png

これですべてが正しく設定されていることがわかりましたが、このイメージはスキャンされておらず、安全でない可能性があることを覚えておいてください。これを修正しましょう。

Sysdig APIトークンの取得と保存

ビルドにイメージスキャンステップを追加する前に、イメージスキャンランタイムとSysdigアカウントをリンクする必要があります。Sysdig APIトークンが必要です。

それを見つけるには:

  • Sysdig Secure ダッシュボードにアクセスします。
  • プロフィールをクリックします。
  • "Settings "を選択します。
  • 最初の設定ページに表示されます。

ワークフローに直接書くのではなく、Sysdig APIトークンを保存するためのシークレットを作成してみましょう。コードに書いてしまうと漏れてしまう可能性があります。作成するには

Googleのシークレットマネージャーページのダッシュボードに移動します。

"Create secret "を押します。

11.png

名前を追加します。この例では sysdig_token を使用します。

設定ページからコピーした値を貼り付けます。

「Create secret」を押して終了です。

イメージスキャンステップの追加

では、cloudbuild.yamlファイルにイメージスキャンのステップを追加してみましょう。

steps:
- name: 'gcr.io/cloud-builders/docker'
  args: ['build', '-t', '${_IMAGE_URL}:${_IMAGE_TAG}', '.']
- name: gcr.io/cloud-builders/gcloud
  entrypoint: 'bash'
  args: [ '-c', "gcloud secrets versions access latest --secret=sysdig_token --format='get(payload.data)' | tr '_-' '/+' | base64 -d > decrypted-data.txt" ]
- name: 'sysdiglabs/secure-inline-scan'
  entrypoint: 'bash'
  args: [ '-c', '/bin/inline_scan.sh analyze -k $(cat decrypted-data.txt) ${_IMAGE_URL}:${_IMAGE_TAG}' ]
- name: 'gcr.io/cloud-builders/docker'
  args: ['push', 'gcr.io/${_IMAGE_URL}:${_IMAGE_TAG}']
substitutions:
  _IMAGE_URL: 'gcr.io/<your_project_id>/<image_name>'
  _IMAGE_TAG: 'latest'
timeout: 900s 

cloud-builders/gcloud ステップでは、sysdig_token のシークレットを読み取り、復号化されたdata.txt ファイルに保存します。

sysdiglabs/secure-line-scan ステップは、Sysdig Secure を使用してイメージスキャンを実行します。これは、復号化されたdata.txtファイルからシークレットを読み取ります。このステップは、イメージをイメージリポジトリにプッシュする前に実行されることに注意してください。

変更をコミットし、gitリポジトリのmasterブランチにプッシュします。

Google Cloud Build の動作中のイメージスキャン

変更をマスターにプッシュすると、Cloud Buildダッシュボードの「履歴」セクションに新しいエントリが表示されます。これにより、ワークフローからの4つのステップを含む新しいパイプラインの実行が自動的にトリガーされました。

完了するまで数分待ちます。すべてが計画通りに進めば、すべてのステップが緑色になっているはずです。

12.png

同じビルドで、3 番目のステップをクリックして、ログの最後までスクロールします。

13.png

そこにある Sysdig Secure ダッシュボードへのリンクをたどって、スキャンのレポートを読みます。

14.png

レポートを見ると、イメージに複数の脆弱性が確認されていますが、それでもパイプラインは成功しています。

脆弱性が見つかった場合にビルドを中断するように、イメージスキャンのポリシーを更新してみましょう。

Sysdigでイメージスキャンポリシーを更新する

イメージスキャニングポリシーを変更するには、Sysdig Secure インターフェースから起動します。

"Image Scanning"、"Scanning policies"、"Policies "に移動します。

一般的なセキュリティの脅威や不正行為を検出するためのデフォルトの設定済みポリシーと、PCI DSS NIST 800-190 などの特定のセキュリティ基準のリストが表示されます。

15.png

これらのポリシーは、複雑なセキュリティ基準を調べなくても、すぐに利用することができます。イメージスキャンとポリシーの詳細については、Sysdigのドキュメントをご覧ください。

「Default Policy」をクリックして編集します。Dockerfile命令の欠如、ポート22の公開、深刻度の高いパッケージの脆弱性の検出などを検出するための「ゲート」のリストが表示されます。

16.png

"Package "の "Vulnerabilities "ゲートで、"severity high and a fix available "を見つけてください。

その動作を "Warn "から "Stop "に変更します。

"Save" をクリックします。

これにより、深刻度の高いリスクを持つビルドが停止され、脆弱なイメージがレジストリに入るのを防ぐことができます。

このポリシーはパイプラインの先を保護します。Sysdig Secure イメージアナライザーは、実行中のイメージを継続的にスキャンし、Sysdig Secure Kubernetes アドミッションコントローラは、CI/CD パイプラインではない可能性のあるあらゆるソースからインフラストラクチャーに直接入ってくるイメージを評価してスキャンします。これらは、Google Cloud Buildのワークフローでイメージスキャンを補完する優れたツールです。

ビルドを中断して修正する

イメージスキャンレポートに戻ると、「Failed」の状態に変わっているはずです。これは、すでにスキャンされたイメージにポリシーの変更が反映されていることを示しています。

17.png

手動でパイプラインを再度トリガーすると、イメージスキャンのステップで停止するようになりました。

18.png

これは良いことです。脆弱性のあるイメージの公開を防ぐことができました。

さて、このイメージを修正するにはどうしたらいいでしょうか?

この例の問題はベースイメージにありますが、これは理想的ではありません。より安全なベースイメージを使用します。

Dockerfileを編集し、node:12をbitnami/nodeに変更します。

保存してコミットし、変更をプッシュします。すべての手順が再び緑色になるはずです。

19.png

イメージスキャンのベストプラクティスとして、イメージの内容を必要なものだけに減らし、何も知らないベースイメージを使用しないようにすることが挙げられます。Google Cloud ビルドでイメージスキャンを行うことで、このような設定ミスに起因するセキュリティ上の脅威を防ぐことができます。

まとめ

Googleは、Google Cloud Build、Google Cloud Registry、Google Cloud Repository、Google Secret Managerを含むCI/CDのための完全なエコシステムを提供しています。Sysdig Secureイメージスキャンは、いくつかの利点をもたらします。

  • CI/CDパイプラインでのイメージスキャンは、脆弱なイメージがレジストリに到達するのを防ぎます。
  • インラインスキャンでは、プロプライエタリなソースコードや漏洩したクレデンシャルのようなイメージコンテンツはパイプライン内に残ります。解析のメタデータのみがイメージ スキャナのバックエンドに送信されます。
  • ポリシーが変更された場合、解析メタデータは再評価されます。イメージを再スキャンする必要はありません。

Sysdig Secureは、様々なコンテナコンプライアンス基準(PCI DSSやNIST 800-190など)を施行し、遵守するために、すぐに使えるポリシーを提供します。

また、Sysdig Secureイメージスキャンは、JenkinsBambooAzure PipelinesAWS CodePipelinesなど、ほとんどのCI/CDパイプラインツールとシームレスに統合することができます。

イメージのスキャンにSysdig Secureを使用していない場合は、今すぐお試しください。

ご質問・お問い合わせはこちら

top