ブログ | XIMIX

Artifact Analysisでアプリケーションの脆弱性対応

作成者: XIMIX 江口|2023.12.10

日本情報通信の江口です。

本記事はNI+C TeamGCP Advent Calendar 2023 11日目の記事となります。

はじめに

Google Cloud Platform上でアプリケーションの資材を取り扱う場合には、Artifact Registryを用いたパッケージ管理がベストプラクティスとして提示されています。
※ 従来は Container Registryが使われていましたが、2023年5月15日よりContainer Registryは非推奨です。まだ移行をしていない場合には、Container RegistryからArtifact Registryへ移行するを参考に、早めの対応を行いましょう。

Dockerイメージ化したアプリケーションを保存して、GKE上でコンテナアプリケーションとして動かしたり、Cloud Runで稼働させたり、という使い方になります。
このパッケージ管理において、脆弱性検知を行ってくれるのが、Artifact Analysisです。

Artifact Analysisとは

Artifact Registryで管理される、DockerイメージやMavenのパッケージなどについて、依存関係やメタデータを取得し、脆弱性スキャンを行うサービスです。従来提供されていたContainer AnalysisがContainer Registry向けのものでしたが、それのArtifact Registry版ということになります。ここでは主に脆弱性スキャンについて取り上げます。

こちらが、alpine:3.14のDockerイメージに対してArtifact Analysisがスキャンをかけた結果です。公開されているCVE情報に基づいて各種情報が提示されています。


使用可能な修正で修正版があるのかどうか、修正を表示 で、修正が適用されているバージョンも示されるので対応が分かりやすいのもよいところです。

利用方法

脆弱性のスキャン方法としては、Artifact Registryに資材を配置した際の自動スキャンと、任意のタイミングで任意の資材に対する オンデマンドスキャンがサポートされています。
環境に応じて、使いやすいほうを取り入れるのが良いでしょう。

自動スキャン

Container Scanning API を有効化することで利用可能です。あとはArtifact Registryに資材を配置すると、その都度スキャンが自動的に実行されます。スキャン結果は上記画像のようにGUIで確認できます。

手動スキャン

On-Demand Scanning APIを有効化したうえで、CLIから実行可能です。
この際、実行する環境にはgcloud SDKが入っているだけでは足りず、local-extractというコンポーネントの追加インストールが必要です。

インストール方法

Debian/Ubuntuの場合
$ sudo apt install google-cloud-sdk-local-extract
Red Hat/Fedora/CentOSの場合
$ sudo dnf install google-cloud-sdk-local-extract

オンデマンドスキャンとスキャン結果の出力

まずはスキャンを実施します。# IMAGE_URIには資材ファイルを指定
## 例) alpine:3.14
$ gcloud artifacts docker images scan IMAGE_URI [--location=(us,europe,asia)] [--async]

資材が既にArtifact Registryなどに配置されており、CLI実行環境にない場合には、--remote` オプションが必要です

# IMAGE_URLには資材へのフルパスが必要
## 例) asia-northeast1-docker.pkg.dev/sample-project/sample-repository/alpine:3.14
$ gcloud artifacts docker images scan IMAGE_URI \
    --remote [--location=(us,europe,asia)] [--async]

スキャンが成功すると、以下のように完了の旨が出力されます。
✓ Scanning container image
  ✓ Locally extracting packages and versions from local container image
  ✓ Remotely initiating analysis of packages and versions
  ✓ Waiting for analysis operation to complete [projects/sample-project/locations/us/operations/87d2e137-1d1c-4790-8e5e-daf6c96ae7d7]
Done.
done: true
metadata:
  '@type': type.googleapis.com/google.cloud.ondemandscanning.v1.AnalyzePackagesMetadata
  createTime: '2021-01-05T23:03:04.185261Z'
  resourceUri: ubuntu:latest
name: projects/sample-project/locations/us/operations/87d2e137-1d1c-4790-8e5e-daf6c96ae7d7
response:
  '@type': type.googleapis.com/google.cloud.ondemandscanning.v1.AnalyzePackagesResponse
  scan: projects/sample-project/locations/us/scans/2fe2bfb8-f0c5-4dd6-a8c8-38961869767a
response.scanが脆弱性スキャンの結果を保持していますので、この結果を以下のように出力します

$ SCAN_NAME="projects/sample-project/locations/us/scans/2fe2bfb8-f0c5-4dd6-a8c8-38961869767a"
$ gcloud artifacts docker images list-vulnerabilities ${SCAN_NAME}

脆弱性が検知された場合には、以下のように出力されます。
 createTime: '2021-01-05T23:05:42.956227Z'
kind: VULNERABILITY
name: projects/sample-project/locations/us/occurrences/f82a1efd-a261-4973-acbd-f9854d8b8135
noteName: projects/goog-vulnz/notes/CVE-2018-1000654
resourceUri: ubuntu:latest
updateTime: '2021-01-05T23:05:42.956227Z'
vulnerability:
  cvssScore: 7.1
  cvssv3:
    attackComplexity: ATTACK_COMPLEXITY_LOW
    attackVector: ATTACK_VECTOR_NETWORK
    availabilityImpact: IMPACT_HIGH
    baseScore: 7.2
    confidentialityImpact: IMPACT_HIGH
    exploitabilityScore: 1.2
    impactScore: 5.9
    integrityImpact: IMPACT_HIGH
    privilegesRequired: PRIVILEGES_REQUIRED_HIGH
    scope: SCOPE_UNCHANGED
    userInteraction: USER_INTERACTION_NONE
  effectiveSeverity: MEDIUM

料金

自動スキャン、オンデマンドスキャンいずれでも、基本的な考え方は公式ドキュメントの通りです。

 料金はスキャンするコンテナ イメージあたり $0.26 

ただし、自動スキャンの場合、同一イメージ(同じダイジェストを持つイメージ)に対するスキャンは1回目のみ課金されます。

CICDとの統合

都度手動で脆弱性スキャンを行ってもよいですが、CICDパイプラインを回している環境であればそこに脆弱性スキャンも統合していくことをGoogle Cloudとしても推奨しています。
 

  1. ビルドして資材を作成
  2. 作成した資材に対するArtifact Analysisでの脆弱性スキャン(オンデマンドスキャン)。脆弱性が見つかったらパイプラインは失敗にする
  3. Artifact Registryに資材をpush
  4. GKEのワークロードの更新、Cloud Runのデプロイ等によるアプリケーション更新
さらに、Binary Authorizationにより、「信頼した資材だけをデプロイ可能にする」という構成を取れば、「CICDパイプラインを経て、脆弱性スキャンをクリアして配置された資材だけをデプロイ許可する」ということができます。これにより、信頼性の高いデプロイを実現できます。

Artifact Analysisのドキュメントでもこの構成が示されています。



まとめ


脆弱性への対応は、システム開発においていつまでも終わることのない課題です。それだけに、GoogleCloudとしても統合的なサービスを提供しています。ご自身の環境に合う部分をうまく取り入れてもらえればと思います。

参考


- Scan images for OS vulnerabilities on demand | Google Cloud
- Artifact Analysisの料金 | Google Cloud
- Artifact Analysis と脆弱性スキャン | Google Cloud

 

Google Cloud、Google Workspace に関するご相談はXIMIXへ!

Google Cloud、Google Workspaceに関する お問い合わせはこちら