🛡️

Cloud Build Security Insights を試してみる

2023/02/13に公開

こんにちは。
クラウドエースの梅田です。

2022年10月に Cloud Build Security Insights という機能がプレビューとなりました。
本記事では、Supply-chain Levels for Software Artifacts (SLSA) に注目しながら Cloud Build Security Insights で何ができるのかを説明していきたいと思います。

Supply-chain Levels for Software Artifacts (SLSA) とは

そもそも SLSA とは何かを確認したいと思います。
SLSA とはソフトウェアサプライチェーン (ソフトウェアの開発から顧客が使うまでの一連の流れのこと)を保護するためのフレームワークのことです。

SLSA ではソフトウェアサプライチェーンの中で対策すべき箇所を下図のように示しています。


引用元:https://slsa.dev/spec/v0.1/threats

SLSA レベル

SLSA では上記箇所の対策度合いに応じて SLSA レベルというものを定義しています。
SLSA レベルは以下4段階に定義されています。

Level 説明
1 ビルド プロセスは完全にスクリプト化/自動化され、来歴を生成する必要があります。
2 バージョン管理と、認証された来歴を生成するホストされたビルド サービスを使用する必要があります。
3 ソースとビルドのプラットフォームは、ソースの監査可能性と来歴の完全性をそれぞれ保証する特定の基準を満たしています。
4 すべての変更を 2 人でレビューし、密閉された再現可能なビルド プロセスが必要です。

引用元:https://slsa.dev/spec/v0.1/levels

Cloud Build Security Insights とは

Cloud Build Security Insights では Cloud Build で生成されたアーティファクトのセキュリティ分析情報を表示することが可能です。
具体的には以下のセキュリティ分析情報を表示してくれます。

項目 詳細
SLSA SLSA レベルの表示
脆弱性 アーティファクトで見つかった脆弱性の概要と Container Analysis のデータの表示
ビルドの詳細 Build ログへのリンクやビルド時刻の表示
ビルドの来歴 アーティファクトをビルドした際の入力ソースの場所、ビルド引数、ビルド時間などの詳細なメタデータをJSONで表示

引用元: https://cloud.google.com/build/docs/view-build-security-insights

Cloud Build Security Insights を触ってみる

以上を踏まえて、早速 Cloud Build Security Insights の機能を確認したいと思います。
サンプルコンテナのイメージを作成し、作成したコンテナのセキュリティ分析情報を確認していきます。

Cloud Build で サンプルコンテナをビルドする

サンプルコンテナは以下リンク先の手順を参考に進めていきます。

https://cloud.google.com/build/docs/build-push-docker-image?hl=ja

前提作業

サンプルコンテナビルドの前提作業として、以下手順により Google Cloud プロジェクト作成、課金の有効化、及び必要な API を有効化します。

  1. 以下リンク先の「始める前に」を参照して Google Cloud プロジェクトの選択もしくは作成と、課金の有効化、Cloud Build API と Artifact Resistry API を有効化していること。

https://cloud.google.com/build/docs/build-push-docker-image?hl=ja#before-you-begin

  1. 以下リンク先の「脆弱性スキャンを有効にする」を参照して Container Scanning API を有効にする。

https://cloud.google.com/build/docs/view-build-security-insights?hl=ja#enable_vulnerability_scanning

サンプルコンテナをビルドする

以下手順によりサンプルコンテナを Cloud Build によりビルドします。

  1. コンソール 画面右上のアイコンから Cluod Shell を立ち上げる。

  2. quickstart-dockerという名前で新しいディレクトリを作成し、作成したディレクトリに移動する。

    mkdir quickstart-docker
    cd quickstart-docker
    
  3. quickstart.sh を作成する。

    echo "echo Hello, world! The time is \$(date)." > quickstart.sh
    
  4. quickstart.shを実行可能にする。

    chmod +x quickstart.sh
    
  5. Dockerfileを作成する。

    cat << EOS > Dockerfile
    FROM alpine
    COPY quickstart.sh /
    CMD ["/quickstart.sh"]   
    EOS
    
  6. Artifact Resistry で Docker リポジトリを作成する。

    gcloud artifacts repositories create quickstart-docker-repo --repository-format=docker \
     --location=us-west2 --description="Docker repository"
    
  7. リポジトリが作成されたことを確認する。

    gcloud artifacts repositories list
    

    以下のように表示されればOK。

    ARTIFACT_REGISTRY
    REPOSITORY: quickstart-docker-repo
    FORMAT: DOCKER
    MODE: STANDARD_REPOSITORY
    DESCRIPTION: Docker repository
    LOCATION: us-west2
    LABELS:
    ENCRYPTION: Google-managed key
    CREATE_TIME: ****
    UPDATE_TIME: ****
    SIZE (MB): 0
    
  8. cloudbuild.yamlを作成する。
    この時、ビルドするイメージに来歴メタデータを付与するために、requestedVerifyOption: VERIFIEDオプションを付与する(参考手順には無い手順)。

    cat << EOS > cloudbuild.yaml
    steps:
    - name: 'gcr.io/cloud-builders/docker'
      args: [ 'build', '-t', 'us-west2-docker.pkg.dev/\$PROJECT_ID/quickstart-docker-repo/quickstart-image:tag1', '.' ]
    images:
    - 'us-west2-docker.pkg.dev/\$PROJECT_ID/quickstart-docker-repo/quickstart-image:tag1'
    options:
      requestedVerifyOption: VERIFIED
    EOS
    
  9. ビルドを開始する。

gcloud builds submit --region=us-west2 --config cloudbuild.yaml

ビルドログが表示されるが、最終的に以下のようにSTATUS: SUCCESSと表示されればOK。

ID: af497ada-25bf-4eeb-b75b-1bd4bc49ddca
CREATE_TIME: 2023-02-03T01:12:21+00:00
DURATION: 18S
SOURCE: gs://ca-umeda-cb-sec-insights-test_cloudbuild/source/1675386738.   141358-06ae1136849141e3a87ea92b95411ee0.tgz
IMAGES: us-west2-docker.pkg.dev/ca-umeda-cb-sec-insights-test/quickstart-docker-repo/   quickstart-image:tag1
STATUS: SUCCESS

出力内容の確認

以下手順によりサンプルコンテナのセキュリティ分析情報を確認します。

  1. コンソールの検索から Cloud Build を開く。

  2. us-west2リージョンを選択し、先の手順でビルドしたビルド名を押下する。

  3. 「ビルドアーティファクト」 を選択し、「表示」を押下する。

  4. セキュリティ分析情報が表示されることを確認する。

    セキュリティ分析情報結果より SLSA レベル3を満たしていることが確認出来ます。おさらいですが、SLSA レベル3は以下の基準を満たしていることが保証されます。

    ソースとビルドのプラットフォームは、ソースの監査可能性と来歴の完全性をそれぞれ保証する特定の基準を満たしています。

    また、Cluod Build の公式ドキュメントにも、以下のように SLSA レベル3をサポートしていると明記されています。

    Cloud Build は、Software Artifacts のサプライ チェーン レベル(SLSA)レベル 3 の保証を満たすビルド場所の生成をサポートしています。

付録 検証事項

来歴メタデータを付与しないとどうなるか

以下のような来歴メタデータを付与しないビルド設定でビルドを実施した場合どのようになるかを確認したいと思います。

cluodbuild.yaml
steps:
- name: 'gcr.io/cloud-builders/docker'
  args: [ 'build', '-t', 'us-west2-docker.pkg.dev/\$PROJECT_ID/quickstart-docker-repo/quickstart-image:tag1', '.' ]
images:
- 'us-west2-docker.pkg.dev/\$PROJECT_ID/quickstart-docker-repo/quickstart-image:tag1'

結果としては、来歴が不明であるため SLSA レベル3の基準を満たせないため SLSA レベルは不明となることが確認できました。

まとめ

Cloud Build Security Insights 機能により Cloud Build でビルドしたコンテナの SLSA レベルを確認出来ました。
近年 ソフトウェアサプライチェーン攻撃が増加しており、
Google Cloud としても Software Delivery Shield という枠組みでソフトウェアサプライチェーンの保護を強化しています。
この機会にCloud Build Security Insights 機能を試してみてはいかがでしょうか。

参考リンク

https://cloud.google.com/build/docs/view-build-security-insights?hl=ja

https://slsa.dev/

https://github.com/slsa-framework/slsa

https://security.googleblog.com/2021/06/introducing-slsa-end-to-end-framework.html

https://security.googleblog.com/2022/04/how-to-slsa-part-2-details.html

Discussion